该代码基于Spring2.x 其中部分实现 在 Spring 4 中已经变化 但是基础的核心思想是不会变的...
直接上重点...
1.抽象的IOCProvider 这个抽象的理念 :用来管理bean 作用就是IOC了
2.Ioc容器之一--beanFactory
需要记住的第一个图
BeanFactory与AppcalitionContext的关系 |
需要记住的第二个图:
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信息实例化被请求对象,并为其注入依赖,如果该对象实现了某些回调接口,也会根据回调接口的要求来装配它。当对象装配完毕后,容器会立即将其返回请求方使用。
需要记住的第三张图:
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的销毁是在容器关闭时进行的