Principio AOP: análisis en profundidad del tiempo de ejecución de AnnotationAwareAspectJAutoProxyCreator

Como se mencionó en el capítulo anterior, la anotación @EnableAspectJAutoProxy usa AspectJAutoProxyRegistrar para crear y registrar el posprocesador AnnotationAwareAspectJAutoProxyCreator en el contenedor, de modo que cuando se crean otros beans más tarde, el posprocesador puede interceptar estos beans y realizar algún procesamiento.

Este capítulo habla principalmente sobre AnnotationAwareAspectJAutoProxyCreator interceptando el proceso de creación de otros beans.

1. Llame a finishBeanFactoryInitialization(beanFactory) en refresh()

Después de registrar todos los BeanPostProcessors en el capítulo anterior, se crearán instancias de todos los beans de instancia única restantes.

inserte la descripción de la imagen aquí

2. Llame a beanFactory.preInstantiateSingletons() en finishBeanFactoryInitialization

Crear instancias de todos los beans de instancia única restantes principalmente en el método beanFactory.preInstantiateSingletons()
inserte la descripción de la imagen aquí

List< String> beanNames = new ArrayList<>(this.beanDefinitionNames); Los nombres de todos los beans se almacenan en esta colección, y el bucle for recorrerá la colección una vez para crear los beans de instancia única restantes. Primero se creará el bean de la clase de configuración MainConfigOfAOP.

inserte la descripción de la imagen aquí

La clase de configuración también es un bean.

inserte la descripción de la imagen aquí

3. Llame a getBean()->doGetBean()

La primera mitad de doGetBean() comprobará por adelantado si el bean de instancia única se ha registrado en el grupo de singleton. Si está registrado, el frijol será envuelto y devuelto directamente.

inserte la descripción de la imagen aquí

Si no hay ningún singleton en el grupo, ejecute getSingleton(String beanName, ObjectFactory<?> singletonFactory) en la segunda mitad de doGetBean() para crear un bean.

inserte la descripción de la imagen aquí

4. Llame a getSingleton(String beanName, ObjectFactory<?> singletonFactory)

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

ObjectFactory<?> El parámetro de singletonFactory es una expresión lambda. Al ejecutar singletonFactory.getObject(), se llamará al método createBean(beanName, mbd, args) para crear el bean.

inserte la descripción de la imagen aquí

5. Llame a createBean(beanName, mbd, args)

En el método createBean(beanName, mbd, args), primero se obtendrá la información de definición de bean (información de definición de bean como singleton, carga no abstracta, no diferida, etc.), y luego el nombre del bean y la información de definición del bean se pasará para preparar Ejecute el método resolveBeforeInstantiation(beanName, mbdToUse).

inserte la descripción de la imagen aquí

6. Llame a resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd)

La función del método resolveBeforeInstantiation(beanName, mbdToUse) es dar a BeanPostProcessors la oportunidad de devolver un objeto proxy para reemplazar el objeto de destino que debe crearse.

inserte la descripción de la imagen aquí

7. Llame a applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName)

El método applyBeanPostProcessorsBeforeInstantiation recorrerá todos los BeanPostProcessors del tipo InstatiationAwareBeanPostProcessor, del mismo modo que AnnotationAwareAspectJAutoProxyCreator es el BeanPostProcessors del tipo InstatiationAwareBeanPostProcessor, por lo que el postProcessBeforeInst en AnnotationAwareAspectJAutoProxyCreator se ejecutará a continuación.

inserte la descripción de la imagen aquí

Aquellos que implementen la interfaz InstatiationAwareBeanPostProcessor implementarán los siguientes métodos.

inserte la descripción de la imagen aquí

8. Llame a postProcessBeforeInstantiation(Class<?> beanClass, String beanName)

Nota: Lo que se ejecuta aquí es postProcessBefore Instatiation en la interfaz InstatiationAwareBeanPostProcessor, que es diferente de postProcessbefore Initialization en la interfaz BeanPostProcessor . Dado que AnnotationAwareAspectJAutoProxyCreator implementa la interfaz SmartInstantiationAwareBeanPostProcessor, y la interfaz SmartInstantiationAwareBeanPostProcessor hereda la interfaz InstatiationAwareBeanPostProcessor, por lo que se ejecuta postProcessBefore Instatiation .
Diferencia:
postProcessBefore Instanciación es interceptar antes de instanciar el bean para verificar si el objeto proxy se puede devolver en lugar de la creación del objeto de destino,
postProcessbefore Initialization es procesar antes de inicializar el bean;

Entonces, este paso es el tiempo de ejecución de AnnotationAwareAspectJAutoProxyCreator.La función de AnnotationAwareAspectJAutoProxyCreator es interceptar y verificar si el objeto proxy se puede devolver antes de instanciar todos los beans restantes.

inserte la descripción de la imagen aquí

public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator
->public class AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
->public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
->public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware 
->public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor

Nueve, recurra a createBean ()

Dado que el primer bean creado es la clase de configuración MainConfigOfAOP, no se ha creado ningún objeto proxy, por lo que resolveBeforeInstantiation(beanName, mbdToUse) devuelve nulo y luego se ejecutará el método doCreateBean() para continuar creando objetos. El proceso del método doCreateBean() es similar al del capítulo anterior, por lo que no se analizará aquí. El bean creado final se almacenará en el grupo singleton.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_36602071/article/details/130024500
Recomendado
Clasificación