在Spring中,系統已經爲用戶提供了許多已經定義好的容器實現,而不須要開發人員事必躬親。相比那些簡單拓展BeanFactory的基本IoC容器,開發人員經常使用的ApplicationContext除T可以提供前面介紹的容器的基本功能外,還爲用戶提供了附加服務,可讓客戶更方便地使用。因此說,ApplicationContext是一個高級形態意義的IoC容器,如上圖所示,能夠看到ApplicationContext在BeanFactory的基礎上添加的附加功能,這些功能爲ApplicationContext提供瞭如下BeanFactory不具有的新特性。java
在ApplicationContext容器中,以經常使用的FileSystemXmlApplicationContext的實現爲例來講明ApplcationContext的設計原理。 在FileSystemXmlApplicationContext的設計中,ApplicationContext應用上下文的主要功能已經在FileSystemXmlApplicationContext前面的基類們中完成,主要功能是在AbstractXmlApplicationContext中實現的。在FileSystemXmlApplicationContext中,做爲一個具體的應用上下文,只須要實現和它自身設計相關的兩個功能。web
/** * 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
/** * 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); }