zoukankan      html  css  js  c++  java
  • 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序

    SpringBoot也可以从以下位置加载配置; 优先级从高到低

    高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置

     1.命令行参数

    所有的配置都可以在命令行上进行指定
    先打包在进行测试
    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
    

     指定访问的路径

    多个配置用空格分开; --配置项=值

    --

    由jar包外向jar包内进行寻找;
    优先加载带profile

    6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    再来加载不带profile
    8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
    9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件

     --

    其余的参考官方文档:

    所有支持的配置加载来源

    https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

     

    2.自动配置原理

    官方文档:

    https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#common-application-properties

    1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
    2)、@EnableAutoConfiguration作用:
      --- 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
      --- 可以查看selectImports()方法的内容;
      --- List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
      

      

      

      将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中

       

       每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

    3)、每一个自动配置类进行自动配置功能;
    4)、以**HttpEncodingAutoConfiguration(Http编码自动配置)**为例解释自动配置原理;
    @Configuration   //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件@EnableConfigurationProperties(HttpEncodingProperties.class)  //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中
    
    @ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;    判断当前应用是否是web应用,如果是,当前配置类生效
    
    @ConditionalOnClass(CharacterEncodingFilter.class)  //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
    
    @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  //判断配置文件中是否存在某个配置  spring.http.encoding.enabled;如果不存在,判断也是成立的//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;public class HttpEncodingAutoConfiguration {
      
            //他已经和SpringBoot的配置文件映射了
            private final HttpEncodingProperties properties;
      
       //只有一个有参构造器的情况下,参数的值就会从容器中拿
            public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
                    this.properties = properties;
            }
      
        @Bean   //给容器中添加一个组件,这个组件的某些值需要从properties中获取
            @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
            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)、所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类

    @ConfigurationProperties(prefix = "spring.http.encoding")  
    //从配置文件中获取指定的值和bean的属性进行绑定public class HttpEncodingProperties { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

     

     
    精髓:
    1)、SpringBoot启动会加载大量的自动配置类
    2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
    3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
    4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;
    xxxxAutoConfigurartion:自动配置类;
    给容器中添加组件
    xxxxProperties:封装配置文件中相关属性;

    @Conditional

    @Conditional派生注解(Spring注解版原生的@Conditional作用)

    作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

    自动配置类必须在一定的条件下才能生效;
     
    我们怎么知道哪些自动配置类生效;
     
    我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
    #开启springboot的debug
    debug=true

     

    Positive matches:(自动配置类启用的)
    -----------------
    
       DispatcherServletAutoConfiguration matched:
          - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; 
         @ConditionalOnMissingClass did not find unwanted class (OnClassCondition) - @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition) Negative matches:(没有启动,没有匹配成功的自动配置类) ----------------- ActiveMQAutoConfiguration: Did not match: - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory',
      'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition) AopAutoConfiguration: Did not match: - @ConditionalOnClass did not find required classes
       'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)
  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10120466.html
Copyright © 2011-2022 走看看