前言

一些朋友问我怎么读源码,这篇文章结合我看源码时候一些思路给大家聊聊,我主要从这三个方向出发:

  1. 确定目标,这个目标要是一个具体,不要一上来我要看懂Spring,这是不可能的,目标要这么来定,比如看懂Spring Boot的自动装配、Spring IOC XML加载流程等等,尽量小,能够快速搞定的,不要目标太大,陷入其中,反而效果不好;
  2. 学会猜,这个猜字其实很有精华,这个可能需要大家积累一段时间才能猜的很准,高手其实都是用猜的,我还没有达到这个境界,但是也是稍微有了一些门道,这个第二点看能力可适当应用;
  3. 学会看堆栈信息,这个其实很重要,刚开始看源码的时候可能是很重要的手段,一下基本上就可以看到很多很多步骤,到时候可以进行反推理;
    接下来给大家演示一下,我是怎么来看Spring Boot自动装配的,希望大家能有些收获!

确定目标

看Spring Boot的自动装配流程,这个目标是个具体目标,为什么说他是一个具体目标,这里我们来思考一下,在Spring时代我们都是用配置文件来搞定的,到了Spring Boot时代我们就可以摆脱了配置,我们的目标就是看明白Spring Boot都是帮助我们做了什么,这里我们在把这个目标更具体一点,我们看一下Redis是怎么被Spring Boot自动装配的。首先我们先把Redis和Spring Boot整合起来,看一下整合过程。


上面我们确定了目标并且完成整合,我们在程序中唯一看到就是@SpringBootApplication这个注解,那我们就跟着注解看下去,这里就开始猜的精华了。


重点部分就是红色标注的部分,接下来我们继续往下看,

这个@Import注解也是最重要的部分,我们接下来继续往下看,

在AutoConfigurationImportSelector这个类中有getAutoConfigurationEntry这个方法,看这个方法的英文解释是,大致上是基于@Configuration注解返回自定义的实体AutoConfigurationEntry,感觉好像我们猜对了,看见我标注断点的地方getCandidateConfigurations这个方法,接下来我们继续往下走一走;



我们看到是加载一个配置文件地址,接下来我们去看一下配置文件中有什么东西,


在这个配置文件中我们看到了RedisAutoConfiguration,看到这里我推测可能我猜的比较正确,我们看下整个类;

主要看标红的地方,@EnableConfigurationProperties这个注解是导入配置注解,@Import这个注解是连接池配置信息,@Bean是Bean配置信息的导入,到这个地方我们基本上我们已经完成自己的猜测,接下来我们就进行验证;

如上图,我们猜测和验证已经吻合,这个时候我们已经可以得出Spring Boot自动加载原理,总结一下:
@SpringBootApplication等同于下面三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能。

学会看堆栈信息

验证完成以后我们再来深挖一下底层一些东西,我们来看下调用的堆栈信息;


红色标注地方,我们看到一个相对比较熟悉的方法refresh,然后继续看堆栈信息通过调用invokeBeanFactoryPostProcessors方法,通过看注释该处是执行BeanFactoryPostProcessor接口,有文章介绍过BeanFactoryPostProcessor这个接口,

大家可以去查看一下这篇文章,这里就不进行介绍了,我们继续看堆栈信息,

接下来我们看到ConfigurationClassPostProcessor类中的processConfigBeanDefinitions方法,该类继承结构如下

断定该类主要就是向容器中注入Bean信息,继续向下看堆栈信息,发现通过调用该parse方法,最终解析在ConfigurationClassParser类中完成,

完成各种配置解析,我们重点关注下deferredImportSelectorHandler的process方法,


processGroupImports方法通过遍历DeferredImportSelectorGrouping,该类是个静态的匿名类,内部实现迭代方法,

接下来看AutoConfigurationImportSelector的process方法,

这里重点就来了,这里就将开始断点的调用链串连起来了,相信大家看到这里已然无惑。

结束

欢迎大家加群438836709!欢迎大家关注我!

