Spring Boot下Profile的四种切换方式思路总结

Profile多环境下Profile

在实际项目发布流程中,往往会涉及到多个环境下各类配置的切换。在Spring Boot中提供了多种机制允许开发者进行自行的定制和设置。
profile是用来描述某个环境下的配置信息的总称,包括:数据库连接,配置信息,名称等等个性化的信息。

基于Maven pom文件的配置

profile设置

在以Maven管理的项目其核心流程与设置定在pom.xml文件中,包括这里提到的profile信息。在maven的pom文件中,可以定义多个profile,并设置缺省的profile,在系统运行过程中,如果未指定profile,则使用缺省的profiles。
其设置格式定义如下:

 <project>
 .......
 <profiles>
   	<!-- MySQL Local Profile Setting -->
   	<profile>
   		<id>mysqldev</id>
   		<activation>
   			<activeByDefault>true</activeByDefault>
   		</activation>

   		<properties>
   			<appserver.port>8080</appserver.port>
   			<app.debug.mode>true</app.debug.mode>

   			<database.type>MySQL</database.type>
   			<database.username>test1</database.username>
   			<database.driver>com.mysql.jdbc.Driver</database.driver>
   			<database.password>12345678</database.password>

   			<!-- create=true -->
   			<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&amp;&amp;useSSL=false</database.url>

   			<!-- updatae -->
   			<database.ddl.action>update</database.ddl.action>
   			<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>

   			<default.locale.info>zh_CN</default.locale.info>
   		</properties>
   	</profile>

   	<!-- Other Environment Setting -->
   	<profile>
   		<id>prod</id>
   		<activation>
   			<activeByDefault>false</activeByDefault>
   		</activation>

   		<properties>
   			<appserver.port>8080</appserver.port>
   			<app.debug.mode>true</app.debug.mode>

   			<database.type>MySQL</database.type>
   			<database.username>root</database.username>
   			<database.driver>com.mysql.jdbc.Driver</database.driver>
   			<database.password>123456</database.password>

   			<!-- create=true -->
   			<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&amp;&amp;useSSL=false</database.url>

   			<!-- updatae -->
   			<database.ddl.action>update</database.ddl.action>
   			<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>

   			<default.locale.info>en_US</default.locale.info>
   		</properties>
   	</profile>
   </profiles>
   ......

从上述设置中可以发现,activeByDefault用来设置缺省profile。profiles节点中定义了多个profile,每个profile都表示一套环境的设置和配置信息。

读取配置信息

基于@Value读取配置信息,示例如下:

  @Component
  @Data
  public class ConfigBean  {
        @Value("${key.val1}")
        private String keyVal;
  }

第二种方式是基于配置文件的读取,在配置文件中基于占位符进行pom文件中值的替换。
system-config.properties

   [email protected]@

配置文件实体类的读取工具类:

@Data
@Configuration
@PropertySource(value={"classpath:systemconfig.properties"}, encoding="UTF-8")
public class SystemConfig {
	@Value("${key.val1}")
	private String keyVal;
}

在maven的命令行下进行profile的切换如下:

mvn clean package -P prod

-P profile_name: 指定profile的名称
–spring.profiles.active=test: 指定活跃的profile name,此为Java命令行的参数

基于profile的properties配置文件

在Spring Boot应用中,可以基于application.properties和application-{profile}.properties的方式来定义不同profile下的配置信息。
假定目前有dev/prod/test三个profile,其中通用的配置信息定义独立定义在一个文件中,个性化的配置信息定义在各自独立的配置文件中:

  • application.propeties: 定义各个运行环境统一的配置信息
  • application-dev.properties: 定义在dev中的各类配置文件
  • application-test.properties: 定义在test环境下的各类配置信息
  • application-prod.properties: 定义在prod环境下的各类配置信息

加载的顺序,优先加载application.properties文件中的信息,然后根据profile的定义,加载相应的配置文件信息,例如application-dev.properties配置文件的信息等。

这样设计的好处就是通用的配置与个性化的配置信息进行了隔离,在进行调整和修改之时,影响范围变得可控和很小。

基于profile的yml配置文件

yml是一种非常简洁清晰的配置文件格式,基于空格和层次递进方式,扁平化显示系统配置信息。Spring Boot基于yml定义profile的各类信息,定义格式如下:

spring:
  profiles:
    active: test

---
### Dev Setting 
spring:
  profiles: dev

server:
  port: 8080

---
## Test Setting
spring:
  profiles: test
    
server:
  port: 8081


---
## Prod Setting
spring:
  profiles: prod
  
server:
  port: 8083

通过上述方式,可以简洁地定义实现多个环境下的配置信息定义。

基于多yml文件的profile切换

此方式与property方式类似,都是将单个环境的配置信息定义在独立的yml文件中,例如dev环境下的配置信息将定义在application-{profile}.yml, profile实际为dev。
application.yml定义来通用的配置信息,其中通过spring.profile.active定义当前active的profile名称。
示例如下:
application.yml

spring:
  profiles:
    active: test
    
app:
  title:
    name: default name

application-dev.yml:

### Dev Setting 
spring:
  profiles: dev

server:
  port: 8080

app:
  title:
    name: dev name

application-test.yml:

## Test Setting
spring:
  profiles: test
    
server:
  port: 8081
  
app:
  title:
    name: test name

application-prod.yml:

## Prod Setting
spring:
  profiles: prod
  
server:
  port: 8083
        
app:
  title:
    name: prod name

本身的结构与property方式非常类似。

总结

综合而言,yml更为简洁和层次分明,如果大家不熟悉的话,基于property文件,也可以实现完全实现同样的功能。

发布了478 篇原创文章 · 获赞 804 · 访问量 433万+

猜你喜欢

转载自blog.csdn.net/blueheart20/article/details/88676236