Spring Boot自动装配

简介: Spring Boot自动装配

一、前言


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

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


二、确定目标


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

1005447-20200120131221879-431373695.png

1005447-20200120131317035-1849186551.png


三、猜


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

1005447-20200120133222627-1620668397.png

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

1005447-20200120133911043-1867404377.png

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

1005447-20200120134510479-738508541.png

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

1005447-20200120140056705-1665443335.png

1005447-20200120140543682-1087152662.png

1005447-20200120140717898-840621632.png

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

1005447-20200120152727812-881282757.png

1005447-20200120152739962-1009399428.png

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

1005447-20200120194451136-1556695697.png

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

1005447-20200120195403171-716316832.png

如上图,我们猜测和验证已经吻合,这个时候我们已经可以得出Spring Boot自动加载原理,总结一下:

@SpringBootApplication等同于下面三个注解:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能。


四、学会看堆栈信息


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

1005447-20200120201824322-2057290927.png

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

1005447-20200120221352366-1109132541.png

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

1005447-20200120223258252-215787387.png

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

1005447-20200120224116016-489029494.png

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

1005447-20200120225324769-242197955.png

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

1005447-20200120232033270-1943062097.png

1005447-20200120232237980-786059191.png

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

1005447-20200120232849373-897947124.png

接下来看AutoConfigurationImportSelector的process方法,

1005447-20200120233620817-1015453448.png

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

 


相关文章
|
23天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
39 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
5月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
59 0
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
46 2
|
3月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
4月前
|
开发框架 Java 开发者
Spring Boot中的自动装配原理
Spring Boot中的自动装配原理
|
5月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
53 2
|
5月前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
59 2
|
5月前
|
Java Maven
springboot项目打jar包后,如何部署到服务器
springboot项目打jar包后,如何部署到服务器
409 1
|
5月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
52 1
|
4月前
|
Java 开发者 Spring
自动装配在Spring框架中的原理与实现方式
自动装配在Spring框架中的原理与实现方式