Spring--IOC容器的一些扩展属性
一、BeanFactoryPostProcessor和BeanPostProcessor
BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性
BeanPostProcessor的作用是在bean完成创建实例、填充属性之后,初始化阶段的前后都会对bean进行操作,使用postProcessBeforeInitialization和postProcessAfterInitialization。
BeanFactoryPostProcessor控制BeanDefinition流程:
- 自定义类实现BeanFactoryPostProcessor接口,实现postProcessBeanFactory方法
- 执行postProcessBeanFactory方法修改BeanDefinition
BeanPostProcessor知道初始化前后操作方法:
- 自定义类实现BeanPostProcessor,实现postProcessBeforeInitialization和postProcessAfterInitialization方法
- 将自定义BeanPostProcessor添加到beanFactory中(手动添加)
- 在初始化方法中,会先后(相对于初始化)遍历beanFactory的BeanPostProcessor,并调用before/after方法。
BeanFactoryPostProcessor逻辑:
加载并读取文件 ----> 注册BeanDefinition ----> 自定义BeanFactoryPostProcessor并执行postProcessBeanFactory
BeanPostProcessor逻辑:
加载BeanDefinition ----> 自定义BeanPostProcessor并加入到beanFactory中 ----> 初始化方法中Spring扫描BeanPostProcessor集合,调用before/after方法
二、初始化和销毁
Bean的创建流程:
- 创建实例
- 填充属性
- 初始化
- 注册销毁方法(注册销毁方法的适配器,包含销毁方法,bean名称等)
初始化:
先判断Bean是否实现InitializingBean,如果实现则执行初始化方法。然后再遍历BeanDefinition中的初始化方法并通过反射执行。
销毁方法:
先判断Bean是否实现DisposableBean,再从存放销毁方法的集合中获取bean的销毁适配器,执行销毁方法。
三、Aware接口
Aware接口的作用是:
允许实现了接口的实例bean可以获取bean所在的beanfactory/applicationcontext等,进而使用其他服务(bean中需要增加beanfactory/applicationcontext属性)
BeanFactoryAware,在初始化前操作前,实例化后,判断bean是否实现接口,如果实现,则注入bean的beanfactory属性
BeanApplicationContextAware,在初始化前操作中注入属性。
四、Bean的作用域
Bean的作用域:
-
创建实例
-
填充属性
(设置aware)
-
初始化前 初始化 初始化后
-
注册销毁方法
-
将bean注册到容器中
Bean的作用域:
- 单例singleton:如果是单例,则有4、5
- 如果是prototype(每次使用则则销毁):则没有4、5
也就是说:原型bean没有销毁方法,不会存入容器
五、FactoryBean
在获取bean的时候,如果该bean实现了FactoryBean接口,则调用getObject方法(可以将复杂的类转为自定义管理在容器中)
(sington直接获取并存入FactoryBean缓存中,下次从缓存中获取,prototype每次都调用getObject方法获取bean)
六、容器事件和事件监听
事件监听和容器事件:
-
在AbstractApplicationContext中先将事件监听器添加到事件发布者multicaster中
-
然后发布refresh容器刷新事件,(事件发布者发布事件,发布之后,遍历事件发布者中的监听器泛型是否是发布事件的类型,如果是就调用监听器中的方法)
-
最后在AbstractApplicationContext中的doclose方法中发布关闭事件