SpringBoot的多环境启动和使用

一、SpringBoot的多环境启动

1.  在maven打包时使用 -P参数来指定环境,对应着 pom.xml中profiles->profile->id


<!-- 打包环境配置 -->
<profiles>
   <profile>
      <id>dev</id>
      <properties>
         <profileActive>dev</profileActive>
      </properties>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
   </profile>
   <profile>
      <id>test</id>
      <properties>
         <profileActive>test</profileActive>
      </properties>
   </profile>
   <profile>
      <id>product</id>
      <properties>
         <profileActive>product</profileActive>
      </properties>
   </profile>
spring.profiles.active                   = @profileActive@

 而springBoot的配置文件application.properties中的spring.profiles.active就会被赋值为-P指定的环境,从而加载对应环境的配置文件application-{profileActive}.properties

clean install  -pl service-gateway -am -e -U -Dfile.encoding=UTF-8 -DskipTests=true -P${env}

2. 没有使用-P打包,在运行时使用-D,  -D表示Java System Properties (VM Arguments)

java -jar -Dspring.profiles.active=prod application.jar

3. 没有使用-P打包,在运行时使用--,  --表示Program arguments

在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识

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

二、SpringBoot的多环境使用

 如果遇到需要对不同环境执行不同的代码逻辑时,如何处理呢?

 1. 使用@Value("${spring.profiles.active}")

@Value("${spring.profiles.active}")
private String profile;

 2. 使用自定义常量类来获取

public static void main(String[] args) {
   setProfilesActive(args);
   SpringApplication.run(MyApplication.class, args);
}


// spring boot main启动的时候设置了启动参数,把启动参数里面的spring.profiles.active 设置到系统属性文件中
public static void setProfilesActive(String[] args) {
   for (String arg : args) {
      if (arg.contains(CapitalConstant.PROFILES_ACTIVE) && arg.startsWith("--")) {
         String optionText = arg.substring(2, arg.length());
         String optionName;
         String optionValue;
         if (optionText.contains("=")) {
            optionName = optionText.substring(0, optionText.indexOf('='));
            optionValue = optionText.substring(optionText.indexOf('=') + 1, optionText.length());
            System.setProperty(optionName, optionValue);
         }
      }
   }
}

package com.success.constants;

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;

import java.util.Objects;
import java.util.ResourceBundle;

public class EnvConstant {

	private EnvConstant() {

	}

	public static final String PROFILES_ACTIVE = "spring.profiles.active";

	public static final String CURRENT_ACTIVE;// spring boot 当前激活的环境

	static {
		String active = System.getProperty(PROFILES_ACTIVE);
		if (Objects.nonNull(active)) {
			CURRENT_ACTIVE = active;
		} else {
			try{
				active = ResourceBundle.getBundle("application").getString(PROFILES_ACTIVE);
			}catch (Exception e){
				YamlPropertiesFactoryBean bean = new YamlPropertiesFactoryBean();
				bean.setResources(new ClassPathResource("application.yml"));
				active = bean.getObject().getProperty(PROFILES_ACTIVE);
			}finally {
				CURRENT_ACTIVE = active;
			}
		}
	}

}

 3. 使用@Proflie来标识同一个接口在不同环境下的不同实现

@Service
@Profile("prod") //生产环境.
public class ProdEmailServiceImpl2 implements EmailService{
   
    @Override
    publicvoid send() {
       System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");
       //具体的邮件发送代码.
       //mail.send();
    }
}

上一篇:c++文件读写


下一篇:802.11,蓝牙