Bean後置プロセッサ-I n s t a n tiationAwareBeanPostProcessor#postProcessAfterInstantiation

3736 ワード

コードクリップ:
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

デバッグにより、3つのバックグラウンドプロセッサが条件を満たすことが明らかになりました.呼び出しの順序は次のとおりです.
1.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
2.CommonAnnotationBeanPostProcessor
3.AutowiredAnnotationBeanPostProcessor
 
前に呼び出したI n s t a n t i a tionAwareBeanPostProcessorのバックグラウンドプロセッサによると、ここでは何もしないと推定できる.
スプリングの流れがまだ終わっていないので、どうして終わることができますか.
 

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拡張用だと思います.