ApplicationContext功能與設計原理


1.ApplicationContext功能

image.png
在Spring中,系統已經為用戶提供了許多已經定義好的容器實現,而不需要開發人員事必躬親。相比那些簡單拓展BeanFactory的基本IoC容器,開發人員常用的ApplicationContext除T能夠提供前面介紹的容器的基本功能外,還為用戶提供了附加服務,可以讓客戶更方便地使用。所以說,ApplicationContext是一個高級形態意義的IoC容器,如上圖所示,可以看到ApplicationContext在BeanFactory的基礎上添加的附加功能,這些功能為ApplicationContext提供了以下BeanFactory不具備的新特性。

  • 支持不同的信息源。我們看到ApplicationContext擴展了MessageSource接口,這些信息源的擴展功能可以支持國際化的實現,為開發多語言版本的應用提供服務。
  • 訪問資源。這一特性體現在對ResourceLoader和Resource的支持上,這樣我們可以從不同地方得到Bean定義資源。這種抽象使用戶程序可以靈活地定義Bean定義信息,尤其是從不同的I/O途徑得到Bean定義信息。訪問資源的功能在Spring中由ResourceLoader提供,實現與載入和注冊的解耦。這在接口關系上看不出來,不過一般來說,具體ApplicationContext都是繼承了DefaultResourceLoader的子類。因為DefaultResourceLoader是AbstractApplicationContext的基類。
  • 支持應用事件。繼承了接口ApplicationEventPublisher,從而在上下文中引入了事件機制。這些事件和Bean的生命周期的結合為Bean的管理提供了便利。
  • 在ApplicationContext中提供的附加服務。這些服務使得基本IoC容器的功能更豐富。因為具備了這些豐富的附加功能,使得ApplicationContext與簡單的BeanFactory相比,對它的使用是一種面向框架的使用風格,所以一般建議在開發應用時使用ApplicationContext作為IoC容器的基本形式。

2.ApplicationContext設計原理

image.png
在ApplicationContext容器中,以常用的FileSystemXmlApplicationContext的實現為例來說明ApplcationContext的設計原理。 在FileSystemXmlApplicationContext的設計中,ApplicationContext應用上下文的主要功能已經在FileSystemXmlApplicationContext前面的基類們中完成,主要功能是在AbstractXmlApplicationContext中實現的。在FileSystemXmlApplicationContext中,作為一個具體的應用上下文,只需要實現和它自身設計相關的兩個功能。

  • 一個功能是,如果應用直接使用FileSystemXmlApplicationContext,對於實例化這個應用上下文的支持,同時啟動IoC容器的refresh()過程。這在FileSystemApplicationContext的代碼實現中可以看到,代碼如下:
/**
	 * Create a new FileSystemXmlApplicationContext with the given parent,
	 * loading the definitions from the given XML files.
	 * @param configLocations array of file paths
	 * @param refresh whether to automatically refresh the context,
	 * loading all bean definitions and creating all singletons.
	 * Alternatively, call refresh manually after further configuring the context.
	 * @param parent the parent context
	 * @throws BeansException if context creation failed
	 * @see #refresh()
	 */
	public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {

		super(parent);
		setConfigLocations(configLocations);
		if (refresh) {
			refresh();
		}
	}

這個refresh()過程會牽涉IoC容器啟動的一系列復雜操作,相當於一個入口,同時,對於不同的容器實現,這些操作都是類似的,因此在基類中將它們封裝好(所以主要功能都是在基類中完成的)。所以,我們在FileSystemXml的設計中看到的只是一個簡單的調用。

  • 另一個功能是與FileSystemXmlApplicationContext設計具體相關的功能,這部分與怎樣從文件系統中加載XML的Bean定義資源有關。通過這個過程,可以為在文件系統中讀取以XML形式存在的BeanDefinition做准備,因為不同的應用上T文實現對應着不同的讀取BeanDefinition的方式,在FileSystemXmlApplicationContext中的實現代碼如下:
/**
	 * Resolve resource paths as file system paths.
	 * <p>Note: Even if a given path starts with a slash, it will get
	 * interpreted as relative to the current VM working directory.
	 * This is consistent with the semantics in a Servlet container.
	 * @param path path to the resource
	 * @return Resource handle
	 * @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
	 */
	@Override
	protected Resource getResourceByPath(String path) {
		if (path != null && path.startsWith("/")) {
			path = path.substring(1);
		}
		return new FileSystemResource(path);
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM