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

9023 ワード

createBeanメソッドでdoCreateBeanメソッドの前に、次のコードが呼び出されます.
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//   bean   , bean , 
//  ,  , spring 
// spring  InstantiationAwareBeanPostProcessor
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
    return bean;
}

これは拡張方法で、beanを返すと、後の作成プロセスに進まない. 
ここでの実行タイミングに注意してください:オブジェクトがインスタンス化される前に実行
@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;
}

I n s t a n t i a tionAwareBeanPostProcessorというバックグラウンドプロセッサは、インスタンス化前のプロセッサだけでなく、インスタンス化後のプロセッサも定義. 
したがって、ここで返すbeanがnullでない場合、プロセスの完全性を保証するために、インスタンス化後のプロセッサを実行する必要がある. 
ここでは、インスタンス化後のコールバックは見ない.
 
直接applyBeanPostProcessorsBeforeInstantiation()メソッドを参照:
@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class> beanClass, String beanName) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
            if (result != null) {
                return result;
            }
        }
    }
    return null;
}

 
まず、このインタフェースを見てみましょう.
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {

    @Nullable
    default Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
        return null;
    }

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

   
    @Nullable
    default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
            throws BeansException {

        return null;
    }

  
    @Deprecated
    @Nullable
    default PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

        return pvs;
    }

}

このインタフェースはBeanPostProcessorを継承し、beanのバックグラウンドプロセッサであることに気づいた.前の章で示したBeanFactoryバックグラウンドプロセッサとは異なります
 
ブレークポイントデバッグでは、6つのバックグラウンドプロセッサのうち、条件を満たすものは3つで、実行順に次のように並べられています.
1.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
2.CommonAnnotationBeanPostProcessor
3.AutowiredAnnotationBeanPostProcessor
 
では、次は、それぞれ何をしているのか見てみましょう.

ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor


org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter#postProcessBeforeInstantiation
@Override
@Nullable
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
    return null;
}

ここから見ると、彼自身はこの方法を実現したり書き直したりするのではなく、その親によって実現されている.
中身は何もせずnullに戻った.
 

CommonAnnotationBeanPostProcessor

@Override
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) {
    return null;
}

何もしてない
 

AutowiredAnnotationBeanPostProcessor


org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter#postProcessBeforeInstantiation
@Override
@Nullable
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
    return null;
}

彼自身もこの方法を実現していないで、父類が実現したのです.
中も何もしていません.
 
ここまで来ると、この後置プロセッサは実行済みで、みんな仕事をしていないので、直接戻ってきたnullです.だからspringの後続の流れはやはり行きます