参数介绍
- vm option : jvm参数
- Program arguments : 程序参数(空格分隔),main 方法的 args 参数
- Environment variables : 环境变量
在程序启动时会执行StandardEnvironment#customizePropertySources
public class StandardEnvironment extends AbstractEnvironment {
/** System environment property source name: "systemEnvironment". */
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
/** JVM system properties property source name: systemProperties. */
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
protected void customizePropertySources(MutablePropertySources propertySources) {
propertySources.addLast(
new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
propertySources.addLast(
new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}
}
getSystemProperties()
方法是通过System.getProperties()
来获取系统属性
getSystemEnvironment()
方法是通过System.getenv()
来获取环境变量,包括在 Environment variables 中自定义的变量
public abstract class AbstractEnvironment implements ConfigurableEnvironment {
public Map<String, Object> getSystemProperties() {
return (Map) System.getProperties();
}
public Map<String, Object> getSystemEnvironment() {
if (suppressGetenvAccess()) {
return Collections.emptyMap();
}
return (Map) System.getenv();
}
}
业务拆分
业务场景:同一套代码,需要部署成两个系统,场景不同,业务需要做隔离,业务在A系统支持,在B系统不支持。
定义配置类,配置类会根据env
加载,如果env
不存在,就不会加载。
@Configuration
@ConditionalOnProperty(name = "env")
public class AStartUpConfig {
}
定义支付业务Controller
@RequestMapping("/api/pay")
@ConditionalOnMissingBean(AStartUpConfig.class)
public PayController extends BaseController {
}
A系统不支持支付业务,只需要添加环境变量env
即可,AStartUpConfig
就会加载,PayController
不会被加载
B系统支持支付业务,不添加环境变量env
即可,AStartUpConfig
就不会加载,PayController
加载
环境变量,加上@ConditionalOnProperty
和@ConditionalOnMissingBean
注解的配合,实现拆分