ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot的多环境启动和使用

2021-08-05 09:01:38  阅读:167  来源: 互联网

标签:String 启动 spring 环境 profiles ACTIVE optionText active 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();
    }
}

标签:String,启动,spring,环境,profiles,ACTIVE,optionText,active,SpringBoot
来源: https://blog.csdn.net/success1988/article/details/119406383

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有