Spring Ioc 原理小结
spring的Ioc真是个好东西啊,那它到底是什么东西呢,控制反转,到底是怎么转的呢?
假设啊你现在是一个导演,想排部戏,那是不是得需要演员和舞台(spring中的bean),如果按平常的编程思维就是new 一个actor,一个stage ,然后actor 开始perform。但如果你利用控制反转(Ioc),一开始,演员就自动给你送来了,不用去你找也不用你去new,演员表演需要舞台,这个时候舞台也随着演员一起出现了,这个称为依赖注入(DI)。
接下来我们来看看一个Bean是从注册到使用走过了一个什么历程。
首先我们认识下spring容器,BeanFactory和ApplicationContext,由于后者是建立在前者之上的,我们先看前者。它有个BeanFactory接口,定义了如何访问管理容器内的Bean方法。还有个BeanDefinitionRegistry接口,专门管理Bean的注册,配置。默认一个DefaultListableBeanFactory实现了上述两接口。而Bean的注册信息即BeanDefinition可通过bindViaCode方法来自行编码完成注册,也可分别通过bindViaproperties或bindViaXml方法利用BeanDefinitionReader来载入properties文件或xml配置文件注册。现在最常用的就是通过xml文件来配置,可用Setter方法注入或构造方法注入(点击查看:Spring Ioc的一个Demo)。
当注册好Bean之后,就等着容器启动还有调用啦。如果用的是BeanFatory容器,那它默认是延迟加载实例化Bean的,即当你用到这个Bean时它才帮你实例化了送过来;如果用的是ApplicationContext容器,那是可容器一启动即实例化所有的Bean的。
从Bean的实例化到准备就绪等待使用中间还要走好常的路呢,首先容器启动的时候,有时我们还需要对配置文件做一些处理,如${jdbc.passwd}此类占位符的二次加载啊还有其他对配置文件的再处理的,我们会用到BeanFactoryPostProcessor,然后Bean实例化后并不马上成为就绪状态,这时候BeanWrapper会对其包裹返回一个BeanWrapper实例,下阶段是设置初始属性值,接下来就是Aware接口,依赖注入就是靠这个实现啦,它要检查是否还有需要其他Bean的注入,之后进入关键的BeanPostProcessor处理,为什么说是关键的呢,因为在这个阶段会做一些诸如生成代理的行为,Spring AOP(点击查看:Spring Aop 原理总结)就靠它了,还有初始化方法啊都在这里。总之,就是一个本来很纯净的Bean,我们将我们所需要的东西都加工上去,最后返回它的一个代理。
自此一个Bean从注册到诞生准备做贡献的过程就是这样了。
posted on 2011-04-10 22:39 SeQuence.Choi 阅读(4658) 评论(0) 编辑 收藏 举报