自动配置(一)
自动配置的原理
@SpringBootApplication
SpringBoot的核心注解,注解了SpringBoot的启动类;
1.@SpringBootConfiguration
表示被注解的启动类是一个配置类,会被加入到spring容器中
2.@ComponentScan
告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。
@ComponentScan
这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan
的功能其实就是自动扫描并加载符合条件的组件(比如@Component
和@Repository
等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan
自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan
所在类的package进行扫描。
@Component
允许 Spring 自动检测自定义 Bean标注Spring管理的Bean,使用@Component
注解在一个类上,表示将此类标记为Spring容器中的一个Bean。
3.@EnableAutoConfigration
表示开启自动配置
@EnableAutoConfiguration中@Import(EnableAutoConfigurationImportSelector.class)是导入“能够自动配置的导入选择器”的;@AutoConfigurationPackage中@Import(AutoConfigurationPackages.Registrar.class)是导入“自动配置包”的。
这其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。就像一只“八爪鱼”一样,借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!
结合注释我们可以知道,@EnableAutoConfiguration注解是用于自动配置的,她能够自动配置spring容器的上下文信息,能够将bean节点加载到IOC容器中。
因为个人感觉@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读。大家是否还记得Spring框架提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
@EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。
(1).@AutoConfigurationPackage
该注解上有一个@Import(AutoConfigurationPackages.Registrar.class)
注解,其中 Registrar 类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。
(2).@Import(AutoConfigurationImportSelector.class)
其中AutoConfigurationImportSelector
类中有一个getCandidateConfigurations()
方法,该方法通过 SpringFactoriesLoader.loadFactoryNames()
方法查找位于 META-INF / spring.factories
文件中的所有自动配置类,并加载这些类。
spring.factories文件
是以key-value键值对的形式存储文件里,其中有一个key=EnableAutoConfiguration
,它对应的value值就是一个个以AutoConfiguration
结尾来命名的 xxxAutoConfiguration
自动配置类。
SpringFactoriesLoader是通过加载启动器中META-INF/spring.factories文件来实现自动配置的。
@EnableAutoConfigrationProperties(XxxxProperties.class)
表示开启这个bean的配置属性并是将这个bean注入到spring容器中
所以spring boot在整个的启动过程中,其实就是在类路径的 META-INF spring.factories
文件中找到EnableAutoConfiguration对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。
第三部分 :