简介
在开发过程中,我们通常会把一些变化的数据,或者说不同环境值不一样的数据抽离出来,代码可以根据需要通过配置动态的方式获取不同的值,这个值可以是在配置文件中,数据库中等
在spring中定义了一个统一的环境变量接口 Environment
子类关系 StandardEnvironment -> AbstractEnvironment -> ConfigurableEnvironment -> Environment
其中StandardEnvironment就是spring中默认使用的
源码解析
默认使用StandardEnvironment,当然基于spring的其他框架会设置其它的值
protected ConfigurableEnvironment createEnvironment() {return new StandardEnvironment();
}
StandardEnvironment源码如下
public class StandardEnvironment extends AbstractEnvironment {public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";public StandardEnvironment() {}protected StandardEnvironment(MutablePropertySources propertySources) {super(propertySources);}// 添加systemEnvironment与systemProperties@Overrideprotected void customizePropertySources(MutablePropertySources propertySources) {propertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));}}
从StandardEnvironment的代码看出只要继承AbstractEnvironment实现customizePropertySources就可以给系统添加变量
StandardEnvironment便是把jvm启动参数与操作系统的变量添加进去了
getSystemProperties与getSystemEnvironment父类 AbstractEnvironment 已经实现
简化代码如下
public Map<String, Object> getSystemProperties() {// 获取jvm参数 可以通过 -Dname=shura设置return (Map) System.getProperties();
}@Override
@SuppressWarnings({"rawtypes", "unchecked"})
public Map<String, Object> getSystemEnvironment() {// 获取操作系统的环境变量return (Map) System.getenv();
}
测试
public static void main(String[] args) {System.setProperty("content", "hello shura");AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(context.getEnvironment().getProperty("content"));
}输出
hello shura
但是像SpringBoot如何把application.yaml的信息加进去的呢,自然就可以继承AbstractEnvironment,重写customizePropertySources进行扩展
当然如果需要启动参数,也可以直接继承StandardEnvironment更方便
扩展
将shura.properties内容加到环境变量
自定义 ShuraEnvironment
public class ShuraEnvironment extends AbstractEnvironment {@Overrideprotected void customizePropertySources(MutablePropertySources propertySources) {// 由于PropertiesPropertySource访问权限是一个protected,直接使用父类MapPropertySourcepropertySources.addLast(new MapPropertySource("systemProperties", getSystemProperties()));propertySources.addLast(new SystemEnvironmentPropertySource("systemEnvironment", getSystemEnvironment()));try {Properties properties = new Properties();properties.load(Files.newInputStream(ResourceUtils.getFile("classpath:shura.properties").toPath()));// 注意启动参数优先机制,使用addLast添加到最后propertySources.addLast(new PropertiesPropertySource("shuraProperties", properties));} catch (IOException e) {throw new RuntimeException(e);}}
}
新增配置文件 shura.properties
name=shura
age=100
启动类设置setEnvironment
public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);context.setEnvironment(new ShuraEnvironment());System.out.println(context.getEnvironment().getProperty("name"));System.out.println(context.getEnvironment().getProperty("age"));
}
测试
shura
100添加启动参数 -Dname=shura1
shura1
100
spring的环境变量就介绍到这了,下节介绍占位符
欢迎关注,学习不迷路!