Préface
Cet article présente principalement le contenu pertinent sur le chargement du contexte lorsque le printemps commence. Il est partagé pour votre référence et votre apprentissage. Je ne dirai pas beaucoup ci-dessous, jetons un coup d'œil à l'introduction détaillée ensemble.
Test Source Code Télécharger Test-Annotation.zip
Il y a le code suivant
@Componentpublic class helloworldService {@value ("$ {name: world}") Nom de chaîne privée; public String gethelloMessage () {return "Hello" + this.name; }} @ ConfigurationPublic classe bootstrap {@bean public static helloworldService HellOservice () {return newLoworldService (); } public static void main (string [] args) {instanciationStrategy instanciationStrategy = new SimpleInstantiationStrategy (); DefaultListableBeAnfactory Beanfactory = new defaultListableBeAnfactory (); beanfactory.setinstantiationstrategy (instanciationStrategy); 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 Renvoie simplement la valeur du nom. BootStrap.main utilise AnnotationConfigApplicationContext pour construire un objet de contexte. Pour la commodité de la démonstration, les déclarations affichées d'instances par défaut de DefaultListableBeanfactory et InstantiationStrategy. Obtenez la référence du bean via ApplicationContext.getBean () et appelez service.getHelloMessage() .
Le chargement du contexte se produit principalement dans applicationContext.register et applicationContext.refresh .
Le but de la méthode ApplicationContext.Register est de générer un objet BeanDefinition pour le paramètre (classe annotée à l'aide de @configuration) et d'appeler DefaultListableBeanFactory.registerBeanDefinition pour enregistrer la BeanDefinition dans le par défaut de FinableFactory.
La fonction d' applicationContext.refresh() est plus. La fonction principale est d'appeler le postprocesseur pour générer l'objet BeanDefinition correspondant pour la méthode d'annotation @Bean dans la classe @configuration et de l'enregistrer dans le par défautListableBeanFactory. La deuxième fonction consiste à traverser le BeanDefinition dans le par défaut d'IntendableBeAnfactory pour générer l'objet réel.
Le processus détaillé de génération d'un objet BeanDefinition pour la méthode d'annotation @bean dans la classe @configuration est le suivant
Étape 1. Trouvez le processeur de processeur de Post-Processeur approprié
org.springframework.context.support.postprocessorRecgrationDelegate.invokeBeanFactoryPostProcessors () {... // Obtenez le beandefinitiongistrypostprocessor name de bean [] postprocessorames = beanfactory.getBamesforty (beandefinitionReglitPostprocessor.class, false); ... // getPostProcessor basé sur le nom de beanname, le nom de beanname de la classe d'annotation @configuration est //org.springframework.context.annotation.internalconfigurationnotationprocessor // implémenté comme org.springframework.contex = beanfactory.getBean (postprocessorames [0], beandefinitiongistrypostprocessor.class)} Étape 2: Générez l'objet ConfigurationClass pour @configuration
// Utilisez ConfigurationClassParser pour analyser la classe annotée par @configuration,
// Chaque classe annotée @configuration génère un objet ConfigurationClass.
// ConfigurationClass.getBeanMethods() peut obtenir toutes les méthodes de cette classe qui utilisent @Bean Annotation.
// La méthode d'annotation @bean est représentée par l'objet BeanMethod
org.springframework.context.annotation.configurationclasspostprocessor.processConfigBeAndefinitions (Registre BeanDefinitionRegistry) {ConfigurationClassParser PARSER = NOUVEAU ConfigurationClassPaSer (this.metadataReader this.componentScanBeanNameGenerator, Registry); parser.parse (configCandidates); parser.validate (); this.reader.loadBeAndefinitions (parser.getConfigurationClasses ());}Étape 3. La méthode d'annotation @Bean génère une BeanDefinition et l'injecte dans le par défaut de BEALFACTORY
org.springframework.context.annotation.configurationclassbeAndefinitionReader.LoadBeAndeFinitionsForBeanMethod (BeanMethod BeanMethod) {ConfigurationClassBeanDeFinition BeanDef = new ConfigurationClassBeanDeFinIition (ConfigClass); beandef.setBeANClassName (configClass.getMetAdata (). getClassName ()); beandef.setfactoryMethodName (metadata.getMethodName ()); // Le registre est une instance de DefaultListableBeanFactory this.registry.registerBeAndefinition (beanname, beandeftoregister);}Pile d'appels pour cette procédure:
Générez la pile d'appels de la procédure d'instance en fonction de BeanDefinition:
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.