企网官方网站,移动端优秀网站,wordpress code标签,开发公司工程管理中心管理制度Spring运行环境
Spring在创建容器时#xff0c;会创建Environment环境对象#xff0c;用于保存spring应用程序的运行环境相关的信息。在创建环境时#xff0c;需要创建属性源属性解析器#xff0c;会解析属性值中的占位符#xff0c;并进行替换。
创建环境时#xff0c…Spring运行环境
Spring在创建容器时会创建Environment环境对象用于保存spring应用程序的运行环境相关的信息。在创建环境时需要创建属性源属性解析器会解析属性值中的占位符并进行替换。
创建环境时会通过System.getProperties()获取JVM系统属性会通过System.getenv()获取JVM环境属性。
Environment在Spring中的使用
spring在创建容器时需要指定需要加载配置文件路径在加载配置文件路径时需要解析字符串中的占位符。解析占位符时需要环境信息此时会创建一个标准的spring运行环境即创建StandardEnvironment对象。 1、调用setConfigLocations方法给spring设置需要加载的配置文件的路径源码如下
// 将配置文件的路径放到configLocations 字符串数组中
public void setConfigLocations(Nullable String... locations) {if (locations ! null) {Assert.noNullElements(locations, Config locations must not be null);// 设置了几个配置文件就创一个多长的字符串数组用来存放配置文件的路径this.configLocations new String[locations.length];for (int i 0; i locations.length; i) {//解析路径将解析的路径存放到字符串数组中this.configLocations[i] resolvePath(locations[i]).trim();}}else {this.configLocations null;}
}2、调用resolvePath方法解析配置文件路径中的占位符源码如下
// 解析给定的路径必要时用相应的环境属性值替换占位符。应用于配置位置。
protected String resolvePath(String path) {// 获取环境解决所需的占位符return getEnvironment().resolveRequiredPlaceholders(path);
}3、调用getEnvironment方法获取环境信息如果没有指定spring的环境信息通过createEnvironment获取默认的环境也就是spring的标准环境。getEnvironment方法源码如下
// 获取spring的环境信息如果没有指定获取到的时默认的环境
Override
public ConfigurableEnvironment getEnvironment() {if (this.environment null) {this.environment createEnvironment();}return this.environment;
}4、调用createEnvironment方法获取默认的环境spring的标准环境使用StandardEnvironment无参构造创建对象。源码如下
// 获取默认的环境
protected ConfigurableEnvironment createEnvironment() {return new StandardEnvironment();
}Spring的标准环境StandardEnvironment
Spring的标准环境StandardEnvironment适合在非web应用程序中使用。
在AbstractApplicationContext类的createEnvironment方法中会调用StandardEnvironment的无参构造方法创建环境对象。 1、调用StandardEnvironment的无参构造方法该方法中没有任何逻辑处理源码如下
public StandardEnvironment() {}2、StandardEnvironment类是AbstractEnvironment抽象类的子类因此使用StandardEnvironment的无参构造创建对象时会调用父类AbstractEnvironment的无参构造方法。AbstractEnvironment在下文中有描述。
3、重写AbstractEnvironment类中的customizePropertySources方法用于设置属性源该方法通过父类进行回调。 该方法会获取JVM系统属性和环境属性并设置到MutablePropertySources类中存放属性源的CopyOnWriteArrayList中。 1JVM系统属性通过System.getProperties()获取 2环境属性通过System.getenv()获取。 StandardEnvironment类中customizePropertySources方法源码如下
// 设置属性源JVM系统属性中的属性将优先于环境属性中的属性。
Override
protected void customizePropertySources(MutablePropertySources propertySources) {/*** 1、MutablePropertySources类中使用CopyOnWriteArrayList存储属性源集合中存储PropertySource的子类* 2、PropertiesPropertySource是PropertySource的子类PropertySource类中有三个成员变量* 1logger日志对象* 2name用来保存属性源名称* 3source用来保存属性源中的属性*/// getSystemProperties()通过System.getProperties()获取JVM属性键值对并转成MappropertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));// getSystemEnvironment()通过System.getenv()获取环境属性键值对并撰成MappropertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}4、StandardEnvironment类中设置了两个静态常量 1systemEnvironment以系统环境为属性源 2systemProperties以JVM系统属性为属性源
/** System environment property source name: {value}.* 系统环境属性源名:{value}。 */
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME systemEnvironment;/** JVM system properties property source name: {value}.* JVM系统属性属性源名称:{value}。*/
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME systemProperties;Spring的抽象环境AbstractEnvironment
StandardEnvironment类是AbstractEnvironment抽象类的子类因此使用StandardEnvironment的无参构造创建对象时会调用父类AbstractEnvironment的无参构造方法。
1、AbstractEnvironment的无参构造方法该方法会调用AbstractEnvironment的有参构造方法源码如下
public AbstractEnvironment() {this(new MutablePropertySources());
}2、AbstractEnvironment的有参构造 该方法的主要做三件事 1给成员变量赋值 2创建属性源属性解析器 3调用子类重写的customizePropertySources方法方法回调。虽然方法回调在成员变量的赋值之后但由于是引用传递所以通过成员属性可以获取到改变之后的值。
// 使用了模板方法设计模式。
// 给成员变量赋值并调用子类重写的方法对propertySources进行操作。
protected AbstractEnvironment(MutablePropertySources propertySources) {// 给全局变量 可变属性源 赋值this.propertySources propertySources;// 创建属性解析器PropertySourcesPropertyResolver 属性源属性解析器this.propertyResolver createPropertyResolver(propertySources);// 自定义属性源此处回调子类重写的方法。子类通过重写该方法可以操作propertySources。spring标准环境StandardEnvironment重写了该方法customizePropertySources(propertySources);
}3、调用createPropertyResolver创建属性解析器用于解析属性值中的占位符并进行替换。
// 在创建环境时需要创建属性解析器
protected ConfigurablePropertyResolver createPropertyResolver(MutablePropertySources propertySources) {return new PropertySourcesPropertyResolver(propertySources);
}4、AbstractEnvironment的成员属性
// 指示Spring忽略系统环境变量,默认值为false。
// false表示不会忽略系统环境变量此时getSystemEnvironment方法会调用System.getenv()获取环境属性
// true表示会忽略系统的环境变量此时getSystemEnvironment方法会返回一个空的Map
public static final String IGNORE_GETENV_PROPERTY_NAME spring.getenv.ignore;// 指定系统启动时使用哪些配置文件可以使用逗号隔开
public static final String ACTIVE_PROFILES_PROPERTY_NAME spring.profiles.active;// 指定系统启动时使用默认的配置文件可以使用逗号隔开
public static final String DEFAULT_PROFILES_PROPERTY_NAME spring.profiles.default;// 保留的默认的配置文件的名称如果没有显式设置默认配置文件名称也没有显式设置活动配置文件名称则默认情况下该配置文件将自动激活。
protected static final String RESERVED_DEFAULT_PROFILE_NAME default;// 日志对象
protected final Log logger LogFactory.getLog(getClass());//系统启动时使用的配置文件
private final SetString activeProfiles new LinkedHashSet();// 默认配置文件
private final SetString defaultProfiles new LinkedHashSet(getReservedDefaultProfiles());// 可变属性源使用该成员变量保存属性源及通过该属性源获取的属性
private final MutablePropertySources propertySources;// 可配置的属性解析器
private final ConfigurablePropertyResolver propertyResolver;