zoukankan      html  css  js  c++  java
  • 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);
    	}
    
    
  • 相关阅读:
    后端程序员之路 28、一个轻量级HTTP Server的实现
    后端程序员之路 27、LogStash
    后端程序员之路 26、CAP理论
    后端程序员之路 25、Redis Cluster
    后端程序员之路 24、Redis hiredis
    后端程序员之路 23、一个c++的api framework
    后端程序员之路 22、RESTful API
    后端程序员之路 21、一个cgi的c++封装
    后端程序员之路 20、python复习
    flask框架的学习
  • 原文地址:https://www.cnblogs.com/huangzefeng/p/10322394.html
Copyright © 2011-2022 走看看