春のソースポストプロセッサ

で、「いくつかのカスタムの初期化と破壊法春のライフサイクル、」最後の段落は、春には、それを行う方法で、実行タイミングの初期化と破壊の方法の間に開始Springコンテナを記述する?

登録メインコンフィギュレーションクラス

春が使用するAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class);指定されたマスターの設定クラスを、そしてそれをたBeanFactoryに登録します。次のようにメインコンフィギュレーションクラスに加えて、いくつかの基本的なポストプロセッサは、たBeanFactoryクラスに登録されます。

  1. たBeanFactoryを投稿する初期化AnnotatedBeanDefinitionReader、内部レジスタ

    • internalConfigurationAnnotationProcessor-> ConfigurationClassPostProcessor
    • internalAutowiredAnnotationProcessor-> AutowiredAnnotationBeanPostProcessor
    • internalCommonAnnotationProcessor-> CommonAnnotationBeanPostProcessor
    • internalPersistenceAnnotationProcessor->をPersistenceAnnotationBeanPostProcessor
    • internalEventListenerProcessor-> EventListenerMethodProcessor
    • internalEventListenerFactory-> DefaultEventListenerFactory
  2. 初期ClassPathBeanDefinitionScanner、環境負荷と資源配分

    • 環境
    • ResourceLoader

登録財団たBeanFactory

リフレッシュ()

(非常にAbstractApplicationContext.refreshスプリングコア源)は、名前が示唆する、これは更新操作を初期化するために、アプリケーション・コンテキスト・スプリング、スプリングコンテナを更新するために使用される方法です。

// 部分源码
public void refresh() {
    // 取出注册的 BeanFactory
    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    // 配置 BeanFactory
    prepareBeanFactory(beanFactory);
    // 初始化执行 BeanFactory 后置处理器
    invokeBeanFactoryPostProcessors(beanFactory);
    // 注册 Bean 后置处理器
    registerBeanPostProcessors(beanFactory);
    // 执行 Bean 后置处理器
    finishBeanFactoryInitialization(beanFactory);
}

図1に示すように、ポストプロセッサの初期化実行たBeanFactory

全体の順序


ファーストクラスはBeanDefinitionRegistryPostProcessorを達成するために実行されます

  1. 実行のBeanDefinitionRegistryPostProcessor PriorityOrderedを達成しました。
  2. BeanDefinitionRegistryPostProcessorの実行が達成命じました。
  3. 残りのすべてのBeanDefinitionRegistryPostProcessorの実装。

上記のすべてのステップは、実行postProcessBeanDefinitionRegistry BeanDefinitionRegistryPostProcessor()メソッドに進み、コンテナ==初期豆==で初めてとなります。BeanDefinitionRegistryPostProcessorはBeanFactoryPostProcessorを継承しているので、それはまた、postProcessBeanFactory()メソッドを実行します。


その後、クラスを達成するために実行BeanFactoryPostProcessor

  1. 実行のBeanFactoryPostProcessor PriorityOrderedを達成しました。
  2. BeanFactoryPostProcessorの実行が達成命じました。
  3. 残りのすべてのBeanFactoryPostProcessorの実装。

上記のすべてのステップは、実行postProcessBeanFactory BeanFactoryPostProcessor()メソッドに進み、コンテナ==初期豆==で初めてとなります。


実装の詳細

ConfigurationClassPostProcessor例、このクラスはクラス@Configuration注釈ブート構成クラス、BeanDefinitionRegistryPostProcessor実装クラスであり、登録時のメインクラスの構成は、ほかに、たBeanFactoryを登録し、また、そのようなPriorityOrderedを達成するため、実行順序から見ましたそれが優先されます。

1、ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()

  1. まず、メインの構成カテゴリ、すなわちマーク@Configurationクラスを見つけます。
  2. クラスConfigurationClassParserを作成するように構成されたパーサ、方法doProcessConfigurationClass(主構成クラス)への入口は、春の次の順序ですべてのコンポーネントを見つけ、主な構成にコメントを入力するために応じてマークされます。
    • @PropertySource構成データをキャッシュにロード
    • クラス@ComponentScan走査経路のすべてのクラス、フィルタのアノテーションクラス@Component
    • @importロードされたクラス@importが導入されました。クラスがImportSelectorある場合は、そのメソッドのselectImportsを()を実行することになります。それはImportBeanDefinitionRegistrarある場合は、単にキャッシュを追加し、それが彼の方法を実行しません。そうでない場合は、直接@Configuration注釈処理として。
    • @ImportResource
    • @Beanロードされたマーク@Bean方法。
    • インターフェイスのデフォルトの方法
  3. すべてのコンポーネントが見つかり、たBeanFactoryに@importインポートするクラスを登録してConfigurationClassBeanDefinitionReader。この時点で、それはImportBeanDefinitionRegistrar.registerBeanDefinitions()メソッドを実行します

