SpringBoot进阶-配置高级

SpringBoot配置相关官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

一、临时属性

1. 命令行设置属性

使用 java -jar 命令启动 jar 包时添加临时属性

使用 --属性名=属性值 的形式指定临时属性,多个属性之间用空格间隔(每个属性名前都要有--

示例:

java -jar example-0.0.1-SNAPSHOT.jar --server.port=8080 --logging.level.root=warn

2. IDEA设置启动时参数

在 idea 右上角 Edit Configurations 中选择要启动的程序,设置 Program arguments,内容格式与命令行设置的参数一致

如下图:

在这里插入图片描述
在这里插入图片描述

3. 拒接接收临时参数

SpringBoot 项目启动类中有 Args 参数传递,如下示例:

@SpringBootApplication
public class Application {
    
    
    public static void main(String[] args) {
    
    
        args = new String[]{
    
    "--server.port=8080", "--logging.level.root=warn"};
        SpringApplication.run(Application.class, args);
    }
}

如上 main 函数中 args 就是命令行或 idea 传入的启动参数,可以写程序来修改

SpringApplication.run() 方法可以不传入 args 参数,从而达到拒接接收临时属性的效果

如下示例:

@SpringBootApplication
public class Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class);
    }

}

二、四级配置文件

  1. 开发目录 resources/ 目录下的配置文件(优先级最低)
  2. 开发目录 resources/config/ 目录下的配置文件
  3. jar 包同级目录的配置文件
  4. jar 包同级 config/ 目录下的配置文件(优先级最高)

在这里插入图片描述

不同优先级的配置文件同时存在时,不同的怕配置部分互补生效,相同的冲突部分优先级高的生效

同时,不同类型的配置文件同样有不同优先级:yaml < yml < properties

三、指定配置文件

1. 指定配置文件名称

(idea 或命令行)启动时传入参数 --spring.config.name=filename 无需文件后缀名

spring.config.name 默认值为 application(所以配置文件名都为 application )

指定了别的文件名称后,application 配置文件将会失效,同样四个等级的配置文件中也只会扫描新的文件名

多个名称使用逗号分隔,后指定优先于先指定,示例:

java -jar example-0.0.1-SNAPSHOT.jar --spring.config.name=application,tempconfig

application 在前 tempconfig 在后,不同部分两者互补,冲突部分 tempconfig 覆盖 application

2. 指定配置文件路径

(idea 或命令行)启动时传入参数 --spring.config.location=file 指定配置文件的路径

支持绝对路径和相对路径,支持 classpath:/ ,要有后缀名

多个文件用逗号分隔,后指定优先于先指定

示例:

java -jar example-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/application.yml,tempconfig.yml

注意上面的 tempconfig.yml 是当前目录的相对路径,而非在 classpath:/ 内

四、多环境开发

1. yaml 单文件多环境

使用 --- 来分隔不同的环境,不同环境中使用 spring.config.activate.on-profile 指定当前环境的名称

未指定环境名称的部分为默认配置,或公共配置,在这里使用 spring.profiles.active 指定要生效的环境名称

示例如下:

# 公共配置
  profiles:
    active: dev	# 生效的环境,多个环境逗号分隔,冲突部分后声明覆盖先声明
---
# 开发环境
spring:
  config:
    activate:
      on-profile: dev,env_dev # 可指定多个环境名称,逗号分隔
server:
  port: 8080

spring.profiles 属性也可用来指定当前环境名称,效果与 spring.config.activate.on-profile 相同,但是过时的写法

---
# 过时写法
spring:
  profiles: env1
---
# 推荐写法
spring:
  config:
    activate:
      on-profile: env2

2. yaml 多文件多环境

可以将不同的环境写入不同的配置文件,文件名称为 application-env.yml,其中 env 为环境名称

application.yml 文件为默认配置:

spring:
  profiles:
    active: dev	# 生效的环境

application-dev.yml 表示 dev 环境的配置:

server:
  port: 8081

不同环境不在需要设置环境名称,而是由文件名称决定

3. properties 多文件多环境

与 yaml 多文件相同,不同的环境配置写在不同的 properties 文件中,文件名为 application-env.properties

application.properties 文件为默认配置:

spring.profiles.active: dev	# 生效的环境

application-dev.properties 表示 dev 环境的配置:

server.port: 8081

另外 properties 文件的配置无法将多个环境写进同一个 properties 文件中,只能由多文件来设置多环境

4. 多环境组

多环境组相关配置最好把不同环境写在不同文件中,写在同一文件中有加载顺序不正确的可能

(1) include

示例:

spring:
  profiles:
    active: dev	# 生效的环境
    include: devMysql,devRedis	# 引入其它环境到组内

如上配置中将采用 dev 环境同时引入 devMysql 和 devRedis 两个环境配置

主环境最后加载,加载顺序为: devMysql,devRedis,dev,冲突配置后加载覆盖先加载

实用性不高,等同于 active: devMysql,devRedis,dev

(2) group

示例:

spring:
  profiles:
    active: dev	# 生效的环境
    group:
      "dev": devMysql,devRedis
      "pro": proMysql,proRedis
      "test": testMysql,testRedis

使用 group 配置多个环境组及成员,切换组只需更改 active 主环境

注意:主环境最先加载,加载顺序为 dev, devMysql, devRedis

5. 配合Maven多环境

Maven多环境配置文章指路:https://blog.csdn.net/Cey_Tao/article/details/126602653

先看 Maven 配置:

<profiles>
	<profile>
		<!-- 开发环境 -->
		<id>env_dev</id>
		<properties>
			<spring.profile>dev</jdbc.url>
		</properties>
		<activation>	<!-- 默认生效 -->
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<profile>
		<!-- 生产(正式)环境 -->
		<id>env_pro</id>
		<properties>
			<spring.profile>pro</jdbc.url>
		</properties>
	</profile>
 </profiles>

再看 yaml 配置文件:

spring:
  profiles:
    active: @spring.profile@	# 读取 Maven 配置中的 spring.profile 属性

由于 spring.profile 属性在 Maven 不同环境中有不同的值

所以指定 Maven 环境进行编译或打包时,也就指定了 SpringBoot 的环境

[补充]

Maven 改变默认生效的环境后,idea 启动项目可能会不生效,时 idea 缓存问题,需要手动 compile 之后再启动即可生效

猜你喜欢

转载自blog.csdn.net/Cey_Tao/article/details/127560395