admin管理员组

文章数量:1599543

目前有个需求,国际化过程中,我将我的messageSource单例Bean上增加了属性开关,即@ConditionOnProperty,相信大家都会用,然后需求来了,使用者不想挨个项目配置这个属性,想读取环境变量,这时问题就来了,我需要更健壮的condition!

这时,想到了spring-context中有Condition,可以自己实现条件筛选,nice!

其实之前没怎么接触过java中获取jvm属性(启动时传入或SystemProperties)及系统环境变量,故我的需求是:首先获取jvm属性,没有,再获取系统环境变量,这样很灵活,即能在默认时统一为全局配置相同值,又能在各个服务中自定义值,好了,jvm属性,在使用spring框架下,当然先想到了environment。

好,首先用environment获取key对应value,然后System.getEnv(key)【后来才发现多此一举,稍后说】,大功告成,开始测试。

测试设置jvm属性没有问题,

1、首先,以项目中该配置值:key 为主,以下三种方式:
* -Dkey=value
* --key=value
* properties中配置key=value

Condition中只要填写过滤规则就行了。此处代码省略

但是当我配置好了环境变量,并且取消了jvm属性的配置时,发现environment也就是第一步的过程仍然奏效,这是怎么回事呢?难道spring已经想到了我的需求?跟进代码,发现果然如此,

org.springframework.core.env.StandardEnvironment
public class StandardEnvironment extends AbstractEnvironment {

	/** System environment property source name: {@value} */
	public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";

	/** JVM system properties property source name: {@value} */
	public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";

	@Override
	protected void customizePropertySources(MutablePropertySources propertySources) {
		propertySources.addLast(new MapPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
		propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
	}

}

 

该类完美的“预测”到了我的需求,那么,省事了,而且,系统环境变量中不能有“.”、“-”这样的规则也考虑到了,会自动将属性key中的这几个字符自动替换为“_”,然后变换大小写去获取env值,大写的nice!!

 

本文标签: 环境变量Springbootcondition