Spring IOC(十)幾種BeanPostProcessor 關係

前面幾篇文章分析了一些BeanPostProcessors,包括 AutowiredAnnotationBeanPostProcessorConfigurationClassPostProcessor
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 的子接口之一。
    doCreateBeanresolveBeforeInstantiation 中,會判斷是否爲 InstantiationAwareBeanPostProcessor,是則會調用其 postProcessBeforeInstantiation 方法。
    這個類默認在Spring 容器中是不提供的,因爲它會提前的返回bean實例,而不會走通用流程,即在createBean中,一旦 InstantiationAwareBeanPostProcessor 中的 postProcessBeforeInstantiation 有返回bean,則不回在走 doCreateBean 邏輯了。
  • 方法:
  1. postProcessBeforeInstantiation:在實例化前被調用。而在 resolveBeforeInstantiation 中,如果有 InstantiationAwareBeanPostProcessor ,也同樣是 BeanPostProcessor,而當其創建完成後,則會調用 BeanPostProcessorpostProcessAfterInitialization 方法。
  2. postProcessAfterInstantiation: 實例化之後的邏輯,這個返回true或者false,直接決定了是否需要對屬性進行判定賦值(例如@Autowired 等字段解析賦值)
  3. postProcessProperties : 在 返回實例化後bean之前的設值。
  4. postProcessPropertyValues:賦值階段,即上一步獲取的值在這一步設置。

是不是有點抽象?

在這裏插入圖片描述

SmartInstantiationAwareBeanPostProcessor

接着往下面看 InstantiationAwareBeanPostProcessor 的子接口 SmartInstantiationAwareBeanPostProcessor,譯爲聰明的 InstantiationAwareBeanPostProcessor

這是一個有特殊目的接口,當然最好的就是通過使用裝飾模式來繼承 InstantiationAwareBeanPostProcessorAdapter 來實現自己目的。

  • predictBeanType:預測bean的類型
  • determineCandidateConstructors:決定使用哪一個構造方法
  • getEarlyBeanReference:提前獲取暴露的引用,主要解決 循環依賴問題,前面分析過 循環依賴中 Spring 的解決方法

具體 AutowiredAnnotationBeanPostProcessor 前面文章有分析

DestructionAwareBeanPostProcessor

在這裏插入圖片描述

即在beanDestory之前被調用,DestructionAwareBeanPostProcessor 主要在 DisposableBeanAdapter 中使用,而DisposableBeanAdapter 是一個 DisposableBean
DisposableBean 主要是在 Spring 容器摧毀時候才被調用。如果項目中有配置的 DisposableBean,則在Spring 啓動時候會被加入到集合中,當關閉時候會被調用。
另一方面 DisposableBeanAdapter 則會在 BeanFactorydestory 某個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
    前面分析的 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor 會選擇在 postProcessMergedBeanDefinition這個方法來解析Class,即找出所有有註解的類。(在populateBean前)
  • resetBeanDefinition,則是重置bean。

總結

Spring 內部有很多種 BeanPostProcessor,並且基於其也有許多子接口,可以實現不同的邏輯。而開發者只需要實現其並註冊進入,不用改變Spring內部代碼,即可實現其功能。

利用 BeanPostProcessor,也可以實現自己的功能,例如Spring AOP邏輯。

遵循設計模式的開閉原則,開放擴展,而不用修改代碼。

覺得博主寫的有用,不妨關注博主公衆號: 六點A君。
哈哈哈,一起研究Spring:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章