Spring Boot自动装配的更多相关文章

  1. Spring Boot 自动装配(二)

    目录 目录 前言 1.起源 2.Spring Boot 自动装配实现 2.1.@EnableAutoConfiguration 实现 2.1.1. 获取默认包扫描路径 2.1.2.获取自动装配的组件 ...

  2. Spring Boot自动装配原理源码分析

    1.环境准备 使用IDEA Spring Initializr快速创建一个Spring Boot项目 添加一个Controller类 @RestController public class Hell ...

  3. Spring Boot 自动装配流程

    Spring Boot 自动装配流程 本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程. Spring Boot 发现自动配置类 这 ...

  4. Spring Boot系列(二):Spring Boot自动装配原理解析

    一.Spring Boot整合第三方组件(Redis为例) 1.加依赖 <!--redis--> <dependency> <groupId>org.springf ...

  5. Spring Boot 自动装配原理

    Spring Boot 自动装配原理 Spring Boot 在启动之前还有一系列的准备工作,比如:推断 web 应用类型,设置初始化器,设置监听器,启动各种监听器,准备环境,创建 applicati ...

  6. Spring Boot 自动装配(一)

    目录 目录 前言 1.起源 2.Spring 模式注解 2.1.装配方式 2.2.派生性 3.Spring @Enable 模块驱动 3.1.Spring框架中@Enable实现方式 3.2.自定义@ ...

  7. 深度剖析Spring Boot自动装配机制实现原理

    在前面的分析中,Spring Framework一直在致力于解决一个问题,就是如何让bean的管理变得更简单,如何让开发者尽可能的少关注一些基础化的bean的配置,从而实现自动装配.所以,所谓的自动装 ...

  8. 从源码中理解Spring Boot自动装配原理

    个人博客:槿苏的知识铺 一.什么是自动装配 SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factori ...

  9. spring boot 自动装配的原理

    参考: https://blog.csdn.net/Dongguabai/article/details/80865599.如有侵权,请联系本人删除! 入口: import org.springfra ...

随机推荐

  1. win10 uwp 发布旁加载自动更新

    在很多企业使用的程序都是不能通过微软商店发布,原因很多,其中我之前的团队开发了很久的应用,结果发现没有用户能从微软应用商店下载所以我对应用商店没有好感.但是作为一个微软粉丝,怎么能不支持 UWP 开发 ...

  2. http header详解,HTTP头、请求头、响应头、实体头

    Content-Language,Content-Length,Content-Type,Content-Encoding,mime分析 Accept 指定客户端能够接收的内容类型 Accept:te ...

  3. Linux 内核硬件抽象

    我们结束 PCI 的讨论, 通过快速看一下系统如何处理在市场上的多种 PCI 控制器. 这只 是一个信息性的小节, 打算来展示给好奇的读者, 内核的面向对象分布如何向下扩展到最 低层. 用来实现硬件抽 ...

  4. 2018-11-13-WPF-禁用实时触摸

    title author date CreateTime categories WPF 禁用实时触摸 lindexi 2018-11-13 10:45:37 +0800 2018-5-4 21:0:3 ...

  5. EasyMock.replay()有什么用

    现在很多项目都使用EasyMock来作为单元测试框架. EasyMock一个方法,基本上是三步:EasyMock.expect().EasyMock.replay().EasyMock.verify( ...

  6. vue学习笔记(六)表单输入绑定

    前言 在上一章vue学习笔记(四)事件处理器这一篇博客的内容中,我们已经了解vue是如何绑定事件的,而本篇博客主要讲解的是vue中表单输入的绑定,通常我们自己提交信息的时候都是通过表单将信息到服务器的 ...

  7. 嗨,让我带你逐行剖析Vue.js源码

    本项目受到了阮一峰老师的肯定,已刊登在阮一峰老师微信公众号的科技爱好者周刊第87期,同时也被多个微博大V转发,短短一个月时间内在github上star数量就已经突破2k! Hello,大家好,我最近在 ...

  8. 洛谷$P$1486 郁闷的出纳员 $[NOI2004]$ $splay$

    正解:$splay$ 解题报告: 传送门! 依然先考虑要呲呲些什么操作鸭$QwQ$ 其实就只要一个删除区间,一个查询第$k$大,还一个插入就欧克? 删除区间的话直接旋转下根什么的然后直接把子树删了就好 ...

  9. 日期格式化使用 YYYY-MM-dd 的潜在问题

    昨天在v站上看到这个关于YYYY-MM-dd的使用而出现Bug的帖子(v2ex.com/t/633650)非常有意思,所以拿过来分享一下. 在任何编程语言中,对于时间.数字等数据上,都存在很多类似这种 ...

  10. idea2020注册码永久激活(激活到2100年)

    首先有图有真相: 资源链接: 链接:https://pan.baidu.com/s/1DPIllnyhc7H4qL2yQb0OvQ 提取码:lbjx 第一步:将bin目录下的三个文件拷贝到IDEA安装 ...