https://www.cnblogs.com/leihuazhe/p/7743479.html
springboot自动配置原理
其通过EnableAutoConfiguration来控制
这个注解里面关键的就是@Import注解导入了一个EnableAutoConfigurationImportSelector类
这个类是关键其有一个selectImports方法可以从我们的
"META-INF/spring-autoconfigure-metadata.properties"
文件获取目前支持的自动配置的类集合A
然后spring还需要去META-INF/spring.factories文件中寻找目前jar包中是否配置了相关支持自动配置的类集合B
其类似于key,value,key就是我们的注解org.springframework.boot.autoconfigure.EnableAutoConfiguration的全限定名称
value就是每个jar包下面目前可以支持的该自动配置的具体类比如如下的jpa
比如org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration
其中集合A是集合B的父集合
然后我们通过OnClassCondition来根据支持的集合A和目前我们jar包中的集合B进行过滤
从B中剔除A不支持的
原理就是通过递归启动线程来逐一判断
具体的判断规则是获取我们生产的bean比如JpaRepositoriesAutoConfiguration以来的class必须存在才会给生产该bean
生产该bean则该bean负责jpa方面的注入
至于@EnableConfigurationProperties注解只是用来给一个properties的bean设置属性,我们在自动配置的期间需要这个注解
总结下就是:
首先去spring-autoconfigure-metadata.properties
获取spring-autoconfigure-metadata.properties文件内容这个里面包含一部分自动注入要的条件
( 根据官网说法,使用这种配置方式可以有效的降低SpringBoot的启动时间,因为通过这种过滤方式能减少@Configuration类的数量,从而降低初始化Bean时的耗时)
对于dubbo没出现在里面的我们会自动去检索META-INF/spring.factories文件
寻找对应的AutoCongiguration,然后查看其ConditionalOnClass或者ConditionalOnProperty(也就是@Conditon类型的注解)是否满足
满足才会对其进行自动注入。
网友评论