解析SpringBoot的自动配置
解析SpringBoot的自动配置
大家都知道使用SpringBoot要在启动类加上@SpringBootApplication注解。那么该注解有哪些作用呢,为什么加了该注解,SpringBoot就会帮我们将组件注入到容器中?我们不妨点击这个类查看一下SpringBoot的源码。看到该注解是一个组合注解:
上面几个元注解我们就不用看了,我们来关注下面的几个注解
[email protected]
这又是一个复合注解,有@Configuration注解标识的类则表示该类是一个配置类
2@EnableAutoConfiguration注解
这是SpringBoot自动配置的关键所在,字面意思是开启自动配置,该注解是怎样工作的呢,不妨点进去看一下发现以下内容:
我们关注红色区域的注解
[email protected]AutoConfigurationPackage注解
看到该注解也是组合注解,有一个@Import注解,点击查看Register类里面有一个方法:,我们打一个断点在以下位置,看看注入了哪些类到容器,通过程序调试看到packageNames的结果为以下图中的result:com.xy.autoconf,该包即为主配置类所在的包,故我们可以得到SpringBoot会把主配置类所在的包极其子包下的类注入到Spring容器中。我们将自定义的JavaBean也要放到这个位置就能被Spring容器加载
[email protected]注解
这又是一个组合注解,注意到@Import注解,该注解是Spring底层的一个注解,作用就是将JavaBean注入到Spring容器,既然是注入到容器,那我们就来看一下是注入了那些JavaBean到容器,点击进入EnableAutoConfigurationImportSelector(选择将哪些组件注入到容器的选择器)
看到EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector类,该类有一个
方法,我们注意到红色标记的方法 this.getCandidateConfigurations(annotationMetadata, attributes);点击进去看到
继续进入看到该方法的第一个参数就是EnableAutoConfiguration.class,继续点击进入该方法
看到资源名字是类路径下面的META_INF/spring.factory文件,分析此段代码我们不难得出结论:SpringBoot会加载类路径下的META_INF/spring.factory文件并从中获取EnableAutoConfiguration指定的值作为组件注入到Spring容器。我们可以进入到依赖的一个jar,看到以下配置,该部分就是SpringBoot要自动注入到容器的JavaBean
为了验证是否正确,我们可以在以下位置打一个断点调试,发现:
configurations大小为96,集合内都是要注入到Spring容器的组件的全类名,这些类都是以xxxAutoConfiguration结尾,验证了我们的结论。
3运用
有了以上结论,我们现在来进入一个xxxxAutoConfiguration,这里就来就来看我们熟悉的DataSourceAutoConfiguration
满足SringBoot的自动配置条件
我们关注红色区域的注解点击进入DataSourceProperties
看到ConfigurationProperties,该注解就是将配置文件的配置与该类的属性值进行绑定,我们在配置文件就可以用spring.datasource.xxx配置dataSource的参数值。
以上以上就是SpringBoot的自动配置详细解析