Bean後置プロセッサ-I n s t a n tiationAwareBeanPostProcessor#applyBeanPostProcessorsBeforeInstantiation
9023 ワード
createBeanメソッドでdoCreateBeanメソッドの前に、次のコードが呼び出されます.
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean
これは拡張方法で、beanを返すと、後の作成プロセスに進まない.
ここでの実行タイミングに注意してください:オブジェクトがインスタンス化される前に実行
I n s t a n t i a tionAwareBeanPostProcessorというバックグラウンドプロセッサは、インスタンス化前のプロセッサだけでなく、インスタンス化後のプロセッサも定義.
したがって、ここで返すbeanがnullでない場合、プロセスの完全性を保証するために、インスタンス化後のプロセッサを実行する必要がある.
ここでは、インスタンス化後のコールバックは見ない.
直接applyBeanPostProcessorsBeforeInstantiation()メソッドを参照:
まず、このインタフェースを見てみましょう.
このインタフェースはBeanPostProcessorを継承し、beanのバックグラウンドプロセッサであることに気づいた.前の章で示したBeanFactoryバックグラウンドプロセッサとは異なります
ブレークポイントデバッグでは、6つのバックグラウンドプロセッサのうち、条件を満たすものは3つで、実行順に次のように並べられています.
1.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
2.CommonAnnotationBeanPostProcessor
3.AutowiredAnnotationBeanPostProcessor
では、次は、それぞれ何をしているのか見てみましょう.
ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor
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の後続の流れはやはり行きます
@Override
@Nullable
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
return null;
}
@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の後続の流れはやはり行きます
@Override
@Nullable
public Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException {
return null;
}