Profile配置和加载配置文件

Profile配置

1.Profile是什么

不少时候,咱们项目在开发环境和生成环境的环境配置是不同的,例如,数据库配置,在开发的时候,咱们通常用测试数据库,而在生产环境的时候,咱们是用正式的数据,这时候,咱们能够利用profile在不一样的环境下配置用不一样的配置文件或者不一样的配置。html

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

2.基于properties文件类型

假若有开发、测试、生产三个不一样的环境,须要定义三个不一样环境下的配置。mysql

你能够另外创建3个环境下的配置文件:spring

applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
复制代码

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

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

能够包含其余的配置文件信息数据库

3.基于yml文件类型

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

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,prodmqdom

3.基于Java代码

在JAVA配置代码中也能够加不一样Profile下定义不一样的配置文件,@Profile注解只能组合使用@Configuration@Component注解。spring-boot

@Configuration
@Profile("prod")
public class ProductionConfiguration {

    // ...

}
复制代码

4.指定Profile

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

4.1 main方法启动方式:

// 在IDE Arguments里面添加
--spring.profiles.active=prod
复制代码

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

4.2 JVM启动方式

-Dspring.profiles.active=dev
复制代码

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根目录)

重要的规则,跟咱们以前学过的不太同样

  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指定的默认属性

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