Spring后置处理器之-BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的


BeanFactoryPostProcessor是什么:beanFactory的后置处理器;
 *         在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
 *         所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
 * 
BeanFactoryPostProcessor原理:
 * 1)、ioc容器创建对象
 * 2)、invokeBeanFactoryPostProcessors(beanFactory);
 *         如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
 *             1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
 *             2)、在初始化创建其他组件前面执行


BeanDefinitionRegistryPostProcessor是什么:
            BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
 *         postProcessBeanDefinitionRegistry();
 *         在所有bean定义信息将要被加载,bean实例还未创建的时候加载;
 * 
 *         优先于BeanFactoryPostProcessor执行;
 *         利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;
 * 
BeanDefinitionRegistryPostProcessor原理:
 *         1)、ioc创建对象
 *         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( "MyBeanDefinitionRegistryPostProcessor...bean的数量:"+beanFactory.getBeanDefinitionCount());
  17. }
  18. //BeanDefinitionRegistry Bean定义信息的保存中心,以后BeanFactory就是按照BeanDefinitionRegistry里面保存的每一个bean定义信息创建bean实例;
  19. @Override
  20. public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  21. // TODO Auto-generated method stub
  22. System.out.println( "postProcessBeanDefinitionRegistry...bean的数量:"+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( "当前BeanFactory中有"+count+ " 个Bean");
  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实例化执行; 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值