Spring核心组件剖析
PaulaRichar
8年前
<h2><strong>Spring核心组件</strong></h2> <p>Spring的核心组件有很多,但构成其骨骼的,是Core,Context和Bean。</p> <h2><strong>Bean</strong></h2> <p>三者之中,Bean是核心中的核心。Bean实现了将对象通过配置文件的方式,由Spring来管理对象存储空间,生命周期的分配。通过 <strong>依赖注入</strong> 的方式,可以实现将对象注入到指定的业务逻辑类中。这些 <strong>注入关系</strong> ,由Ioc容器来管理。</p> <p>因此,Spring的核心思想常常被称作 <strong>BOP(Bean Oriented Programming)</strong> ,面向Bean编程。</p> <p>Bean组件定义在Spring的 <strong>org.springframework.beans</strong> 包下,解决了以下几个问题:</p> <ol> <li> <p>Bean的 <strong>定义</strong></p> </li> <li> <p>Bean的 <strong>创建</strong></p> </li> <li> <p>Bean的 <strong>解析</strong></p> </li> </ol> <p>使用者只需要关注Bean的创建,其他两个过程由Spring内部完成。</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/43c1d8e23c8d5427551c30ac95518040.png"></p> <h3><strong>1.整体架构</strong></h3> <p>Spring Bean的整体架构是典型的工厂模式,最上层的接口是 <strong>BeanFactory</strong> 。ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBean是其子类,目的是为了 <strong>区分Spring内部对象处理和转化的数据限制</strong> 。</p> <ul> <li> <p><strong>ListableBeanFactory</strong> : 表示这些Bean是可列表的</p> </li> <li> <p><strong>HierarchicalBeanFactory</strong> : 表示这些Bean有继承关系</p> </li> <li> <p><strong>AutowireCapableBeanFactory</strong> : 定义Bean的自动装配规则</p> </li> </ul> <p>这几个接口分别定义了Bean的集合、Bean的关系和Bean的行为。</p> <h3><strong>2.Bean定义</strong></h3> <p>Bean的定义主要由BeanDefinition描述,层次关系如下:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/16fd9b22f4ee8e2204fbe847eeadeb92.png"></p> <p>Spring的配置文件中定义的 节点,成功解析后都会被转化为BeanDefinition对象,之后所有的操作都会在BeanDefinition对象之上进行。</p> <h3><strong>3.Bean解析</strong></h3> <p>Bean解析的主要任务是:对Spring的配置文件进行解析,最后生成BeanDefinition对象。</p> <p>解析过程非常复杂,包括配置文件里所有的tag。主要参与的类如下:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/8c250532b2556d605b2aa272f3ff8041.png"></p> <h2><strong>Context</strong></h2> <p>Bean包装的是一个个Object,Object中存储着业务所需的数据。所以,如何给这些数据及之间的关系提供生存、运行环境(即 <strong>保存对象的状态</strong> ),就是Context要解决的问题。Context实际上就是Bean关系的集合,又称之为 <strong>Ioc容器</strong> 。</p> <p>ApplicationContext是Context最上层的接口,层次关系如下:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/40bac772dc705ae5dcebf3b1001ab988.png"></p> <p>ApplicationContext能够标识一个应用环境的 <strong>基本信息</strong> 。其上继承了5个接口,用于拓展Context的功能,其中BeanFactory用于创建Bean,同时继承了 <strong>ResourceLoader</strong> 接口,用于访问任何外部资源。</p> <p>ApplicationContext的子类,主要包括:</p> <ol> <li> <p><strong>ConfigurableApplicationContext</strong> : 用户 <strong>可动态配置</strong> 和 <strong>修改信息</strong> 的Context,其下AbstractRefreshableApplicationContext最为常用。</p> </li> <li> <p><strong>WebApplicationContext</strong> :<br> 为Web应用准备的Context,可以直接访问ServletContext。</p> </li> </ol> <p>总之,ApplicationContext必须完成的功能如下:</p> <ul> <li> <p>标识一个应用环境</p> </li> <li> <p>利用BeanFactory创建Bean对象</p> </li> <li> <p>保存 <strong>对象关系表</strong></p> </li> <li> <p>捕获各种事件</p> </li> </ul> <p>作为Ioc容器,Context是Spring其他大部分功能的 <strong>基础</strong> 。</p> <h2><strong>Core</strong></h2> <p>Spring 发现、建立和维护Bean之间关系的 <strong>一揽子工具</strong> ,称之为Core。实际上就是所需的Util。</p> <p>Core的重要组成部分之一是 <strong>Resource</strong> 。</p> <h3><strong>1. Resource整体层次</strong></h3> <p>Resource主要定义了 <strong>资源的访问方式</strong> ,所有资源都抽象到了Resource接口中,层次关系如下:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/8b7f7f3d9207623ef082e8c32717096f.png"></p> <ul> <li> <p><strong>资源包装</strong> 。Resource向上继承了 <strong>InputStreamSource</strong> 接口,所有的资源都通过InputStream来获取,从而屏蔽了资源提供者。</p> </li> <li> <p><strong>资源加载</strong> 。Resource下的 <strong>ResourceLoader</strong> 接口,所有资源加载者统一实现该接口就能 <strong>加载所有的资源</strong> ,例如之前的ApplicationContext。</p> </li> </ul> <h3><strong>2. 与Context建立关系</strong></h3> <p style="text-align: center;"><img src="https://simg.open-open.com/show/1a760b63c69a65cb1cc7360b39fafe88.png"></p> <p>如图,ApplicationContext通过 <strong>ResourcePatternResolver</strong> 接口与 <strong>ResourceLoader</strong> 进行交互,来进行资源的加载、解析和描述。ResourcePatternResolver将资源封装整合,便于其他组件使用。</p> <h2><strong>总结</strong></h2> <p>本文主要总结了构成Spring骨骼框架的三大核心组件及其之间的联系,以及对三者实现原理理解的一些心得体会。</p> <p> </p> <p> </p> <p>来自:http://www.cnblogs.com/ACFLOOD/p/6022667.html</p> <p> </p>