spring-core组件详解——Environment应用上下文环境

环境表明当前应用运行时所处的环境。java

整个应用环境模型包括2个关键方面:web

  1. profiles配置组(如下简称组):
    一个profile组,是一个以name名称命名的、逻辑上的、要被注册到容器中的BeanDefinition的集合。简单一点说,一个profile就表明一组BeanDefinition,这个对应配置文件中<beans profile="">。当加载解析xml配置文件的时候,只有active=true激活的BeanDefinition才会被加载进容器。spring

  2. properties环境变量:
    在几乎全部的应用中,Properties环境变量都扮演着很是重要的角色,且这些变量值能够来自于各类PropertySource属性源,如:properties文件、jvm虚拟机环境变量、操做系统环境变量、JNDI、Servlet上下文参数、自定义的属性对象、Map对象,等等。Environment环境对象为用户提供了方便的接口,用于配置和使用属性源。数组

环境体系图以下:
框架

刚才提到环境模型具备2个关键方面:profiles和properties,从体系图中能够看出,properties方面的全部功能由PropertyResolver属性解决器来实现,环境模型只是经过装饰模式,在PropertyResolver功能的基础上,额外扩展出了profiles方面的功能。所以在接口方面,Environment继承自PropertyResolver,从实现类方面,AbstractEnvironment类内部持有一个PropertySourcesPropertyResolver类型对象的引用。jvm

关于PropertyResolver,我前边的文章已经进行了详细的解释,所以在本文中,咱们重点关注环境模型在profiles方面的实现原理,体系图以下:ide

  1. Environment接口:
    this

    public interface Environment extends PropertyResolver {
    
    	/**
    	 * 获取当前环境对象激活的全部profile组。
    	 * 
    	 * @return
    	 */
    	String[] getActiveProfiles();
    
    	/**
    	 * 获取默认的profile组。
    	 * 若是当前环境对象中激活的组为空(getActiveProfiles()返回空数组)的话,
    	 * 则会启用默认profile组。
    	 * 
    	 * @return
    	 */
    	String[] getDefaultProfiles();
    	
    	/**
    	 * 判断给定的一个或多个组中,是否存在知足当前环境对象配置的组(任意一个组知足便可)。
    	 * 如:
    	 * 调用acceptsProfiles("p1","!p2"),若是当前环境对象激活了p1,
    	 * 或者没有激活p2(注意是或,知足一个条件便可),则返回true,不然返回false。
    	 * 
    	 * @param profiles
    	 * @return
    	 */
    	boolean acceptsProfiles(String... profiles);
    
    }
  2. ConfigurableEnvironment:
    操作系统

    public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
    
    	/**
    	 * 从新设置激活的组集合。
    	 * @param profiles
    	 */
    	void setActiveProfiles(String... profiles);
    
    	/**
    	 * 向当前激活的组集合中添加一个组。
    	 * @param profile
    	 */
    	void addActiveProfile(String profile);
    
    	/**
    	 * 设置默认激活的组集合。激活的组集合为空时会使用默认的组集合。
    	 * 
    	 * @param profiles
    	 */
    	void setDefaultProfiles(String... profiles);
    
    	/**
    	 * 获取当前环境对象中的属性源集合,也就是应用环境变量。
    	 * 属性源集合其实就是一个容纳PropertySource的容器。
    	 * 这个方法提供了直接配置属性源的入口。
    	 * @return
    	 */
    	MutablePropertySources getPropertySources();
    
    	/**
    	 * 获取操做系统环境变量
    	 * 这个方法提供了直接配置系统环境变量的入口。
    	 * @return
    	 */
    	Map<String, Object> getSystemEnvironment();
    
    	/**
    	 * 获取虚拟机环境变量
    	 * 这个方法提供了直接配置虚拟机环境变量的入口。
    	 * @return
    	 */
    	Map<String, Object> getSystemProperties();
    
    	/**
    	 * 合并指定环境对象中的配置到当前环境对象中。
    	 * @param parent
    	 */
    	void merge(ConfigurableEnvironment parent);
    
    }
  3. AbstractEnvironment抽象基类:
    该类实际上实现了以上接口的全部方法,且额外扩展了自定义属性源的入口:
            protected void customizePropertySources(MutablePropertySources propertySources);
    可是由于初始时属性源集合只是一个空集合,没有任何意义,由于该类定义为抽象基类,不能直接实例化使用。部分代码以下:
    code

    /**
     * 部分代码
     * @author lixin
     *
     */
    public class AbstractEnvironment {
    	/**
    	 * 可变属性源集合
    	 */
    	private final MutablePropertySources propertySources = new MutablePropertySources();
    	
    	/**
    	 * 在构造方法中直接调用自定义属性源集合
    	 */
    	public AbstractEnvironment() {
    		customizePropertySources(this.propertySources);
    		
    	}
    	
    	/**
    	 * 自定义属性源集合,
    	 * 默认空实现,子类可重写,用来配置属性源。
    	 * 
    	 * @param propertySources
    	 */
    	protected void customizePropertySources(MutablePropertySources propertySources) {
    	}
    }
  4. StandardEnvironment:
    该类定义了Spring应用运行时使用的标准环境,其实就是重写了customizePropertySources方法,前后追加了jvm虚拟机环境变量属性源和操做系统环境变量属性源这两个属性源。固然对于特殊的spring运行环境,咱们能够建立标准环境的子类,以实现属性源的扩充,好比:StandardServletEnvironment类,用于web应用环境。

    public class StandardEnvironment extends AbstractEnvironment {
    
    	// 操做系统环境变量属性源的名称
    	public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
    
    	// jvm虚拟机系统环境变量属性源的名称
    	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()));
    	}
    
    }

        以上就是spring框架的基本环境体系。

相关文章
相关标签/搜索