通过前面的介绍,相信大家对bean的解析,注册的整体流程了解了,知道Spring怎么一步步将xml文档内的配置信息纳入容器中。有几个非常重要的接口,不得不谈。
1.BeanDefinition接口
这个接口,可以理解为xml bean元素的数据载体。通过对比xml bean标签的属性列表和BeanDefinition的属性列表一看便知。
我的理解,是解析XML的过程,就是 xml <bean>元素内容 转换为BeanDefinition对象的过程。而且这个接口,支持层级,对应对象的继承。
有一个类BeanDefinitionHolder,BeanDefinitionHolder,根据名称或者别名持有beanDefinition,它承载了name和BeanDefinition的映射信息。
BeanWarpper:
提供对标准javabean的分析和操作方法:单个或者批量获取和设置属性值,获取属性描述符,查询属性的可读性和可写性等。支持属性的嵌套设置,深度没有限制。
AttributeAccessor:接口定义了最基本的对任意对象的元数据的修改或者获取
BeanMetadataElement:用来传输一个可配置的源对象(源码)
ChildBeanDefinition是一种bean definition,它可以继承它父类的设置,即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系(现在spring源码中已不使用了)。ChildBeanDefinition从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于java类的继承关系)。注意:从spring 2.5 开始,提供了一个更好的注册bean definition类GenericBeanDefinition,它支持动态定义父依赖,方法是 GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可以有效的替代ChildBeanDefinition的绝大分部使用场合。我发现在spring3.1.2版本中,该类已经不被使用了。
GenericBeanDefinition是一站式的标准bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过parenetName属性来灵活设置parent bean definition。
通常, GenericBeanDefinition用来注册用户可见的bean definition(可见的bean definition意味着可以在该类bean definition上定义post-processor来对bean进行操作,甚至为配置parent name做扩展准备)。RootBeanDefinition
/ ChildBeanDefinition用来预定义具有
parent/child关系的bean definition。
一个RootBeanDefinition定义表明它是一个可合并的bean definition:即在spring beanFactory运行期间,可以返回一个特定的bean。RootBeanDefinition可以作为一个重要的通用的bean definition 视图。
RootBeanDefinition用来在配置阶段进行注册bean definition。然后,从spring 2.5后,编写注册bean definition有了更好的的方法:GenericBeanDefinition。GenericBeanDefinition支持动态定义父类依 赖,而非硬编码作为root bean definition。其中RootBeanDefinition是最常用的实现类,它对应一般性的<bean>元素标签
在 配置文件中可以定义父<bean>和子<bean>,父<bean>用RootBeanDefinition表示, 而子<bean>用ChildBeanDefiniton表示,而没有父<bean>的<bean>就使用 RootBeanDefinition表示。
2.BeanFactory接口
主要是这几个类或接口
ConfigurableBeanFactory:提供配置Factory的各种方法。一般应用用不到,主要为ListableBeanFactory和BeanFactory支持
ListableBeanFactory:根据条件获取bean的配置清单
ConfigurableListableBeanFactory:获取 BeanDefinition 和预先实例化单例 bean 的功能。beanFactory配置清单,指定忽略类型及接口
AutowireCapableBeanFactory:提供自动装配的功能,提供创建,注入,初始化及应用Bean的后处理器
HierarchicalBeanFactory:层级管理
如果,硬性理解这几个类分别有什么含义,有点苦涩。可以逆向思考一下。把这些工厂想象成一个裁缝,会方便理解些。
ConfigurableBeanFactory:你对要求衣服的样式要求
ListableBeanFactory:需求材料清单
AutowireCapableBeanFactory:缝纫机,针线工具
HierarchicalBeanFactory: 套装使用
ConfigurableListableBeanFactory:裁缝的助手
3.ApplicationContext接口
可以说是我们业务系统,主要面对的接口。Spring强大的扩展功能,全在这里实现。通过内部调用BeanFactory初始化,对用户透明。
AbstractRefreshableConfigApplicationContext:指定配置路径
AbstractRefreshableApplicationContext: 支持多次调用refresh.实现了refreshBeanFactory方法,供AbstractApplicationContext调用。
AbstractApplicationContext:模板模式实现初始化过程
publicvoid refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex); // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }
下面是针对该过程的各步骤分析(来自Spring 深度源代码分析)