Spring核心组件详解。

Bean组件

Bean组件在Spring的org.springframework.beans包下。在这个包下的所有类主要解决了3件事:Bean的定义、Bean的创建及对Bean的解析。对Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由Spring在内部帮你完成,对你来说是透明的。

Spring Bean的创建是典型的工厂模式,他的顶级接口是BeanFactory。

BeanFactory有3个子类:ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory。但是我们可以发现最终的默认实现类是DefaultListableBeanFactory,他实现了所有的接口。为何要定义这么多层次的接口呢?查阅这些接口的源码和说明可以发现每个接口都有他使用的场合,他主要是为了区分在Springn内部对象的传递和转发过程中,对对象的数据访问所做的限制。例如,ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示这些Bean是有继承关系的,也就是每个Bean有可能有父Bean,AutowireCapableBeanFactory接口定义Bean的自动装配规则。这4个接口共同定义了Bean的集合、Bean之间的关系和Bean的行为。

Bean的定义主要由BeanDefinition描述。

Bean的定义完整的描述了在Spring的配置文件中你定义的节点中所有的信息,包括各种子节点。当Spring成功解析你定义的一个节点后,在Spring的内部他就被转化成BeanDefinition对象,以后所有的操作都是对这个对象进行的。
Bean的解析过程非常复杂,功能被分得很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以及对可能的变化。Bean的解析主要就是对Spring配置文件的解析。
当然还有对Tag的具体解析,在这里并没有列出。

Context组件

Context在Spring的org.springframework.context包下,他实际上就是给Spring提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环境是如何构建的。

ApplicationContext是Context的顶级父类,他除了能标识一个应用环境的基本信息外,还继承了5个接口,这5个接口主要是扩展了Context功能。

ApplicationContext继承了BeanFactory,这也说明了Spring容器中运行的主体对象是Bean。另外ApplicationContext继承了ResourceLoader接口,使得ApplicationContext可以访问到任何外部资源,这些将在Core中详细说明。

ApplicationContext的子类主要包含两个方面:

  •     ConfigurableApplicationContext表示该Context是可修改的,也就是在构建Context中,用户可以动态添加或修改已有的配置信息,他下面又有多个子类,其中最经常使用的是可更新的Context,即AbstractRefreshableApplicationContext类。
  •     WebApplicationContext顾名思义就是为Web准备的Context,他可以直接访问ServletContext,在通常情况下,这个接口使用得很少。

再往下分就是构建Context的文件类型,接着就是访问Context的方式。这样一级一级构成了完整的Context等级层次。

总体来说ApplicationContext必须要完成以下几件事情。

  •     标识一个应用环境。
  •     利用BeanFactory创建Bean对象。
  •     保持对象关系表。
  •     能够捕获各种事件。

Context作为Spring的Ioc容器,基本上整合了Spring的大部分功能,或者说是大部分功能的基础。

Core组件

Core组件作为Spring的核心组件,其中包含了很多关键类,一个重要的组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。

Resource接口封装了各种可能的资源类型,也就是对使用者来说屏蔽了文件类型的不同。对资源的提供者来说,如何把资源包装起来交给其他人用也是一个问题,我们看到Resource接口继承了InputStreamSource接口,在这个接口中有个getInputStream方法,返回的是InputStream类。这样所有的资源都可以通过InputStream类来获取,所以也屏蔽了资源的提供者。另外还有一个加载资源的问题,也就是资源的加载者要统一,这个任务是由ResourceLoader接口完成的,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是DefaultResourceLoader。

Context把资源的加载、解析和描述工作委托给了ResourcePatternResolver类来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。在Core组件中还有很多类似的方式。

你可能感兴趣的:(Spring)