• Spring Boot的配置(配置文件,加载顺序,配置原理)之配置文件


    Spring Boot的配置(配置文件,加载顺序,配置原理)之配置文件

    配置文件

    Spring Boot使用一个全局配置文件,配置文件名是固定的

    • application.properties
    • application.yml

    配置文件的作用:修改Spring Boot自动配置的默认值,即修改Spring Boot在底层都给我们配置好的值

    YAML(YAML Ain't Markup Language)

    标记语言:

    ​ 以前的配置文件;大多都使用的是xxx.xml文件;

    ​ YAML:以数据为中心,比json、xml更适合做配置文件

    ​ YAML配置例子(冒号后面一定要加空格)

    server:
      port: 8081
    

    ​ XML:配置例子

    <server>
    	<port>8081</port>
    </server>
    

    1.YAML的语法

    1.基本语法

    属性与值的关系: k:(空格)v : 表示一对键值对(空格不能省略);

    空格的缩进来控制层级关系:只要是左对齐的数据都是都同一个层级的

    server:
       port: 8081
       path: /hello
    

    属性和值也是大小写敏感的;

    2.值的写法

    字面量:普通的值(数字,字符串,布尔)

    k: v 字面直接来写;

    ​ 一般字符串不用加上单引号或者双引号;

    ​ “双引号”:会转义字符串里面的特殊字符,特殊字符会作为本身想标识的意思

    name: "zhangsan /n list"
    输出:zhangsan 换行 list
    

    ​ ‘单引号’:不会转义特殊字符,特殊字符最终只是一个普通的字符串数据

    name: 'zhangsan /n list'
    输出:zhangsan /n list
    

    对象、Map(属性和值)(键值对):

    ​ k: v 在下一行来写对象的属性和值的关系;注意使用空格缩进

    friends:
      lastName: zhangsan
      age: 20
    

    ​ 行内写法:

    friends: {lastName: zhangsan,age: 18}
    

    数组(List、Set):

    用 -(空格)值 表示数组中的一个元素

    pets:
     - cat
     - dog
     - pig
    

    行内写法

    pets: {cat,dog,pig}
    

    3.配置文件值注入

    1.@ConfigurationProperties(默认从全局配置文件中取值)

    配置文件

    server:
      port: 8081
    
    person:
      lastName: zhangsan
      age: 19
      boss: false
      birth: 2020/5/20
      maps: {k1: v1,k2: 12}
      lists:
        - lisi
        - zhaoliu
      dog:
        name: 旺财
        age: 2
    

    javaBean

    /**
     * 将配置文件中配置的每一个属性的值,映射到这个组件中
     *  @ConfigurationProperties:告诉springBoot将本类中的所有属性和配置文件相关的配置进行绑定;
     *          prefix = "person":配置文件中哪个下面的所有属性进行一一映射
     *          只有这个组件是容器中的组件,才能使用容器提供的功能;
     **/
    @Component
    @ConfigurationProperties(prefix = "person")
    public class Person {
    
        private String lastName;
        private Integer age;
        private Boolean boss;
        private Date birth;
    
        private Map<String,Object> maps;
        private List<Object> lists;
        private Dog dog;
    

    导入配置文件处理器,配置文件进行绑定就会有提示(配置中的提示满足驼峰命名法的切换lastName=last-name)

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

    2.@Value

     /**
         *  Spring底层的Value,之前是在Spring配置文件中
         *  <bean>
         *      <property name="lastName" value="字面量 / ${key}-从环境变量、配置文件中获取值 / #{spel}"><property/>
         *  </bean>
         *  以前支持的,在@Value中都支持
         **/
    
        @Value("${person.last-name}")
        private String lastName;
        @Value("#{11*2}")
        private Integer age;
        @Value("true")
        private Boolean boss;
    

    3.@Value获取值和@ConfigurationProperties获取值比较

    @ConfigutationProperties @Value
    批量注入 支持 不支持
    松散绑定(松散语法:lastName=last_name=last-name) 支持 不支持
    SpEL 不支持 支持
    JSR303数据校验 支持 不支持
    复杂类型封装(对象、map) 支持 不支持

    配置文件无论是ymal还是properties他们都能获取到值

    总结

    如果说只是在某个业务逻辑(Controller、Service)中获取一下配置文件中的某项值,使用@Value

    如果说我们专门编写了一个javabean来和配置文件进行映射,则使用@ConfigurationProperties

    4.配置文件注入值数据校验

    @Component
    @ConfigurationProperties(prefix = "person")
    @Validated
    public class Person {
        
        @Email
        private String lastName;
    

    5.@PropertySource&ImportResource

    • @PropertySource:加载指定的配置文件(如果全局配置文件中有符合的前缀属性会先加载全局文件,就不会再去寻找PropertySource标注的文件)
    @PropertySource("classpath:person.properties")
    @Component
    @ConfigurationProperties(prefix = "person")
    
    • @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

    Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

    想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

    @ImportResource(locations = {"classpath:beans.xml"})
    导入Spring的配置文件让其生效
    
    • Spring Boot中推荐的添加组件的方式

      1.不编写xml文件,使用全注解的方式(配置类==》配置文件)

      2.使用@Bean注解来给容器中添加组件

      /**
       * 指明当前类为配置类
       * 在配置文件中用bean来添加组件
       * 配置类中用@Bean
       **/
      @Configuration
      public class MyAppConfig {
      
          //将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名
          @Bean
          public HelloService helloService(){
              System.out.println("@Bean给容器添加组建了");
              return new HelloService();
          }
      }
      

    4.配置文件占位符

    1.随机数

    ${random.value}、${random.int}、${random.long}
    ${random.int(10)}、${random.int[1024,65536]}
    

    2.占位符获取之前配置的值,如果没有可以使用: 指定默认值

    可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用),找不到属性时使用${key: value}来指定默认值

    person.last-name=张三${random.uuid}
    person.age=${random.int}
    person.birth=2017/12/15
    person.boss=false
    person.dog.name=${person.hello: hello}_dog
    person.dog.age=2
    person.maps.k1=v1
    person.maps.k2=15
    person.lists=1,2,b
    

    5.Profile

    1.多Profile文件

    我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml

    默认使用application.properties;

    2.yml支持多文档块方式

    三个 - 可以分出分档块

    profiles: 指定属于哪个环境(自定义),active:激活哪个环境

    server:
      port: 8081
    spring:
      profiles:
        active: prod
    
    ---
    server:
      port: 8082
    spring:
      profiles: prod
    ---
    server:
      port: 8083
    spring:
      profiles: dev
    ---
    

    3.激活指定profile

    1.在默认全局配置文件中 spring.profiles.active=dev 激活

    2.命令行的方式激活:

    • cmd在jar包目录下 : java -jar xxx.jar --spring.profies.active=dev

    • IDEA运行配置的program arguments(程序参数输入): --spring.profies.active=dev

    • IDEA运行配置的VM options(虚拟机选项):-Dspring.profiles.active=dev

  • 相关阅读:
    GoldenGate Studio 12.2.1.1发布
    重构-改善既有代码的设计完整笔记系列之8
    重构-改善既有代码的设计完整笔记系列之6、7
    Java多线程开发系列-线程管理
    Java多线程开发系列-线程活性故障
    Java多线程开发系列-线程间协作
    Java多线程开发系列-基础
    了不起的Java-CompletableFuture组合异步编程
    了不起的Java-Optional替代null处理
    了不起的Java-Lambda替代设计模式
  • 原文地址:https://www.cnblogs.com/JIATCODE/p/12993781.html
Copyright © 2020-2023  润新知