事情是这样的。。
接上,遇到这样一个需求。
同个项目A,需要部署到两个地区。
我们就会想到用两个配置文件(application-a.properties/application-a.yaml),来区分地区。
思路正确,确实这样做最方便。
写着写着变样了?
代码写着,忽然有一天。
问题出现了,地区a需要在Java代码里面增加一个判断,但地区b并不需要这个判断。
这时,小明出现。给了个解决方案:
在指定类上增加@Profile("a")注解,就可以在指定配置文件激活时,加载此类。
这样解决了问题,却引发另一个问题:我这个类,90%代码相同。
如果用@Profile("a"),会导致重复代码过高。
还有其它办法吗¿
有的,而且很灵活。
一句话,在代码里面获得ActiveProfile的值,进行if判断。
如果你引入了Hutool工具,可以用下面的代码获取第一个环境配置(有另外一个方法获取多个环境配置):
String activeProfile = SpringUtil.getActiveProfile();
然后:
if (activeProfile.contains("a")) {
// 原来的代码.
}
假如,没有Hutool工具怎么办?
用下面的工具类(从Hutool的代码精简而来):
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtil.applicationContext = applicationContext;
}
/**
* 获取当前的环境配置,无配置返回null
*
* @return 当前的环境配置
*/
public static String[] getActiveProfiles() {
if (null == applicationContext) {
return null;
}
return applicationContext.getEnvironment().getActiveProfiles();
}
/**
* 获取当前的环境配置,当有多个环境配置时,只获取第一个
*
* @return 当前的环境配置
*/
public static String getActiveProfile() {
final String[] activeProfiles = getActiveProfiles();
return activeProfiles != null && activeProfiles.length != 0 ? activeProfiles[0] : null;
}
}
所以,学会了吗?