Bean后置處理器 - InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation


代碼片段:

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

if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            //如果返回為 false, 則會終止屬性注入
            if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                return;
            }
        }
    }
}

需要注意一個問題, 如果返回值是 false , 那么此處就回結束屬性注入方法: populateBean

這里遍歷了容器中的后置處理器, 然后調用滿足條件的 postProcessAfterInstantiation() 方法.

boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException

通過調試, 很明了的能發現, 有三個后置處理器能滿足條件, 調用先后順序為:

1.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor

2.CommonAnnotationBeanPostProcessor

3.AutowiredAnnotationBeanPostProcessor

 

根據前面調用的 InstantiationAwareBeanPostProcessor 后置處理器, 大致可以推斷, 這里估計啥也不會干.

因為 spring 的流程還沒走完呢, 怎么能終止呢!

 

ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor

這里是由其父類來完成的: 

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter#postProcessAfterInstantiation

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}

啥也沒干

 

CommonAnnotationBeanPostProcessor

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) {
    return true;
}

啥也沒干

 

AutowiredAnnotationBeanPostProcessor

由其父類完成:

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter

@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}

 

如我所想, 這里啥也沒干, 之所以這么留着, 我估計是spring擴展用的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM