六、Springboot配置-自动配置原理
1、Springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
2、@EnableAutoConfiguration作用:
1)利用AutoConfigurationImportSelector给容器中导入一些组件;
2)查看selectImports方法
3)List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
1 SpringFactoriesLoader.loadFactoryNames(); 2 3 扫描所有jar包类路径下的 META-INF/spring.factories 4 5 把扫描到的这些文件的内容包装成propeties对象 6 7 从porperties中获取到EnableAutoConfiguration.calss类(类名)对应的值,把他们添加到容器
8
9 每一个xxxAutoConfiguration类都是容器中的一个组件,都加入到容器,用他们来做自动配置
将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到容器中。
3、每一个自动配置类进行自动配置功能
4、以HttpEncodingAutoConfiguration为例解释自动配置原理
1 @Configuration
//启动指定类的ConfigurationProperties功能,将配置文件中对应的值和HttpProperties绑定起来,并把HttpProperties加入到ioc容器中 2 @EnableConfigurationProperties(HttpProperties.class)
//Spring底层@Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里的配置就会生效;判断当前是不是web应用,如果是,当前配置类生效 3 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//判断当前项目有没有这个类 4 @ConditionalOnClass(CharacterEncodingFilter.class)
//判断配置文件中是否存在某个配置spring.http.encoding,如果不存在判断也是成立的; 5 @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) 6 public class HttpEncodingAutoConfiguration {
private final HttpProperties.Encoding properties;
//只有一个有参构造的时候,参数的值会从容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean //给容器中添加组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
一旦这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里的每一个属性是和配置文件绑定的。
5、所有在配置文件中能配置的属性都是在xxxProperties类中的封装着,配置文件能配置什么就可以参照某个功能对应的的这个属性
1 1 @ConfigurationProperties(prefix = "spring.http") //从配置文件中获取指定的值和bean的属性进行绑定 2 2 public class HttpProperties {
6、自动配置类必须在一定条件下才会生效
可以通过启用debug=true属性,控制台会打印自动配置报告,可以知道哪些自动配置的类生效了。
总结: a、Springboot启动会加载大量的自动配置类
b、我们需要的功能有没有SoringBoot写好的配置类
c、我们再来看这个自动配置类中到底配置了哪些组件
d、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的值
e、xxxAutoConfiguration:自动配置类,给容器中添加组件
f、xxxPorperties:封装配置文件中相关属性

浙公网安备 33010602011771号