Proceso de inicio de primavera (a)
Para escribir una demostración de prueba en forma de java-config, cree un nuevo AnnotationConfigApplicationContext. Si está en formato XML, use ClassPathXmlApplicationContext;
Ambas clases heredan de la clase AbstractApplicationContext. consulte el diagrama de jerarquía a continuación.
Nota: Si no especifica parámetros en el nuevo AnnotationConfigApplicationContext(), se generará una excepción de tiempo de ejecución: org.springframework.context.annotation.AnnotationConfigApplicationContext(). AnnotationConfigApplicationContext@6ebc05a6 aún no se ha actualizado
La construcción parametrizada de AnnotationConfigApplicationContext ejecutará tres métodos, que son su propia construcción sin parámetros.
AnnotationConfigApplicationContext aún no se ha actualizado
Referencia AnnotationConfigApplicationContext El constructor ejecutará tres métodos, a saber, su propio constructor sin información, registrar () y actualizar ().
Antes de ejecutar el constructor no parametrizado de AnnotationConfigApplicationContext, llama al constructor no parametrizado de la clase principal GenericApplicationContext;
Esta es la primera vez que vemos AnnotationConfigApplicationContext en acción.
Cree una instancia de DefaultListableBeanFactory en GenericApplicationContext, lo que significa que la fábrica de beans es en realidad una propiedad del contexto de la aplicación.
Como se puede ver en el diagrama de jerarquía de clases anterior: contexto del programa de aplicación y Como se puede ver en el diagrama de jerarquía de clases anterior: tanto el contexto de la aplicación como la fábrica de beans implementan la interfaz BeanFactory.
Como se mencionó anteriormente, utilizamos AnnotationConfigApplicationContext de Spring como punto de entrada para comprender IOC, entonces, ¿cómo lee Spring clases con anotaciones específicas (como @Service, @Repository) y las convierte en objetos BeanDefinition?
¿Cómo escanear un directorio de paquete específico en busca de objetos Bean?
Por lo tanto, necesitamos un nuevo lector de configuración de anotaciones y un escáner de rutas.
AnnotatedBeanDefinitionReader ejecutará el método RegisterAnnotationConfigProcessors (this.registry) en AnnotationConfigUtils, que registrará el procesador integrado de Sprign.
El método RegisterAnnotationConfigProcessors utiliza la nueva RootBeanDefinition (XX.class) para crear una nueva RootBeanDefinition (la implementación de BeanDefinition) y luego llama a RegisterPostProcessor para guardar la beanDefinition correspondiente al Bean incorporado en la fábrica de beans;
Lo que hay que explicar aquí es: Acabamos de hablar sobre registrar Beans, que en realidad es guardar la definición de bean correspondiente al Bean incorporado en la fábrica de beans. Entonces, ¿por qué necesitamos guardar beanDefinition? Debido a que Spring crea instancias de objetos según la descripción del bean en beanDefinition, incluso si define un bean, debe resolverse en un beanDefinition y registrarse.
Uno de los componentes principales es ConfigurationClassPostProcessor y AutowiredAnnotationBeanPostProcessor. El primero es un posprocesador beanFactory utilizado para completar el escaneo e inyección de beans, y el segundo es un posprocesador de beans utilizado para completar @AnnotationBeanPostProcessor.bean. El @AutoWired del controlador se inyecta automáticamente.
Este paso se utiliza principalmente para analizar la clase de configuración Spring pasada por el usuario, analizarla en un BeanDefinition y luego registrarla en el contenedor. El código fuente principal es el siguiente:
Generando AnnotatedGenericBeanDefinition, luego analícelo, asigne valores a otras propiedades de BeanDefinition y luego registre BeanDefinition en el contenedor. El código fuente principal es el siguiente:
Generando un AnnotatedGenericBeanDefinition, analizándolo, asignando valores a otras propiedades de BeanDefinition y luego encapsulando beanDefinition y beanName en el objeto BeanDefinitionHolder y registrándolo con el fábrica de frijoles (esto significa que beanName y baenDefinition se encapsulan en Map, y beanName se coloca en la lista. Tanto Map como list son propiedades mantenidas por DefaultListableBeanFactory), que es lo mismo que el registro de beans integrados en la sección anterior.
La ejecución finaliza aquí y el método de registro finaliza aquí. Al observar el atributo beanDefinitionMap en BeanFactory a través de los puntos de interrupción, podemos ver que: los métodos this() y this.register(componentClasses) pasan beans integrados. y nuestra propiedad de configuración beanDefinitionMap. Se ha registrado la definición de bean del bean de configuración, los beans personalizados marcados con @Component y otras anotaciones, etc., aún no se han procesado.