前面幾篇文章分析了一些BeanPostProcessors
,包括 AutowiredAnnotationBeanPostProcessor
、 ConfigurationClassPostProcessor
、CommonAnnotationBeanPostProcessor
。這幾種是AnnotationApplicationContext
默認註冊的 BeanPostProcessor
。
本篇文章則 以 BeanPostProcessor
基礎接口開始,分析Spring 一些特定的BeanProcessor
功能。
BeanPostProcessor
BeanPostProcessor
實際會在 bean初始化前後調用,其結構爲:
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
默認返回的bean即爲即將初始化或者初始化之後的bean,你可以選擇手動在這裏修改它。
而實際上,Spring 容器在啓動時,會通過區分各種不同 BeanPostProcess
,而選擇在不同位置調用它們。
InstantiationAwareBeanPostProcessor
- 簡介:
InstantiationAwareBeanPostProcessor
在實例化前會被調用,是BeanPostProcessor
的子接口之一。
在doCreateBean
的resolveBeforeInstantiation
中,會判斷是否爲InstantiationAwareBeanPostProcessor
,是則會調用其postProcessBeforeInstantiation
方法。
這個類默認在Spring 容器中是不提供的,因爲它會提前的返回bean實例,而不會走通用流程,即在createBean中,一旦InstantiationAwareBeanPostProcessor
中的postProcessBeforeInstantiation
有返回bean,則不回在走doCreateBean
邏輯了。 - 方法:
postProcessBeforeInstantiation
:在實例化前被調用。而在resolveBeforeInstantiation
中,如果有InstantiationAwareBeanPostProcessor
,也同樣是BeanPostProcessor
,而當其創建完成後,則會調用BeanPostProcessor
的postProcessAfterInitialization
方法。postProcessAfterInstantiation
: 實例化之後的邏輯,這個返回true或者false,直接決定了是否需要對屬性進行判定賦值(例如@Autowired 等字段解析賦值)postProcessProperties
: 在 返回實例化後bean之前的設值。postProcessPropertyValues
:賦值階段,即上一步獲取的值在這一步設置。
是不是有點抽象?
SmartInstantiationAwareBeanPostProcessor
接着往下面看 InstantiationAwareBeanPostProcessor
的子接口 SmartInstantiationAwareBeanPostProcessor
,譯爲聰明的 InstantiationAwareBeanPostProcessor
?
這是一個有特殊目的接口,當然最好的就是通過使用裝飾模式來繼承 InstantiationAwareBeanPostProcessorAdapter
來實現自己目的。
predictBeanType
:預測bean的類型determineCandidateConstructors
:決定使用哪一個構造方法getEarlyBeanReference
:提前獲取暴露的引用,主要解決 循環依賴問題,前面分析過 循環依賴中 Spring 的解決方法
具體 AutowiredAnnotationBeanPostProcessor
前面文章有分析
DestructionAwareBeanPostProcessor
即在beanDestory之前被調用,DestructionAwareBeanPostProcessor
主要在 DisposableBeanAdapter
中使用,而DisposableBeanAdapter
是一個 DisposableBean
。
DisposableBean
主要是在 Spring 容器摧毀時候才被調用。如果項目中有配置的 DisposableBean
,則在Spring 啓動時候會被加入到集合中,當關閉時候會被調用。
另一方面 DisposableBeanAdapter
則會在 BeanFactory
要 destory
某個bean時候,直接包裝一層 DisposableBeanAdapter
返回。
protected void destroyBean(String beanName, Object bean, RootBeanDefinition mbd) {
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), getAccessControlContext()).destroy();
}
postProcessBeforeDestruction
摧毀前調用requiresDestruction
: 判斷是否需要destory,可以根據名字選擇返回。
MergedBeanDefinitionPostProcessor
這個接口 主要可以用於解析,改造beanDefinition吧。調用點在 doCreateBean
時候。
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
postProcessMergedBeanDefinition
:
前面分析的AutowiredAnnotationBeanPostProcessor
和CommonAnnotationBeanPostProcessor
會選擇在postProcessMergedBeanDefinition
這個方法來解析Class,即找出所有有註解的類。(在populateBean
前)resetBeanDefinition
,則是重置bean。
總結
Spring 內部有很多種 BeanPostProcessor
,並且基於其也有許多子接口,可以實現不同的邏輯。而開發者只需要實現其並註冊進入,不用改變Spring內部代碼,即可實現其功能。
利用 BeanPostProcessor,也可以實現自己的功能,例如Spring AOP邏輯。
遵循設計模式的開閉原則,開放擴展,而不用修改代碼。
覺得博主寫的有用,不妨關注博主公衆號: 六點A君。
哈哈哈,一起研究Spring: