Prefácio
Este artigo apresenta principalmente o conteúdo relevante sobre o carregamento do contexto quando a primavera iniciar. É compartilhado para sua referência e aprendizado. Não vou dizer muito abaixo, vamos dar uma olhada na introdução detalhada juntos.
Teste o código-fonte download de teste-annotation.zip
Há o seguinte código
@ComPonentPublic Classe HelloworldService {@Value ("$ {Nome: World}") Nome da String Private; public string gethellomessage () {return "hello" + this.name; }} @ConfigurationPublic Classe bootstrap {@Bean public static helloworldservice heloservice () {return new helloworldservice (); } public static void main (string [] args) {instantationstrategy instantiationStrategy = new SimpleInstantiationStrategy (); DefaultListableBeanFactory BeanFactory = new DefaultListableBeanFactory (); beanfactory.setInstAntiationStrategy (instantationStrategy); ANNOTATIONCONFIGAPPLICATIONCONTEXT APLACIONCONTEXT = NOVA ANNOTATIONCONFIGAPplicationContext (BeanFactory); ApplicationContext.Register (bootstrap.class); ApplicationContext.Refresh (); HelloworldService Service = ApplicationContext.getBean (helloworldservice.class); System.out.println (Service.gethellomessage ()); ApplicationContext.Close (); }} HelloWorldService.getHelloMessage Método simplesmente retorna o valor do nome. BootStrap.main usa o anoTationConfigApplicationContext para construir um objeto de contexto. Para a conveniência da demonstração, as declarações exibidas das instâncias DefaultListableBeanFactory e InstantiationStrategy. Obtenha a referência do Bean através do ApplicationContext.getBean () e ligue para service.getHelloMessage() .
O carregamento do contexto ocorre principalmente no método applicationContext.register e applicationContext.refresh .
O objetivo do método ApplicationContext.Register é gerar um objeto BeaNDefinition para o parâmetro (classe anotada usando @configuration) e chamar DefaultListableBeanFactory.registerBeanDefinition para registrar a concessão do BeandEfinition no DefaultListableBeanFactory.
A função do applicationContext.refresh() é mais. A principal função é ligar para o pós -processador para gerar o objeto BeaNDefinition correspondente para o método de anotação @Bean na classe @Configuration e registrá -la no DefaultListableBeanFactory. A segunda função é percorrer a parte de beandEfinition no DefaultListableBeanFactory para gerar o objeto real.
O processo detalhado de gerar um objeto BeandEfinition para o método de anotação @Bean na classe @Configuration é o seguinte
Etapa 1. Encontre o processador apropriado do BEANDefinitionRegistryPostProcessor
org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors() { ... //Get the applicable BeanDefinitionRegistryPostProcessor bean name String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, falso); ... // getPostProcessor baseado no nome do feijão, o nome da classe de anotação @configuration é //org.springframework.context.annotation.internalconfiguraturationAngationProcessor // implementado como org.springframework.Context.annoTation.frigorntion Postprocessor = BeanFactory.getBean (Postprocessornames [0], BeandEfinitionRegistryPostprocessor.class)} Etapa 2: Gere o objeto ConfigurationClass para @configuration
// Use ConfigurationClassParser para analisar a classe anotada por @configuration,
// Cada classe anotada @configuration gera um objeto ConfigurationClass.
// ConfigurationClass.getBeanMethods() pode obter todos os métodos nesta classe que usam a anotação @Bean.
// O método de anotação @Bean é representado pelo objeto Beanmethod
org.springframework.context.annotation.configurationClassPostProcessor.processConfigbeanndefinitions (BeaNDefinitionRegistry Registry) {ConfigurationClassParSer Parser.ProMer. this.ComponentsCanBeanNameGenerator, Registry); parser.parse (configCandidates); parser.validate (); this.reader.loadBeandEfinitions (parser.getConfigurationClasses ());}Etapa 3. O método de anotação @Bean gera uma BeandEfinition e a injeta no DefaultListableBeanFactory
org.springframework.context.annotation.configurationClassBeanDefinitionReader.loadBeandEfinitionsforBeanMethod (beanmethod beanmethod) {ConfigurationClassBeandEfinition beandef = new ConfigurationClassBeandEnDefinition (ConfigClass); beandef.setbeanClassName (configclass.getMetadata (). getClassName ()); beandef.setFactoryMethodName (metadata.getMethodName ()); // Registry é uma instância de DefaultListableBeanFactory this.registry.registerbeandEfinition (Beanname, Beandeftoregister);}Ligue para este procedimento:
Gere a pilha de chamadas do procedimento de instância de acordo com a BeandEfinition:
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.