序文
この記事では、主に、スプリングが開始されたときのコンテキストの読み込みに関する関連コンテンツを紹介します。参照と学習のために共有されます。以下ではあまり言いません。詳細な紹介を一緒に見てみましょう。
テストソースコードダウンロードtest-annotation.zip
次のコードがあります
@componentPublic Class HelloWorldService {@value( "$ {name:world}")private string name; public string gethellomessage(){return "hello" + this.name; }} @configurationpublic class bootstrap {@bean public static helloworldservice helloservice(){return new helloworldservice(); } public static void main(string [] args){instantiationstrategy instantiationstrategy = new simpleinstantiationstrategy(); DefaultListableBeanFactory BeanFactory = new DefaultListableBeanFactory(); beanfactory.setinstantiationstrategy(instantiationstrategy); 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メソッドは、単に名前の値を返すだけです。 BootStrap.mainメソッドは、annotationconfigapplicationContextを使用してコンテキストオブジェクトを構築します。デモンストレーションの便利さのために、defaultListableBeanFactoryおよびInstantiationStationationtationtiationのインスタンスの表示された宣言。 ApplicationContext.getBean()を介してBeanの参照を取得し、 service.getHelloMessage()メソッドを呼び出します。
コンテキストのロードは、主にapplicationContext.registerメソッドとapplicationContext.refreshメソッドで発生します。
ApplicationContext.registerメソッドの目的は、パラメーターのBeanDefinitionオブジェクト(@Configurationを使用してアノテーションされたクラス)を生成し、 DefaultListableBeanFactory.registerBeanDefinitionを呼び出して、beanDefinitionをdefaultListableBeanFactoryに登録することです。
applicationContext.refresh()の関数はもっとです。主な機能は、@Configurationクラスの@Beanアノテーション法の対応するBeanDefinitionオブジェクトを生成し、DefaultListableBeanFactoryに登録するために、ポストプロセッサを呼び出しています。 2番目の関数は、defaultListableBeanFactoryでBeanDefinitionを横断して、実際のオブジェクトを生成することです。
@configurationクラスの@Beanアノテーション法のビーンデフィニッションオブジェクトを生成する詳細なプロセスは次のとおりです。
ステップ1。適切なBeanDefinitionRegistryPostProcessorプロセッサを見つけます
org.springframework.context.support.postprocessorregistrationdelegate.invokebeanfactorypostprocessors(){... //該当するbeandefinitionregistrypostprocessor bean name string [] postprocessornames = beanfactory.getbeannamesturtype(beandefinitiontpostpoppe)を取得します。 ... // getPostProcessor beanNameに基づく、@configuration annotationクラスのbeannameは//org.springframework.context.annotation.internalconfigurationannotationprocessor // = BeanFactory.getBean(PostProcessornames [0]、BeanDefinitionRegistryPostProcessor.class)}ステップ2:@configuration用のConfigurationClassオブジェクトを生成します
// configurationclassparserを使用して、@configurationで注釈されたクラスを解析します。
//各@Configuration Annotatedクラスは、ConfigurationClassオブジェクトを生成します。
// ConfigurationClass.getBeanMethods() @Bean Annotationを使用するこのクラスのすべてのメソッドを取得できます。
// @Beanアノテーション方法は、BeanMethodオブジェクトで表されます
springframework.context.annotation.configurationclasspostprocessor.processconfigbeandefinitions(beandefinitionregistry registry){configurationClassParser Parser = new ConfigurationClassParser(this.metadatareadererfactory、これ。 this.comPonentsCanbeanNameGenerator、レジストリ); parser.parse(configcandidates); parser.validate(); this.reader.loadbeandefinitions(parser.getConfigurationClasses());}ステップ3. @Beanアノテーションメソッドはビアンデフィニッションを生成し、defaultListableBeanFactoryに注入します
org.springframework.context.annotation.configurationClassbeanDefinitionReader.LoadBeanDefinitionSForBeanMethod(BeanMethod BeanMethod){configurationClassBeanDefinition beandef = new ConfigurationClassBeanDefinition(ConfigClass); beandef.setbeanClassName(configClass.getMetaData()。getClassName()); beandef.setFactoryMethodName(Metadata.getMethodName()); //レジストリは、defaultListableBeanFactory this.registry.registerbeandefinition(beanname、beandeftoregister);}のインスタンスです。この手順のためにスタックを呼び出します:
BeanDefinitionに従ってインスタンス手順のコールスタックを生成します。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。