ApplicationContext功能與設計原理

1.ApplicationContext功能

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

  • 支持不一樣的信息源。咱們看到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中,做爲一個具體的應用上下文,只須要實現和它自身設計相關的兩個功能。web

  • 一個功能是,若是應用直接使用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的設計中看到的只是一個簡單的調用。spring

  • 另外一個功能是與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);
    }
相關文章
相關標籤/搜索