六、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:封装配置文件中相关属性

posted @ 2020-01-03 15:30  why768  阅读(206)  评论(0)    收藏  举报