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クラスを作成します
- package com.atguigu.ext
- import org.springframework.beans.BeansException
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
- import org.springframework.beans.factory.support.AbstractBeanDefinition
- import org.springframework.beans.factory.support.BeanDefinitionBuilder
- import org.springframework.beans.factory.support.BeanDefinitionRegistry
- import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
- import org.springframework.beans.factory.support.RootBeanDefinition
- import org.springframework.stereotype.Component
- import com.atguigu.bean.Blue
- @Component
- public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor{
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println('Number of MyBeanDefinitionRegistryPostProcessor...beans:'+beanFactory.getBeanDefinitionCount())
- }
- //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.
- @Override
- public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println('Number of postProcessBeanDefinitionRegistry...beans:'+registry.getBeanDefinitionCount())
- //RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class)
- AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition()
- registry.registerBeanDefinition('hello', beanDefinition)
- }
- }
2、新しいMyBeanFactoryPostProcessor.javaクラス
- package com.atguigu.ext
- import java.util.Arrays
- import org.springframework.beans.BeansException
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
- import org.springframework.stereotype.Component
- @Component
- public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- System.out.println('MyBeanFactoryPostProcessor...postProcessBeanFactory...')
- int count = beanFactory.getBeanDefinitionCount()
- String[] names = beanFactory.getBeanDefinitionNames()
- System.out.println('There is a current BeanFactory'+count+' Beans')
- System.out.println(Arrays.asList(names))
- }
- }
3、新しい構成クラス
- @ComponentScan('com.atguigu.ext')
- @Configuration
- public class ExtConfig {
- @Bean
- public Blue blue(){
- return new Blue()
- }
- }
4、テスト
- package com.atguigu.test
- import org.junit.Test
- import org.springframework.context.ApplicationEvent
- import org.springframework.context.annotation.AnnotationConfigApplicationContext
- import com.atguigu.ext.ExtConfig
- public class IOCTest_Ext {
- @Test
- public void test01(){
- AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class)
- applicationContext.close()
- }
- }
試験結果:
説明:実行順序1、2、3に従って、説明します BeanDefinitionRegistryPostProcessorはBeanFactoryPostProcessorよりも優先され、BeanFactoryPostProcessorはBeanのインスタンス化よりも優先されます