美文网首页
Profile配置和加载配置文件

Profile配置和加载配置文件

作者: 胖先森 | 来源:发表于2018-12-25 15:56 被阅读0次

    Profile配置

    image

    1.Profile是什么

    很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。

    spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

    2.基于properties文件类型

    image

    假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置。

    你可以另外建立3个环境下的配置文件:

    applcation.properties
    application-dev.properties
    application-test.properties
    application-prod.properties
    

    然后在applcation.properties文件中指定当前的环境:spring.profiles.active=test
    这时候读取的就是application-test.properties文件。

    server.port=8001
    # 激活哪个配置文件
    spring.profiles.active=dev
    spring.profiles.include=prod
    

    可以包含其他的配置文件信息

    3.基于yml文件类型

    只需要一个applcation.yml文件就能搞定,推荐此方式。

    spring:
      profiles: 
        active: prod
    
    ---
    spring: 
      profiles: dev  
      
    server: 
      port: 8080  
      
    ---
    spring: 
      profiles: test  
      
    server: 
      port: 8081    
      
    ---
    spring.profiles: prod
    spring.profiles.include:
      - proddb
      - prodmq
      
    server: 
      port: 8082      
      
    ---
    spring: 
      profiles: proddb  
      
    db:
      name: mysql   
      
    ---
    spring: 
      profiles: prodmq   
    
    mq: 
      address: localhost
    

    此时读取的就是prod的配置,prod包含proddb,prodmq,此时可以读取proddb,prodmq下的配置

    也可以同时激活三个配置spring.profiles.active: prod,proddb,prodmq

    3.基于Java代码

    在JAVA配置代码中也可以加不同Profile下定义不同的配置文件,@Profile注解只能组合使用@Configuration@Component注解。

    @Configuration
    @Profile("prod")
    public class ProductionConfiguration {
    
        // ...
    
    }
    

    4.指定Profile

    不适用配置文件,而是在启动的时候进行指定的写法

    4.1 main方法启动方式:

    // 在IDE Arguments里面添加
    --spring.profiles.active=prod
    
    image

    优先级高于在配置文件里面的激活的

    4.2 JVM启动方式

    -Dspring.profiles.active=dev
    
    image

    4.3 插件启动方式

    spring-boot:run -Drun.profiles=prod
    

    4.4 jar运行方式

    java -jar xx.jar --spring.profiles.active=prod
    

    除了在配置文件和命令行中指定Profile,还可以在启动类中写死指定,通过SpringApplication.setAdditionalProfiles方法

    public void setAdditionalProfiles(String... profiles) {
        this.additionalProfiles = new LinkedHashSet<String>(Arrays.asList(profiles));
    }
    

    配置文件加载位置

    spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

    • file:./config/ - 优先级最高(项目根路径下的config

    • file:./ - 优先级第二 -(项目根路径下)

    • classpath:/config/ - 优先级第三(项目resources/config下)

    • classpath:/ - 优先级第四(项目resources根目录)

    image

    重要的规则,跟我们之前学过的不太一样

    1. 高优先级配置会覆盖低优先级配置

    2. 多个配置文件互补

      • 比如,两个同名文件里面有相同的配置,相同的配置会被高优先级的配置覆盖

        A配置优先级大于B配置

        server:
           port: 8080
        

        B配置优先级小于A配置

        server: 
           port: 8081
           context-path: /hanpang
        

        项目启动后访问地址为:http://127.0.0.1:8080/hanpang,这就是所谓的互补

    3. 通过配置spring.config.location来改变默认配置

      java -jar demo-xxx.jar --spring.config.location=C:/application.properties
      

      这对于运维来说非常方便,在不破坏原配置情况下轻松修改少量配置就可以达到想要的效果

    外部配置加载顺序

    来自于网路,个人没有进行相关的测试

    SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。

    1. 命令行参数

      • 所有的配置都可以在命令行上进行指定;

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

        java -jar spring-boot-02-config-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. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

    7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

    8. .jar包外部的application.properties或application.yml(不带spring.profile)配置文件

    9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

      由jar包外向jar包内进行寻找,优先加载待profile的,再加载不带profile的。

    10. @Configuration注解类上的@PropertySource

    11. 通过SpringApplication.setDefaultProperties指定的默认属性

    加载配置文件方式参考官网地址

    image

    相关文章

      网友评论

          本文标题:Profile配置和加载配置文件

          本文链接:https://www.haomeiwen.com/subject/tuvflqtx.html