1. 程式人生 > 其它 >Spring回撥介面之InstantiationAwareBeanPostProcessor

Spring回撥介面之InstantiationAwareBeanPostProcessor

概述

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor

這個回撥介面中有兩個方法:

@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
	return true;
}

這兩個方法分別有什麼用?

postProcessBeforeInstantiation

在bean例項化之前,傳入該bean的class物件和beanName,如果我們返回的Object不為空,那麼則說明這個類不需要Spring例項化且後序自動裝配、bean初始化回撥等都不會被執行等(但注意會去執行BeanPostProcessor的after初始化方法),相當於是在Spring準備初始化之前,如果該類返回不為空,那麼後序所有事情都不會進行,Spring認為這個Bean已經是完整的bean了,所以它不會進行其他操作了。但注意這個Bean仍然會被放到Spring容器中去

postProcessAfterInstantiation

當Spring建立完Bean以後,進行自動裝配以前,呼叫此回撥,如果此方法中返回false,那麼Spring則不會對這個bean進行自動裝配(也就是屬性注入)的操作。

原始碼解析

首先看postProcessBeforeInstantiation

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])方法中

注意看下一個紅框裡面的doCreateBean方法做完後,bean就被初始化建立且屬性已注入,在此之前上一個紅框中。

resoleveBeforeInstantiation方法的返回值如果不為空,那麼則直接return,後序的doCreateBean就沒進入了。

那麼我們此處看看上面紅框中的方法。

1、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

第一個紅框中就是去執行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法,第二個紅框中就是去執行BeanPostProcessor的after初始化方法。

先來看看applyBeanPostProcessorsBeforeInstantiation方法。

2、applyBeanPostProcessorsBeforeInstantiation

這裡面可以看出來其呼叫了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法,如果返回的不為空,則直接return出去了,這些程式碼比較簡單直接,不需要特別解釋。

然後第二個紅框中的applyBeanPostProcessorsAfterInitialization方法

3、applyBeanPostProcessorsAfterInitialization

這裡沒有什麼好去解釋的,這證實了上面我們說的如果postProcessBeforeInstantiation如果不返回空則不進行後序spring的操作,並且還會執行BeanPostProcessor的after初始化方法。

然後看postProcessAfterInstantiation

在上面我們解釋的是物件建立以前的時候那個回撥會被執行。現在和這個postProcessAfterInstantiation方法是在bean建立了,但還沒有自動裝配的時候。前面我們說了建立bean的方法是,那麼我們進入這個方法

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

doCreateBean

這裡面我們不過多描述Spring在自動裝配以前如何通過構造器建立物件,這個我上一篇部落格有詳細解釋。

我們看這個populateBean方法,這個方法時給當前已經創建出來的Bean填充屬性的。

populateBean

可以看到這裡面如果postProcessAfterInstantiation方法的返回值為false,那麼直接return,後序的自動裝配程式碼就不會被執行到。

至此,這個回撥介面解釋完,具體應用場景看專案業務要求,目前我還沒有使用過。