Spring2.0中的IOC随笔(三)之Bean工厂

记得在分析Bean容器的那篇文章中提到,Spring的Ioc由两部分组成,一部分是Bean容器,在Web开发时用到的最多的应该是XmlWebApplicationContext了;而另一部分就是Bean工厂,他在Spring的Ioc内部是起到为Bean容器提供服务的作用的,Bean容器内部使用的默认Bean工厂名为DefaultListableBeanFactory。今天我们就来了解一下这个默认Bean工厂的体系结构,看看他究竟能为Bean容器提供哪些服务。其总的继承结构如下图所示:

[align=center][img]http://dl.iteye.com/upload/attachment/256140/c708f541-f304-3134-96af-854f17e1e918.jpg[/img][/align]

其复杂程度并不亚于Bean容器,我们还是从上到下逐层地来进行梳理。首先来看第一张分解图:

[align=center][img]http://dl.iteye.com/upload/attachment/256142/6e2d01e9-4df4-331b-a4b9-97de23119b71.jpg[/img][/align]

这一组接口+实现的组合提供了管理单体Bean的功能。其中接口SingletonBeanRegistry定义了对外发布的功能,例如注册单体Bean,获得单体Bean以及获得所有单体Bean的名字等等,而具体的Bean实例以及方法实现由DefaultSingletonBeanRegistry提供。
再看下一幅分解图:

[align=center][img]http://dl.iteye.com/upload/attachment/256145/3a62dd96-daaa-354e-a626-2b0d60e81f00.jpg[/img][/align]

这一继承结构中包含了四个接口,各自定义了不同的协议。其中顶层的接口BeanFactory是所有BeanFactory的最上层接口,定义了获取单个Bean的服务。再看下面两个平行的子接口,从这两个接口名字的修饰词Listable和Hierarchical可以看出,一个是添加了批量获取Bean和BeanDefinition的协议,另一个使得Bean工厂具有了树形的继承体系结构。最后一个接口是一个Façade接口,将前面接口中所有的功能汇聚一身,并添加了一些设置Bean工厂属性的方法,例如设置父工厂,添加Bean的后续处理器等等。
总结一下,本组接口为Bean工厂定义了如下协议:
1) 操作单个Bean
2) 获取多个Bean或者BeanDefinition
3) 具有树形体系结构
4) Bean工厂自身属性设置
凡是实现了ConfigurableBeanFactory的Bean工厂都应该实现并且具有了上述四部分功能。
Let’s Move on!, 再看下一幅图:

[align=center][img]http://dl.iteye.com/upload/attachment/256149/8a7ef90d-eecf-3296-bd2b-9fba55040905.jpg[/img][/align]

上图不但将上面两张分解图合二为一,并且添加了三个新成员,即接口AutowireCapableBeanFactory,抽象类AbstractBeanFactory和AbstractAutowireCapableBeanFactory。新的接口一定会带来新的对外协议,而新的类,不论是抽象类还是具体类,一定会带来其所继承接口的实现。具体来看,AbstractBeanFactory除了一些模板方法留待后面的子类实现外,实现了其所继承的两个分支中的大部分方法,一个是DefaultSingletonBeanRegistry,另一个是ConfigurableBeanFactory。至此,AbstractBeanFactory这个Bean工厂具有了下列功能:
1) 管理单体Bean
2) 操作单个Bean
3) 获取多个Bean或者BeanDefinition
4) 具有树形体系结构
5) Bean工厂自身属性设置
接口AutowireCapableBeanFactory继承自顶层接口BeanFactory,并定义了自动装配的服务,而AbstractAutowireCapableBeanFactory实现了接口AutowireCapableBeanFactory,同时继承了AbstractBeanFactory,自此Bean工厂具有了下列功能:
1) 管理单体Bean
2) 操作单个Bean
3) 获取多个Bean或者BeanDefinition
4) 具有树形体系结构
5) Bean工厂自身属性设置
6) Bean自动装配

最后我们可以回顾分析一下最终Bean工厂的全景图了,如下图所示:

[align=right][img]http://dl.iteye.com/upload/attachment/256140/c708f541-f304-3134-96af-854f17e1e918.jpg[/img][/align]

最终的Bean工厂名为DefaultListableBeanFactory,其是在继承上幅图输出的Bean工厂AbstractAutowireCapableBeanFactory的基础上添加了BeanDefinition管理等功能,至此最终的Bean工厂具有了如下功能:
1) 管理单体Bean
2) 操作单个Bean
3) 获取多个Bean或者BeanDefinition
4) 具有树形体系结构
5) Bean工厂自身属性设置
6) Bean自动装配
7) 管理BeanDefinition

总结一下,就如同在另一篇文章中分析的Bean容器一样,整个体系结构的设计依然遵循着以接口来驱动和隔离功能群的方式,通过不断的叠加接口,从而将更多的功能不断的引入。这样带来的好处是整个体系的结构非常地清晰流畅,易于维护和扩展。Spring是优秀设计的典范,经常会在网上看到很多人很看不起SSH,其实不然,如果你只是停留在会配置文件的层次,那么我建议你去稍微研究一下你所配置的这些文件究竟是怎么运作起来的;如果你很不愿意而且鄙视那些重复发明轮子的人,那么至少你也应该明白轮子的运转原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值