春豆のライフサイクル(パート1)

この記事では、主にSpringbeanのライフサイクルの最初の部分を紹介します。各部分の階層化は、BeanPostProcessorポストプロセッサに従って完了します。

この記事の完成した内容は

1. aopプロキシである必要があるオブジェクトをコレクションに格納します(既存のオブジェクトAppConfig.classは、BeanFactoryPostProcessorを介してCGLIB拡張を完了します)

   BeanPostProcessor#AnnotationAwareAspectJAutoProxyCreator#postProcessBeforeInstantiation();

2.オブジェクトを初期化するための推測された構築メソッド(spring-ioc-推測されたコンストラクター-手動アセンブリspring-ioc-推測されたコンストラクター-自動アセンブリ

   BeanPostProcessor#AutowiredAnnotationBeanPostProcessor#determineCandidateConstructors();

3. beanDefinitionをマージします(後で補足されます。以前のBeanFactoryPostProcessorメソッドで一部のマージ処理が実行されました)

4.循環依存関係の処理(spring-ioc-cyclic依存関係

   BeanPostProcessor#AnnotationAwareAspectJAutoProxyCreator#getEarlyBeanReference(); 

この記事では、最初に前の記事の2つの写真を紹介します

図に示すように、現時点では6つのBeanポストプロセッサがあります。テスト環境の構成クラスにaopの有効化のサポートを追加します。

@EnableAspectJAutoProxyにはもう1つのAnnotationAwareAspectJAutoProxyCreatorがあります

いつものように、BeanPostProcessorの継承図を見てください。多くの実装クラスがあります...

 

个人觉得springbean的生命周期就是从创建bean开始的AbstractAutowireCapableBeanFactory#createBean()
所以我们有了 BeanPostProcessor 后置处理器的第一步解决了将需要进行代理的对象存到了一个集合中,下面来看代码

BeanPostProcessor#AnnotationAwareAspectJAutoProxyCreator#postProcessBeforeInstantiation();

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
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.
      // 判断是否为一个合成的bd(默认false) &&  默认true
      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;
}
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;
}
AnnotationAwareAspectJAutoProxyCreator
--postProcessBeforeInstantiation -- advisedBeans.put(object,false)--处理后返回null
advisedBeans 已经有appconfig 呢,bean工厂后置处理器已代理
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
   Object cacheKey = getCacheKey(beanClass, beanName);

   if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
      if (this.advisedBeans.containsKey(cacheKey)) {
         return null;
      }
      // 判断这个对象是否是一个代理对象,已经存在AppConfig.class
      if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
         this.advisedBeans.put(cacheKey, Boolean.FALSE);
         return null;
      }
   }

//カットがあります

}

protected boolean isInfrastructureClass(Class<?> beanClass) {
   return (super.isInfrastructureClass(beanClass) ||
         (this.aspectJAdvisorFactory != null && this.aspectJAdvisorFactory.isAspect(beanClass)));
}
public boolean isAspect(Class<?> clazz) {
   return (hasAspectAnnotation(clazz) && !compiledByAjc(clazz));
}

//返回true 包含注解@Aspect
private boolean hasAspectAnnotation(Class<?> clazz) {
   return (AnnotationUtils.findAnnotation(clazz, Aspect.class) != null);
}
//返回false 获取到属性值 BServiceBo bServiceBo getName不包含AJC_MAGIC
private boolean compiledByAjc(Class<?> clazz) {
   for (Field field : clazz.getDeclaredFields()) {
      if (field.getName().startsWith(AJC_MAGIC)) {
         return true;
      }
   }
   return false;
}

循環依存関係の処理(  spring-ioc-cyclic依存関係を参照)

構成クラスに@EnableAspectJAutoProxyアノテーションが付けられていない場合、このポストプロセッサーは存在しません。getEarlyBeanReference()コードも直接空を返します。追加された場合、マップに含まれます 。earlyProxyReferences.put(cacheKey、bean )

   BeanPostProcessor#AnnotationAwareAspectJAutoProxyCreator#getEarlyBeanReference(); 

構築方法が循環依存の問題を解決できない理由は、ポストプロセッサが循環依存を解決する前に構築方法の初期化を最初に処理し、順序が異なるためです。

再描画されたフローチャートを参照してください

 

おすすめ

転載: blog.csdn.net/qq_38108719/article/details/103385637