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,後序的自動裝配程式碼就不會被執行到。
至此,這個回撥介面解釋完,具體應用場景看專案業務要求,目前我還沒有使用過。