2つのスプリングソースの解釈

前の記事では、初期化メソッドのリフレッシュのライフサイクルに来ます

、いくつかの重要な方法についての話は、ここに記載し、例えばinvokeBeanFactoryPostProcessors finishBeanFactoryInitializationたリフレッシュ方法があります

prepareRefresh(); 

//内部ビーンファクトリをリフレッシュするためにサブクラスを教えてください。
ConfigurableListableBeanFactoryたBeanFactory = obtainFreshBeanFactory()。

//このコンテキストで使用するために豆の工場を準備します。
prepareBeanFactory(たBeanFactory)。
//コンテキストサブクラスでビーンファクトリの後処理を可能にします。
postProcessBeanFactory(たBeanFactory)。

//呼び出し工場プロセッサコンテキスト内でBeanとして登録。
invokeBeanFactoryPostProcessors(たBeanFactory)。

そのインターセプト豆の作成//登録豆プロセッサ。
registerBeanPostProcessors(たBeanFactory)。

//このコンテキストの初期化メッセージソース。
initMessageSource(); 

//このコンテキストの初期化イベントマルチキャスタ。
initApplicationEventMulticaster(); 

//初期化特定のコンテキストのサブクラス中の他の特別な豆。
onRefresh(); 

//リスナー豆をチェックし、それらを登録します。
registerListeners();

//インスタンス化のすべての残りの(非レイジーINIT)シングルトン。
finishBeanFactoryInitialization(たBeanFactory)。

//最後のステップ:対応するイベントを公開します。
finishRefresh();

この方法のinvokeBeanFactoryPostProcessorsのソースコードでまず外観

/ ** 
 *インスタンス化および登録されているすべてのBeanFactoryPostProcessor豆呼び出し、
 *与えられた場合には、明示的な秩序を尊重します。
 * <pは>シングルトンインスタンス化前に呼び出さなければなりません。
 * / 
保護されたボイドinvokeBeanFactoryPostProcessors(ConfigurableListableBeanFactoryたBeanFactory){ 
   PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(たBeanFactory、getBeanFactoryPostProcessors())。

   // LoadTimeWeaverを検出し、その間に見つかった場合は、製織準備
   (ConfigurationClassPostProcessorによって登録@Bean方法を通じて例えば)//  
   (beanFactory.getTempClassLoader()== NULL && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME))場合、{
      beanFactory.addBeanPostProcessor(新しいLoadTimeWeaverAwareProcessor(たBeanFactory))。
      beanFactory.setTempClassLoader(新しいContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); 
   } 
}

invokeBeanFactoryPostProcessorsのソースコードに進み、ここでの唯一のキーコードを掲載

文字列[] postProcessorNames = 
      beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class、真、偽)。
(文字列ppName:postProcessorNames)用{ 
   IF(beanFactory.isTypeMatch(ppName、PriorityOrdered.class)){ 
      currentRegistryProcessors.add(beanFactory.getBean(ppName、BeanDefinitionRegistryPostProcessor.class))。
      processedBeans.add(ppName)。
   } 
} 
sortPostProcessors(currentRegistryProcessors、たBeanFactory)。
registryProcessors.addAll(currentRegistryProcessors)。
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors、レジストリ); 
currentRegistryProcessors.clear();

どのbeanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class、真、偽)を実行します。

、前回の記事では、プロセッサによってのうち種類BeanDefinitionRegistryPostProcessorの種類によって、この方法で、

コンストラクタAnnotationConfigApplicationContextビルトインと呼ばれるものを含むいくつかのクラスを追加して完全なこのクラスの内部に、
ConfigurationClassPostProcessorクラス、また工場内の容器に、この時点で、我々はこのソースカテゴリを発見しました
パブリッククラスConfigurationClassPostProcessor実装BeanDefinitionRegistryPostProcessor、
      PriorityOrdered、ResourceLoaderAware、BeanClassLoaderAware、EnvironmentAware {

明らかにこのクラスが実装インタフェースBeanDefinitionRegistryPostProcessor、beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class、真、偽)で、このメソッドは、このクラスを取得することができ、その後、回収currentRegistryProcessorsの内側に入れ、invokeBeanDefinitionRegistryPostProcessorsメソッドが実行される、このメソッドの参照ポイントにソース

/ ** 
 *指定BeanDefinitionRegistryPostProcessor豆を起動します。
 * / 
プライベートの静的な無効invokeBeanDefinitionRegistryPostProcessors(
      コレクションポストプロセッサ、BeanDefinitionRegistryレジストリ<拡張BeanDefinitionRegistryPostProcessor?>){ 

   のために(BeanDefinitionRegistryPostProcessorポストプロセッサ:ポストプロセッサ){ 
      postProcessor.postProcessBeanDefinitionRegistry(レジストリ); 
   } 
}

ConfigurationClassPostProcessorのpostProcessBeanDefinitionRegistry方法で実行されています

/ ** 
 *レジストリで設定クラスから派生し、さらにBean定義。
 * / 
@Override 
公共ボイドpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryレジストリ){ 
   int型registryId = System.identityHashCode(レジストリ)。
   (this.registriesPostProcessed.contains(registryId))であれば、{ 
      (新しいIllegalStateExceptionがスロー
            +レジストリ"は既にに対してこのポストプロセッサで呼び出さpostProcessBeanDefinitionRegistry"); 
   } 
   IF(this.factoriesPostProcessed.contains(registryId)){ 
      新しいIllegalStateExceptionが(スロー
            +レジストリ"postProcessBeanFactoryが既にに対してこのポストプロセッサ上で呼ばれます")。
   }
   this.registriesPostProcessed.add(registryId)。

   processConfigBeanDefinitions(レジストリ); 
}

これprocessConfigBeanDefinitions方法をフォローアップしていき

セット<ConfigurationClass> alreadyParsed =新しいHashSetの<>(configCandidates.size()); 
{行う
   parser.parse(候補者を)。
   parser.validate(); 

   セット<ConfigurationClass> configClasses =新しいLinkedHashSetの<>(parser.getConfigurationClasses()); 
   configClasses.removeAll(alreadyParsed)。

   //読むモデルとその内容に基づいてBean定義を作成する
   場合(this.reader == nullの){ 
      this.reader =新しいConfigurationClassBeanDefinitionReader(
            レジストリ、this.sourceExtractor、this.resourceLoader、this.environment、
            this.importBeanNameGenerator、パーサ。 getImportRegistry())。
   }

この解析プロジェクトコントローラ、サービスおよびその他の注意事項を完了するために追加する方法、および分析プロセスのImportSelectores、情報ImportBeanDefinitionRegistor、そして最後に豆のインスタンス化の後ろに終わっこれらの分析BeanDefinitionの情報が格納され、これらを使用するマップに情報、今日の最初のポイントで、次のクラスは、Beanのインスタンスのライフサイクルを話すようになりました

公開された20元の記事 ウォンの賞賛4 ビュー20000 +

おすすめ

転載: blog.csdn.net/lj872224/article/details/104231284