SpringPostProcessor-BeanFactoryPostProcessorおよびBeanDefinitionRegistryPostProcessor



Spring Post Processor Beanfactorypostprocessor



BeanPostProcessor :beanポストプロセッサ、bean作成オブジェクトは初期化の前後にインターセプトされます


BeanFactoryPostProcessorとは何ですか?beanFactoryのポストプロセッサ
* BeanFactoryの内容をカスタマイズおよび変更するために、BeanFactory標準の初期化後に呼び出されます
*すべてのBean定義が保存され、beanFactoryにロードされましたが、Beanインスタンスはまだ作成されていません。
*
BeanFactoryPostProcessorの原則:
* 1)、iocコンテナ作成オブジェクト
* 2)、invokeBeanFactoryPostProcessors(beanFactory)
*すべてのBeanFactoryPostProcessorsを見つけてそれらのメソッドを実行する方法
* 1)BeanFactoryPostProcessorのすべてのコンポーネントをBeanFactoryで直接検索し、それらのメソッドを実行します
* 2)、他のコンポーネントを初期化する前に実行する




BeanDefinitionRegistryPostProcessorとは何ですか:
BeanDefinitionRegistryPostProcessorはBeanFactoryPostProcessorを拡張します
* postProcessBeanDefinitionRegistry()
*すべてのBean定義情報がロードされようとしていて、Beanインスタンスがまだ作成されていない場合にロードされます
*
*BeanFactoryPostProcessorよりも優先して実行されます
*BeanDefinitionRegistryPostProcessorを使用して、コンテナにコンポーネントを追加します
*
BeanDefinitionRegistryPostProcessor 原理:
* 1)、ioccreateオブジェクト
* 2)、refresh()-》 invokeBeanFactoryPostProcessors(beanFactory)
* 3)コンテナからすべてのBeanDefinitionRegistryPostProcessorコンポーネントを取得します。
* 1.すべてのpostProcessBeanDefinitionRegistry()メソッドを順番にトリガーします
* 2、次にpostProcessBeanFactory()メソッドBeanFactoryPostProcessorをトリガーします
*
* 4)次に、コンテナからBeanFactoryPostProcessorコンポーネントを見つけ、postProcessBeanFactory()メソッドを順番にトリガーします。


実行の順序に注意してください。 BeanDefinitionRegistryPostProcessorはBeanFactoryPostProcessorよりも優先され、BeanFactoryPostProcessorはBeanのインスタンス化よりも優先されます



テスト:

1、新しいMyBeanDefinitionRegistryPostProcessor.javaクラスを作成します

  1. package com.atguigu.ext
  2. import org.springframework.beans.BeansException
  3. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
  4. import org.springframework.beans.factory.support.AbstractBeanDefinition
  5. import org.springframework.beans.factory.support.BeanDefinitionBuilder
  6. import org.springframework.beans.factory.support.BeanDefinitionRegistry
  7. import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
  8. import org.springframework.beans.factory.support.RootBeanDefinition
  9. import org.springframework.stereotype.Component
  10. import com.atguigu.bean.Blue
  11. @Component
  12. public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
  13. @Override
  14. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  15. // TODO Auto-generated method stub
  16. System.out.println('Number of MyBeanDefinitionRegistryPostProcessor...beans:'+beanFactory.getBeanDefinitionCount())
  17. }
  18. //BeanDefinitionRegistry Bean defines the save center of the information. Later, the BeanFactory creates a bean instance according to each bean definition information saved in the BeanDefinitionRegistry.
  19. @Override
  20. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  21. // TODO Auto-generated method stub
  22. System.out.println('Number of postProcessBeanDefinitionRegistry...beans:'+registry.getBeanDefinitionCount())
  23. //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class)
  24. AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition()
  25. registry.registerBeanDefinition('hello', beanDefinition)
  26. }
  27. }

2、新しいMyBeanFactoryPostProcessor.javaクラス



  1. package com.atguigu.ext
  2. import java.util.Arrays
  3. import org.springframework.beans.BeansException
  4. import org.springframework.beans.factory.config.BeanFactoryPostProcessor
  5. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
  6. import org.springframework.stereotype.Component
  7. @Component
  8. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  9. @Override
  10. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  11. System.out.println('MyBeanFactoryPostProcessor...postProcessBeanFactory...')
  12. int count = beanFactory.getBeanDefinitionCount()
  13. String[] names = beanFactory.getBeanDefinitionNames()
  14. System.out.println('There is a current BeanFactory'+count+' Beans')
  15. System.out.println(Arrays.asList(names))
  16. }
  17. }

3、新しい構成クラス

  1. @ComponentScan('com.atguigu.ext')
  2. @Configuration
  3. public class ExtConfig {
  4. @Bean
  5. public Blue blue(){
  6. return new Blue()
  7. }
  8. }

4、テスト

  1. package com.atguigu.test
  2. import org.junit.Test
  3. import org.springframework.context.ApplicationEvent
  4. import org.springframework.context.annotation.AnnotationConfigApplicationContext
  5. import com.atguigu.ext.ExtConfig
  6. public class IOCTest_Ext {
  7. @Test
  8. public void test01(){
  9. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class)
  10. applicationContext.close()
  11. }
  12. }

試験結果:

説明:実行順序1、2、3に従って、説明します BeanDefinitionRegistryPostProcessorはBeanFactoryPostProcessorよりも優先され、BeanFactoryPostProcessorはBeanのインスタンス化よりも優先されます