Prefacio
Este artículo presenta principalmente el contenido relevante sobre la carga de contexto cuando comienza la primavera. Se comparte para su referencia y aprendizaje. No diré mucho a continuación, echemos un vistazo a la introducción detallada juntos.
Prueba del código fuente Descargar Test-Annotation.zip
Hay el siguiente código
@ComponentPublic Class HelloWorldService {@Value ("$ {name: World}") Nombre de cadena privada; public String gethellomessage () {return "Hello" + this.name; }} @ConfigurationPublic Class Bootstrap {@Bean public static HelloworldService HELLOSERVICE () {return New HelloWorldService (); } public static void main (string [] args) {instantiationationStrategy instantiationationStrategy = new SimpleInStantiationStrategy (); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory (); BeanFactory.SetInstantiationstrategy (InstantiationationStrategy); AnnotationConfigApplicationContext ApplicationContext = new AnnotationConfigApplicationContext (BeanFactory); ApplicationContext.Register (bootstrap.class); ApplicationContext.Refresh (); HelloWorldService Service = ApplicationContext.GetBean (HelloWorldService.class); System.out.println (Service.gethellomessage ()); ApplicationContext.Close (); }} HelloWorldService.getHelloMessage Method simplemente devuelve el valor de nombre. BootStrap.main utiliza AnnotationConfigApplicationContext para construir un objeto de contexto. Para la comodidad de la demostración, las declaraciones mostradas de las instancias de FactoryFactory e Instantiations de Instantiations. Obtenga la referencia del Bean a través de ApplicationContext.GetBean () y llame service.getHelloMessage() .
La carga del contexto ocurre principalmente en applicationContext.register y applicationContext.refresh .
El propósito del método ApplicationContext.Register es generar un objeto BeanDefinition para el parámetro (clase anotada usando @Configuration) y llamar a DefaultListableBeanFactory.registerBeanDefinition para registrar el beandefinition en el defaultableBeanFactory.
La función de applicationContext.refresh() es más. La función principal es llamar al postprocesador para generar el objeto BeanDefinition correspondiente para el método de anotación @Bean en la clase @Configuration y registrarlo en el valor predeterminado de Factory. La segunda función es atravesar la beandefinition en el valor predeterminado de factory para generar el objeto real.
El proceso detallado de generación de un objeto BeanDefinition para el método de anotación @Bean en la clase @Configuration es el siguiente
Paso 1. Encuentre el procesador apropiado de BeanDefinitionRegistryPostPostPossor
org.springframework.context.support.postProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors () {... // Obtenga el beandefinitionRregistryRegistryPossorsor de bean Nombre de bean [] PostProcessornames = beanFactory.getBeanNamesFortype (False de BeandefinitionPosSprocessor. ... //GetPostProcessor based on beanName, The beanName of the @Configuration annotation class is //org.springframework.context.annotation.internalConfigurationAnnotationProcessor //Implemented as org.springframework.context.annotation.ConfigurationClassPostProcessor ConfigurationClassPostProcessor postProcessor = BeanFactory.getBean (PostProcessornames [0], BeandefinitionRegistryPostProcessor.class)} Paso 2: Genere el objeto ConfigurationClass para @Configuration
// Use ConfigurationClassParser para analizar la clase anotada por @Configuration,
// Cada clase anotada de @Configuration genera un objeto ConfigurationClass.
// ConfigurationClass.getBeanMethods() puede obtener todos los métodos en esta clase que usan @Bean Annotation.
// El método de anotación @Bean está representado por el objeto Beanmethod
org. this.componentsCanBeanNameGenerator, Registro); parser.parse (configcandidates); parser.validate (); this.Reader.LoadBeanDefinitions (parser.getConfigurationClasses ());}
Paso 3. El método de anotación de @Bean genera un beandefinition y lo inyecta en el defaultListableFactory
org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.LoadBeanDefinitionsforBeanMethod (Beanmethod Beanmethod) {ConfigurationClassBeanDefinition Beandef = nueva Configuración CLASSBeanDefinition (configClass); beandef.setBeanClassName (configclass.getMetadata (). getClassName ()); beandef.setFactoryMethodName (metadata.getMethodName ()); // Registry es una instancia de defaultListableBeanFactory this.registry.RegisterBeanDefinition (BeanName, Beandeftoregister);}Llame a la pila para este procedimiento:
Genere la pila de llamadas del procedimiento de instancia de acuerdo con BeanDefinition:
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.