[笔记迁移][Spring Boot]配置[2]

版权声明:Collected by Bro_Rabbit only for study https://blog.csdn.net/weixin_38240095/article/details/88045302

1. Spring Boot的全局配置文件要求

(1) application.properties / application.yml,二选一,但 名字必须固定为application※
(2) 存放于src/main/resources目录或者classpath:config下
(3) 显式指定Spring Boot自动配置项以覆盖默认值

2.yml -> YAML

YAML Ain’t Markup Language

(1) YAML不是绝对的标记语言:A+isn’t

(2) 以数据为中心 ,比JSON和xml更适合作配置文件

(3) 基本语法
   <1> key:(空格)value,表示一个键值对(※空格必须有且不允许使用Tab制表
   <2> 空格缩进控制层级关系(左对齐),Python式层级缩进
   <3> key和value大小写敏感

(4)value的表示

类型 说明
字面量:数字、字符串、布尔值 空格后直接书写
字符串默认不加单双引号
单双引号的特殊意义与Linux扩展限制一样
对象:Object-Map 使用缩进嵌套键值对
普通写法:
NormalYmlObj
行内写法:
InlineYmlObj
数组,Collections 使用 - value 表示集合中的一个元素
普通写法:
NormalYmlArrs
行内写法:
InlineYmlArrs

(5) 配置文件中的动态占位符${}

项目 说明
随机数 ${random.value}, ${random.int}, ${random.long}, ${random.int(10)}, ${random.int[1024,65536]}
已配置的属性 引用先前配置过的属性:${app.name:默认值},找不到属性值时使用默认值

(6) “配置文件提示”组件的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>

自动提示字段名,两个单词之间用连字符"-"连接,但与Mybatis的命名规则一样可以自动匹配JavaBean驼峰命名规范,也就是说last-name与lastName时一样的

3.如何将配置文件中的值注入JavaBean

3.1 准备
  1. 配置文件
    yaml格式(application.yml)

    person:
        lastName: zhangsan
        age: 18
        boss: false
        birthday: 2017/12/12
        maps: {k1: v1,k2: v2}
        lists:
          - lisi
          - zhaoliu
        dog:
          name: 小狗
          age: 2
    

    properties格式(application.properties)

    person.last-name=zhangsan
    person.age=18
    person.birthday=2017/12/15
    person.boss=false
    person.maps.k1=v1
    person.maps.k2=v2
    person.lists=a,b,c
    person.dog.name=dog
    person.dog.age=2
    
  2. JavaBean

/**
 * 将配置文件中预置的属性值注入到组件@Component中
 * @ConfigurationProperties告诉SpringBoot将本类中的所有字段和配置文件中相应的键值对进行映射注入
 *使用注解属性prefix指定映射配置项标识,进行一一映射,类似@Resource
 */
@ConfigurationProperties(prefix = "pserson")
@Component
public class Person {
    private String lastName;
    private Integer age;
    private boolean boss;
    private Date birthday;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    //...
    }
3.2 注入说明
  1. 将配置文件中预置的属性值注入到@Component

  2. @ConfigurationProperties告诉Spring Boot将被标注类中的所有字段和配置文件中响应的键值对进行映射注入。使用注解属性prefix指定配置项标识,进行一一映射,功能类似@Resource

  3. Spring的底层注解@Value也可以实现类似功能,与@ConfigurationProperties的比较如下

    \ @ConfigurationProperties @Value
    功能 批量注入配置文件中的预置属性 手动一个个标注指定
    松散绑定(Relaxed Binding)
    大小写, _, -
    支持 不支持
    SpEL 不支持 支持
    JSR303校验 支持
    类前标注@Validated,字段校验与SpringMVC中学习的一致
    不支持
    复杂类型封装 支持 不支持
  4. @PropertySource / @ImportResource
    (1) @PropertySource:加载指定的自定义properties,而非来自全局配置文件application.properties
    (2) @ImportResource:标注在配置类上,导入Spring的配置文件,使其生效,即代替applicationContext.xml中的<import resource="…">

  5. Spring Boot推荐向容器中添加组件的方式:全注解
    applicationContext.xml => 注解配置类

    /**
     * @Configuration指名当前类是一个配置类,代替Spring配置文件ApplicationContext.xml.
     *
     * 在配置文件中用<bean></bean>添加组件==>@Bean
     * 标注@Bean方法的返回值被加入IOC容器中,其默认id是这个方法名
     *
     */
    @Configuration
    public class MyAppConfig {
        @Bean
        public HelloService helloService(){
            System.out.println("给IOC容器添加组件");
            return new HelloService();
        }
    }
    

4. 运行环境概要文件:Profile

4.1 多profile文件

格式:application-{ENV_PROFILE_NAME}.properties/yml,如application-dev.properties / application-prod.properties
【默认使用的是application.properties】

4.2 yml-多文档块(Documents)方式

在主配置文件application.yml中使用"—"进行文档分块

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: prod
3. 激活指定环境profile
  1. 在主配置文件application.properties中指定spring.profiles.active,如spring.profiles.active=dev
  2. 在主配置文件application.yml中指定spring: profile: active:, 如spring: profile: active: dev
  3. 使用命令行参数 --spring.profiles.active=dev
  4. 虚拟机参数 --Dspring.profiles.active=dev

5. 全局配置文件的加载位置及顺序

  1. Spring Boot启动时会扫描以下位置的application.properties / application.yml作为默认全局配置文件
    file:./config/
    file:./
    classpath:/config/
    classpath:/
    【以上优先级从高到低,所有的文件都会被加载,高优先级配置会覆盖低优先级配置(形成互补配置)】
  2. 通过配置spring.config.location来改变默认配置
  3. 项目打包后,可以使用命令行参数,在启动项目时指定配置文件的新位置, 指定配置文件和默认加载的配置文件会共同起作用,形成互补配置(经常在运维过程中使用)

6. 外部配置加载顺序

Spring Boot也可以从以下位置加载配置:优先级从高到底
(1)命令行参数,–ARGNAME=ARGVALUE,多个参数用空格分隔,如java -jar spring-boot-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
(2)来自java:comp/env的JNDI属性
(3)Java系统属性(System.getProperties())
(4)操作系统的环境变量
(5)RandomValuePropertySource配置的random.*属性值
(6)包外向包内寻找配置文件

优先加载profile
jar包外部的application-{profile}.properties / application.yml(带spring.profile)的配置文件
jar包内部的application-{profile}.properties / application.yml(带spring.profile)的配置文件


再加载非profile
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件

(7)@Configuration注解类上的PropertySource
(8)通过SpringApplication.setDefaultProperties指定的默认属性值

7. 自动配置原理

7.1 总结:xxxAutoConfiguration向IoC容器添加组件@Bean,组件属性来自xxxProperties封装与配置文件映射
  1. Spring Boot启动时加载 主配置类,开启自动配置功能 @EnableAutoConfiguration
  2. @EnableAutoConfiguration的作用:
    利用EnableAutoConfigurationImportSelector的父类方法selectImports(),其中关键代码如下
    //获取候选的配置
    List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
    
    底层:SpringFactoryLoader.loadFactoryNames()扫描spring-boot-xxx.jar类路径下META-INF/spring.factories,将扫描到所有EnableAutoConfiguration的值(全限类名)包装为Properties对象,之后把它们加入容器中
    # 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.CloudAutoConfiguration,\
    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,\
    org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
    org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
    org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
    org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
    org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
    org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
    org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
    org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
    org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
    org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
    org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
    org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
    org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
    org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
    org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
    org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
    org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
    org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
    org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
    org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
    org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
    org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
    org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
    org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
    org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
    org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
    org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
    org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
    org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
    org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
    org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
    org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
    org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
    org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
    org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
    org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
    org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
    org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration,\
    org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
    org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
    org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
    org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
    org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
    org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
    org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
    org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
    org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
    
    每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都会加入到容器中完成自动配置工作
  3. 每一个自动配置类进行自动配置功能,以HttpEncodeAutoConfiguration为例
    //表示该类是一个配置类,对应以前编写的配置文件,启动时容器添加该组件
    @Configuration
    
    //启动指定类的ConfigurationProperties功能,从配置文件中获取指定的值和JavaBean字段进行绑定,并把HttpEncodingProperties加入IOC容器中
    @EnableConfigurationProperties({HttpEncodingProperties.class})
    
    //SpringBoot所有的@ContionalXXX都是调用Spring底层@Conditional(OnCondition.class),根据不同的条件进行判断,若满足指定条件,当前被标注的配置类才会生效
    
    //判断当前应用是否为Web应用,若是则自动配置生效
    @ConditionalOnWebApplication(
        type = Type.SERVLET
    )
    
    //判断当前项目中是否存在指定类CharacterEncodingFilter.class
    @ConditionalOnClass({CharacterEncodingFilter.class})
    
    //判断配置文件中是否存在指定的配置 spring.http.encoding.enabled;
    //属性matchIfMissing=true表示,若配置文件不存在指定配置spring.http.encoding.enabled,判断仍然成立(即默认生效)
    @ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
    )
    public class HttpEncodingAutoConfiguration{
      
      	//已经和SpringBoot的配置文件映射
      	private final HttpEncodingProperties properties;
    
      	//只有一个有参构造器的情况下,参数的值就会从容器中取出
        public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
            this.properties = properties;
        }
    
      	//使用@Bean向IOC容器中添加组件characterEncodingFilter,该组件的某些值需要从properties中取出
        @Bean
      	//检查容器中是否已存在相应组件,若不存在则创建=>单例保证
        @ConditionalOnMissingBean
        public CharacterEncodingFilter characterEncodingFilter() {
            CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
            filter.setEncoding(this.properties.getCharset().name());
            filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.REQUEST));
            filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.RESPONSE));
            return filter;
        }
    }
    
    根据当前不同的条件判断,决定配置类是否生效,一旦生效,该配置类就会给容器中添加各种组件@Bean,这些组件的属性从对应的Properties类中获取
    注:所有在配置文件中的可配置项都被xxxProperties封装为属性,在全局配置文件中能配置的值都是来源于功能对应的Properties类
7.2 其他
  1. @ConditionalOnXXX
    Spring Boot所有的@ConditionalOnXXX都是调用Spring底层@Conditional(OnCondition.class),根据不同的条件进行判断,若满足指定条件,当前被标注的配置类才会生效
    ConditionExtends
  2. 自动配置报告:当前哪个自动配置类生效
    在全局配置文件application.properties中开启debug模式,控制台将打印“自动配置报告”,可以方便地知道哪些自动配置类生效
    debug=true
    
    ============================
    CONDITIONS EVALUATION REPORT
    ============================
    
    
    Positive matches:
    -----------------
    
      CodecsAutoConfiguration matched:
         - @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
    
      CodecsAutoConfiguration.JacksonCodecConfiguration matched:
         - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
           
    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', 'org.aspectj.weaver.AnnotatedElement' (OnClassCondition)
    

猜你喜欢

转载自blog.csdn.net/weixin_38240095/article/details/88045302