一、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方法中發布關閉事件