2、ConfigurationClassPostProcessor.postProcessBeanFactory()

  1. postProcessBeanFactory BeanDefinitionRegistryPostProcessor実装クラスを実行する()、強化された構成クラスCGLIBを使用して
  2. ポストプロセッサをサインアップImportAwareBeanPostProcessor

3、ImportAwareBeanPostProcessor.postProcessBeanFactory()

  1. 回调ImportAware.setImportMetadata()

残りpostProcessBeanFactory BeanFactoryPostProcessor実装クラスに従ってください()


これまでのところ、BeanFactoryPostProcessorとBeanDefinitionRegistryPostProcessorオーバーが実行されているが、豆の初期化の習慣の一部が開始されていない、あなたはビーンポストプロセッサを実行する必要があります。

invokeBeanFactoryPostProcessors

図2に示すように、ポストプロセッサは、豆を行います

このメソッドは、すべての単一の実施形態では、非遅延読み込みオブジェクトがインスタンス化されます。

主要なプロセス:

  1. 初期豆== ==
  2. 回调SmartInitializingSingleton.afterSingletonsInstantiated()

この時点で、コンテナBeanが、それを見て、その後に作成し、されています==黄色い豆に==初期化プロセスをラベル付けされた、「春のライフサイクルをカスタマイズする方法はいくつかの初期化と破壊のプロセスのいくつかを」で説明されています内部の実行。

finishBeanFactoryInitialization

3、初期豆== ==

AbstractBeanFactoryたBeanFactoryはビーンの入り口を作成する)doGetBean(である、抽象実装クラスです。まず、それはへの直接アクセスがあった場合には、豆のキャッシュをチェックし、返します。キャッシュが存在しない場合は、豆のプロセスを作成するために見えます。

AbstractAutowireCapableBeanFactoryは)メソッドたcreateBean AbstractBeanFactoryは豆を(作成実装し、春には、Beanインスタンスを作成するために、そのメソッドをdoCreateBean()を呼び出します。

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {

    // 1.反射执行构造器方法
    BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
    
    // 属性赋值
    populateBean(beanName, mbd, instanceWrapper);
    // 初始化 Bean
    exposedObject = initializeBean(beanName, exposedObject, mbd);->4.afterPropertiesSet->5.invokeCustomInitMethod

    return exposedObject;
}

上記ソースにinitializeBean()メソッドが順次実行されます

  • BeanPostProcessor.postProcessBeforeInitialization()
  • @PostConstruct
  • InitializingBean.afterPropertiesSet()
  • initMethod()
  • BeanPostProcessor.postProcessAfterInitialization()

次のようにメインソースコードとコメント

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
    // 执行 Aware 接口实现方法
    invokeAwareMethods(beanName, bean);

    // 2.执行 BeanPostProcessor.postProcessBeforeInitialization()
    // 3.上面的方法内部实际上回去执行 @PostConstruct 注解的方法
    applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

    // 4.执行 InitializingBean.afterPropertiesSet()
    // 5.然后执行自定义的 initMethod() 方法
    invokeInitMethods(beanName, wrappedBean, mbd);
    
    // 6.执行 BeanPostProcessor.postProcessAfterInitialization()
    wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

    return wrappedBean;
}

なお、initializeBean()メソッドinvokeAwareMethods()は認識そのインタフェース部の実装方法を実行するために行く、見るスプリングアウェア源

初期ビーン


概要

  • スプリングが開始されると、第一のクラス及び構成は、クラス登録するポストプロセッサのための主要な基礎となるたBeanFactory
  • コールリフレッシュ()メソッドは、上述したポストプロセッサでたBeanFactoryを除去し、ポストプロセッサの実装は、すべての利用可能な豆たBeanFactoryにスキャンレジスタを行います
  • たBeanFactory利用可能なすべての豆の最終初期化

おすすめ

転載: www.cnblogs.com/bigshark/p/11306585.html