Springソースコード-5番目のポストプロセッサノート

ブログ手動でソースコードを注入し、それは手動で注入ソースコードを記録し、実際には第六のポストプロセッサの使用であり、このブログは主に学習記録するように
第五のポストプロセッサと、ポストプロセッサは、実際に一緒に使用され手動注入中に6番目のポストプロセッサを使用

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

このメソッドでは、5番目と6番目のポストプロセッサがすべて呼び出されます。5番目のポストプロセッサは、属性インジェクションが必要かどうかを判断するために使用されます。これは拡張ポイントでもあります。特定のBeanの属性インジェクションを拡張する場合は、つまり、スプリング属性インジェクションを使用する代わりに、自分で属性インジェクションを実行する必要があります。そうすれば、ポストプロセッサを実装し、5番目のポストプロセッサメソッドを実装できます。このメソッドでは、指定されたBeanに対してfalseを返すため、指定されたBeanはBeanは、初期化プロセス中にスプリング属性インジェクションメソッドを呼び出しません

次に、最初にソースコードを見てみましょう

/**
 * 根据该标识判断是否需要进行属性注入
 */
boolean continueWithPropertyPopulation = true;

/**
 * 第五次调用后置处理器  判断是否需要填充属性;返回false,表示无需进行属性注入
 * 是调用的postProcessorAfterInstantiation方法,在这个方法里面,如果返回false,就不会再进行属性注入;
 * 所以,如果程序员要对所有注入的bean都不进行属性注入,就自己实现该方法,返回false即可(但是这种需求,一般也很少见吧)
 * 但是如果,只是要某一个bean不需要spring帮我们完成属性注入,一定要在扩展方法中加上对beanName的判断,否则的话,会导致所有的bean不进行属性注入
 * 因为每个bean在初始化的时候,都会去调用我们自己扩展的方法,只要有一个后置处理器的方法返回false,就不会属性填充了
 */
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    
    
  for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    
    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    
      InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
      if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    
    
        continueWithPropertyPopulation = false;
        break;
      }
    }
  }
}

if (!continueWithPropertyPopulation) {
    
    
  return;
}

これは5番目のポストプロセッサのコアメソッドです。ibp.postProcessAfterInstantiation(bw.getWrappedInstance()、beanName)メソッドがfalseを返すと、continueWithPropertyPopulation変数がfalseに設定され、直接返されます。プロパティを実行し続けます。注入

springが提供するポストプロセッサでは、このメソッドのロジック処理はそれほど多くなく、直接のデフォルトはtrueを返します。つまり、Springの6番目のポストプロセッサを使用して属性の入力を完了します。

特別な注意が必要な点は1つだけです。Beanに対して特別な処理を実行する必要がある場合、つまり、Springの属性インジェクションロジックを使用しない場合は、次のように5番目のポストプロセッサを拡張する必要があります。 beanPostProcessor実装クラスMySelfBeanPostProcessorを実装しました。5番目のポストプロセッサでは、beanNameが特別に処理されているかどうかを判断する必要があります。処理されている場合は、各Beanが初期化されているため、falseを返します。すべてのポストプロセッサと対応する判断が実行されます。メソッド。1つのbeanPostProcessorがfalseを返す限り、プロパティの挿入は実行されません。

おすすめ

転載: blog.csdn.net/CPLASF_/article/details/111645699