Directorio de artículos
- 1. Llame a finishBeanFactoryInitialization(beanFactory) en refresh()
- 2. Llame a beanFactory.preInstantiateSingletons() en finishBeanFactoryInitialization
- 3. Llame a getBean()->doGetBean()
- 4. Llame a getSingleton(String beanName, ObjectFactory<?> singletonFactory)
- 5. Llame a createBean(beanName, mbd, args)
- 6. Llame a resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd)
- 7. Llame a applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName)
- 8. Llame a postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
- Nueve, recurra a createBean ()
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.
2. Llame a beanFactory.preInstantiateSingletons() en finishBeanFactoryInitialization
Crear instancias de todos los beans de instancia única restantes principalmente en el método beanFactory.preInstantiateSingletons()
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.
La clase de configuración también es un bean.
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.
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.
4. Llame a getSingleton(String beanName, ObjectFactory<?> singletonFactory)
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.
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).
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.
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.
Aquellos que implementen la interfaz InstatiationAwareBeanPostProcessor implementarán los siguientes métodos.
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.
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.