SpringBoot自动配置原理(笔记)
1. 配置文件到底是什么?怎么写?
自动配置原理
- SpringBoot启动的时候加载主配置类,开启了自动配置功能
@EnableAutoConfiguration
; @EnableAutoConfiguration
作用:
1) 利用EnableAutoConfigurationImportSelector
给容器中添加一些组件;
2)可以查看selectImports()
方法的内容;
3)List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);//获取候选的配置
SpringFactoriesLoader.loadFactoryNames()
扫描所有类路径下的 META-INT/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到的EnableAutoConfiguration.class类对应的值,然后把它们添加到容器中
总结:将类路径下META-INF下的Spring.factories
里面配置的所有EnableAutoConfiguration
的值加入到了容器中
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
每一个这样的 **AutoConfiguration
类都是容器中的一个组件,都加入到容器中,用它们来做自动配置
3. 每一个自动配置类进行自动配置功能;
4. 以HttpEncodingAutoConfiguration
(Http编码自动配置)为例解释自动配置原理;
@Configuration(
proxyBeanMethods = false
)
//1.表示这是一个配置类,类似于以前写的配置文件,配置类也可以给容器中添加组件
@EnableConfigurationProperties({HttpProperties.class})
//2.启用ConfigurationProperties功能,将配置文件中的值和HttpEncodingProperties绑定起来
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//3.判断当前应用是否是web应用。如果是,那么当前配置类就生效
@ConditionalOnClass({CharacterEncodingFilter.class})
//4.判断当前项目中有没有这个类:CharacterEncodingFilter(这是SpringMVC中进行乱码解决的过滤器)
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
//5.判断配置文件中是否存在某个配置:spring.http.encoding.enabled,如果不存在,判断也是成立的
public class HttpEncodingAutoConfiguration {
**小结:**根据当前不同的条件判断,决定这个配置类是否生效
一旦这个配置类生效,这个配置类就会给容器中添加各种组件。这些组件的属性是从对应的properties类中获取的,这些类中的每一个属性又是和配置文件绑定的。
5. 所有在配置文件中能配置的属性都是在 **Properties
类中封装着,配置文件能配什么属性就可以参照某个功能对应的这个属性类
简而言之,我们能配什么属性都是来源于这个功能的properties类
2. SpringBoot的精髓
- SpringBoot启动会加载大量的自动配置类;
- 我们看我们需要的功能有没有SpringBoot写好的自动配置类;
- 我们再来看这个自动配置类中到底配置了哪些组件(如果有我们需要的组件,我们就不需要再配置了);
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中绑定某些属性的值。
***AutoConfiguration:自动配置类,负责给容器中添加组件
***Properties:封装配置文件中的相关属性