解析SpringBoot的自动配置

解析SpringBoot的自动配置

大家都知道使用SpringBoot要在启动类加上@SpringBootApplication注解。那么该注解有哪些作用呢,为什么加了该注解,SpringBoot就会帮我们将组件注入到容器中?我们不妨点击这个类查看一下SpringBoot的源码。看到该注解是一个组合注解:

解析SpringBoot的自动配置 

上面几个元注解我们就不用看了,我们来关注下面的几个注解

[email protected]

解析SpringBoot的自动配置

这又是一个复合注解,有@Configuration注解标识的类则表示该类是一个配置类

2@EnableAutoConfiguration注解

这是SpringBoot自动配置的关键所在,字面意思是开启自动配置,该注解是怎样工作的呢,不妨点进去看一下发现以下内容:

解析SpringBoot的自动配置

我们关注红色区域的注解

 

[email protected]AutoConfigurationPackage注解

解析SpringBoot的自动配置

看到该注解也是组合注解,有一个@Import注解,点击查看Register类里面有一个方法:解析SpringBoot的自动配置,我们打一个断点在以下位置,看看注入了哪些类到容器,通过程序调试看到packageNames的结果为以下图中的result:com.xy.autoconf,该包即为主配置类所在的包,故我们可以得到SpringBoot会把主配置类所在的包极其子包下的类注入到Spring容器中。我们将自定义的JavaBean也要放到这个位置就能被Spring容器加载

解析SpringBoot的自动配置

 

[email protected]注解

解析SpringBoot的自动配置

这又是一个组合注解,注意到@Import注解,该注解是Spring底层的一个注解,作用就是将JavaBean注入到Spring容器,既然是注入到容器,那我们就来看一下是注入了那些JavaBean到容器,点击进入EnableAutoConfigurationImportSelector(选择将哪些组件注入到容器的选择器)

看到EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector类,该类有一个

解析SpringBoot的自动配置

方法,我们注意到红色标记的方法 this.getCandidateConfigurations(annotationMetadata, attributes);点击进去看到

解析SpringBoot的自动配置

 

继续进入看到该方法的第一个参数就是EnableAutoConfiguration.class,继续点击进入该方法

解析SpringBoot的自动配置

看到资源名字是类路径下面的META_INF/spring.factory文件,分析此段代码我们不难得出结论:SpringBoot会加载类路径下的META_INF/spring.factory文件并从中获取EnableAutoConfiguration指定的值作为组件注入到Spring容器。我们可以进入到依赖的一个jar,看到以下配置,该部分就是SpringBoot要自动注入到容器的JavaBean

解析SpringBoot的自动配置

为了验证是否正确,我们可以在以下位置打一个断点调试,发现:

解析SpringBoot的自动配置

 

configurations大小为96,集合内都是要注入到Spring容器的组件的全类名,这些类都是以xxxAutoConfiguration结尾,验证了我们的结论。

3运用

有了以上结论,我们现在来进入一个xxxxAutoConfiguration,这里就来就来看我们熟悉的DataSourceAutoConfiguration

解析SpringBoot的自动配置

满足SringBoot的自动配置条件

解析SpringBoot的自动配置

我们关注红色区域的注解点击进入DataSourceProperties

解析SpringBoot的自动配置

看到ConfigurationProperties该注解就是将配置文件的配置与该类的属性进行绑定,我们在配置文件就可以用spring.datasource.xxx配置dataSource的参数值

以上以上就是SpringBoot的自动配置详细解析