王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory

该代码基于Spring2.x 其中部分实现 在 Spring 4 中已经变化 但是基础的核心思想是不会变的...

直接上重点...

1.抽象的IOCProvider  这个抽象的理念 :用来管理bean 作用就是IOC了

2.Ioc容器之一--beanFactory 

需要记住的第一个图

王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory_第1张图片

                                                                BeanFactory与AppcalitionContext的关系

需要记住的第二个图:

王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory_第2张图片

                        BeanFactory与BeanDefinitionRegister和BeanDefinition的关系

读取配置文件的需要使用到具体BeanDefinitionReader实现类

Spring提供的实现类有:PropertiesBeanDefinitionReader和XmlBeanDefinitionReader

也可以自己实现读取指定配置的BeanDefinitionReader

[题外话:Spring2.x之前xml基于DTD格式 2.x之后引入了基于XSD的格式]

 

需要记住的知识点-1:

    容器背后的秘密:Spring Ioc容器启动的流程可以分为2个部分:容器启动阶段和Bean的实例化阶段

容器启动阶段细节:

    加载配置->分析配置信息->装备配到Beandefinition->其他后续处理

[首先会选择某种方式【beanDefinitionReader的某个实现】加载Config],之后分析这些Bean配置信息,并将分析后的信息编组为相应的BeanDefinition,最后把这些保存了Bean定义了必须信息的BeanDefinition注册到相应的BeanDefinitionRegistey,这样容器启动工作就完成了。

    tips:其中Spring提供了一种叫做BeanFactoryPostProcessor的机制,通过实现该接口,可以完成容器启动阶段最后的【其他后续处理:①常见的有PropertyPalceholderConfigurer,支持我们在xml中使用占位符 ②PropertyOverrideConfigurer,支持配置覆盖xml配置  前面两种都是通过对beanDefinition中的数据进行变更以达到某种目的 ③XXXEditorConfigurer,它知识辅助性低将后期会用到的信息注册到容器,对BeanDefinition没有做任何改动,它的子类实现主要是用来处理数据类型的转化④支持自定义,手动实现PropertyEditorjiekou 或 直接继承PropertyEditorSupport类】

Bean的实例化阶段

经过第一阶段,所有的Bean定义都通过BeanDefinition注册到了BeanDefinitionRegistry中。当请求方通过容器的getBean()方法明确的请求某个对象,或者因依赖关系容器需要隐式地调用getBean方法时,就会触发第二个阶段的活动。

该阶段,容器会首先检查所请求的对象是否已经初始化,如果没有,则会根据注册的BeanDefinition信息实例化被请求对象,并为其注入依赖,如果该对象实现了某些回调接口,也会根据回调接口的要求来装配它。当对象装配完毕后,容器会立即将其返回请求方使用。

需要记住的第三张图:

王福强老师的《Spring揭秘》读后感-IOC容器之BeanFactory_第3张图片

Bean的实例化过程

Bean的实例化可以采用反射也可以采用CGLIB动态字节码的方式实现;默认采用cglib方式

[tips:cglib实现类 继承自具有 反射功能的实现类]

容器只要根据相应Bean定义的Beandefinition取得实例化信息,从而返回一个包装过的BeanWrapper 第一阶段结束


当对象实例化并完成相关属性以及依赖设置完成之后,Spring容器会检查当前对象实例是否实现了一系列以Aware命名结尾的接口定义[对于 BeanFactory 和 ApplicationContetx  两者有不同的Aware结尾的接口]

对于BeanPostProcessor接口:该接口中由两个方法[分别处理BeanPostProcessor前置处理以及BeanPostProcessor后置处理]

实际上Spring对于Aware接口设置相关依赖是在beanPostProcessor前置处理中中完成的 [记住ApplicationContext的继承和实现图,它会将ApplicationContext本身注入到 这些实现了Aware接口的类中]

当然,也可以使用自定义的处理逻辑来完成BeanpostProcessor前置和后置处理


对于initialzingBean和init-method 以及 Disposable和destory方法都比较简单就不叙述了

至此 一个Bean 的生命周期基本介绍完毕。

Bean的销毁是在容器关闭时进行的

你可能感兴趣的:(Spring研究目录)