El ciclo de vida del frijol de primavera (parte 1)

Este artículo presenta principalmente la primera parte del ciclo de vida de springbean La estratificación de cada parte se completa de acuerdo con el postprocesador BeanPostProcessor.

El contenido completo de este artículo es

1. Almacene los objetos que necesitan ser un proxy op en la colección (el objeto existente AppConfig.class completa la mejora de CGLIB a través de BeanFactoryPostProcessor)

   BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # postProcessBeforeInstantiation ();

2. Método de construcción inferido para inicializar el objeto ( ensamblaje manual de constructor inferido de ioc por resorte , ensamblaje automático de constructor inferido por resorte de ioc )

   BeanPostProcessor # AutowiredAnnotationBeanPostProcessor # determineCandidateConstructors ();

3. Merge beanDefinition (complementado más adelante, se ha realizado algún procesamiento de fusión en el método BeanFactoryPostProcessor anterior)

4. Manejo de dependencias circulares (dependencias spring-ioc-cíclicas )

   BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # getEarlyBeanReference (); 

Este artículo presenta primero las dos imágenes del artículo anterior.

Como se muestra en la figura, hay 6 postprocesadores de bean en este momento. Ahora agregamos el soporte de habilitar aop a la clase de configuración del entorno de prueba

@EnableAspectJAutoProxy tendrá un AnnotationAwareAspectJAutoProxyCreator más

Como de costumbre, eche un vistazo al diagrama de herencia de BeanPostProcessor y hay muchas clases de implementación ...

 

个人觉得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;
      }
   }

// Hay cortes

}

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;
}

Manejo de dependencias circulares (consulte las dependencias  spring-ioc-cyclic )

Si la clase de configuración no está anotada con @EnableAspectJAutoProxy, entonces este postprocesador no estará presente. El código de getEarlyBeanReference () también regresará vacío directamente. Si se agrega, estará en el mapa  earlyProxyReferences.put (cacheKey, bean )

   BeanPostProcessor # AnnotationAwareAspectJAutoProxyCreator # getEarlyBeanReference (); 

La razón por la que el método de construcción no puede resolver el problema de la dependencia circular es que el postprocesador primero procesa la inicialización del método de construcción antes de resolver la dependencia circular, y el orden es diferente.

Consulte el diagrama de flujo rediseñado

 

Supongo que te gusta

Origin blog.csdn.net/qq_38108719/article/details/103385637
Recomendado
Clasificación