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框架的基本環境體系。

相關文章
相關標籤/搜索