這里會(huì)簡(jiǎn)單的對(duì)調(diào)用時(shí)機(jī)進(jìn)行一個(gè)排序。從小到大,值越小,調(diào)用時(shí)機(jī)越靠前。
一、BeanFactoryPostProcessor (order: 21 )
BeanFactoryPostProcessor.png
基本定義
從上圖可以看到其基本定義,實(shí)現(xiàn)類(lèi)的方法為:postProcessBeanFactory,參數(shù)為 BeanFactory。
方法調(diào)用時(shí)機(jī)
暫未看到 直接實(shí)現(xiàn) BeanFactoryPostProcessor 在哪里調(diào)用。回頭找完補(bǔ)充一下。
初始化階段,調(diào)用1次。
1.1 BeanDefinitionRegistryPostProcessor (order: 20)
BeanDefinitionRegistryPostProcessor .png
基本定義
BeanFactoryPostProcessor 的子類(lèi),在父類(lèi)基礎(chǔ)上又?jǐn)U展了一個(gè) postProcessBeanDefinitionRegistry 方法,方法參數(shù)為 BeanDefinitionRegistry。
實(shí)際上BeanFactory、與BeanDefinitionRegistry存在很緊密的聯(lián)系。以我們最常見(jiàn)的DefaultListableBeanFactory類(lèi)為例,該類(lèi)實(shí)現(xiàn)了BeanDefinitionRegistry、ConfigurableListableBeanFactory接口、繼承了AbstractBeanFactory。關(guān)系比較復(fù)雜這里不做描述,只需要知道這兩個(gè)參數(shù),雖然類(lèi)型不同,但是在很多情況下都是一個(gè)實(shí)例就OK。
調(diào)用時(shí)機(jī)
AbstractApplicationContext -> refresh() -> invokeBeanFactoryPostProcessors()
具體位置:PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
初始化階段,調(diào)用一次。
與其父類(lèi) BeanFactoryPostProcessor 方法先后順序由具體的實(shí)現(xiàn)類(lèi)決定,比如在ConfigurationClassPostProcessor(注解方式啟動(dòng) 完成 Spring IOC 工作 )實(shí)現(xiàn)類(lèi)中,調(diào)用優(yōu)先級(jí)就高于父類(lèi)方法,因此這里優(yōu)先級(jí)暫定比父類(lèi)高一些。
二、BeanPostProcessor (order:35)
BeanPostProcessor.png
基本定義
Spring Bean 實(shí)例化的處理器,包含兩個(gè)方法,實(shí)例化之前,實(shí)例化之后??梢岳斫鉃槭且环N代理模式,針對(duì)bean的實(shí)例化過(guò)程做一些擴(kuò)展,比如實(shí)例化前,做一些策略邏輯,實(shí)例化所需要的類(lèi),或者創(chuàng)建代理對(duì)象。實(shí)例化后,可以設(shè)置一些屬性值。
調(diào)用時(shí)機(jī)
這里先做一個(gè)說(shuō)明,此處調(diào)用時(shí)機(jī),僅針對(duì)直接實(shí)現(xiàn) BeanPostProcessor 類(lèi)型的,如果是其子類(lèi) 比如 InstantiationAwareBeanPostProcessor 實(shí)現(xiàn)類(lèi),調(diào)用時(shí)機(jī)由子類(lèi)決定。
doGetBean -> doCreateBean -> populateBean -> initializeBean
具體位置:AbstractAutowireCapableBeanFactory#initializeBean
針對(duì) 所有的 bean實(shí)例化,只要能走到 initializeBean 方法,均會(huì)調(diào)用。多個(gè)實(shí)現(xiàn)類(lèi)之間的順序已添加順序?yàn)橹魇褂肁rrayList存儲(chǔ)。
2.1 InstantiationAwareBeanPostProcessor (order: 34)
InstantiationAwareBeanPostProcessor 是 BeanPostProcessor 的一個(gè)子類(lèi),這個(gè)類(lèi)似乎并沒(méi)有什么用。有理解的歡迎補(bǔ)充。這里僅僅是做一個(gè)調(diào)用關(guān)系的說(shuō)明。
不同的子類(lèi)由不同的調(diào)用時(shí)機(jī),我們?cè)贁U(kuò)展的時(shí)候需要注意實(shí)現(xiàn)合適的接口。
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
}
調(diào)用時(shí)機(jī)
doGetBean -> createBean -> resolveBeforeInstantiation
在doCreateBean 之前。
具體位置:AbstractAutowireCapableBeanFactory#createBean -> resolveBeforeInstantiation()
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
implements AutowireCapableBeanFactory {
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
}
這里僅針對(duì) InstantiationAwareBeanPostProcessor 的實(shí)現(xiàn)類(lèi),觸發(fā)的方法為 其父類(lèi) BeanPostProcessor 聲明的方法,并沒(méi)有調(diào)用自己的方法。
同樣也是 所有的 bean 都會(huì)觸發(fā),只要滿(mǎn)足觸發(fā)的條件 hasInstantiationAwareBeanPostProcessors 。


