【spring 注解驱动开发】- BeanFactoryPostProcessor

本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git

1 BeanFactoryPostProcessor

BeanFactoryPostProcessor组件跟BeanPostProcessor组件有点类似,前面的博客我们知道了BeanPostProcessor组件的作用是在bean创建初始化前后处理。那么BeanFactoryPostProcessor组件的执行时机是在什么时候呢?我们下面看一下源码
在这里插入图片描述

1.2 代码测试

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-05 15:46
 */
public class Blue {

    public Blue() {
        System.out.println("Blue组件创建...");
    }
}

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-14 9:01
 */
@ComponentScan("com.wolfx.ext")
@Configuration
public class ExtConfig {

    @Bean
    public Blue blue(){
        return new Blue();
    }
}

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-14 9:02
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {


    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory()方法执行...");
        //获取容器中所有bean定义信息名
        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
        System.out.println(Arrays.toString(beanDefinitionNames));
    }
}

写个测试用例

@Test
public void test01(){
     AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
 }

测试结果
在这里插入图片描述
在这里插入图片描述

1.2 源码分析

创建IOC容器,刷新容器
在这里插入图片描述
invokeBeanFactoryPostProcessors(beanFactory)
在这里插入图片描述
下面我们看一下invokeBeanFactoryPostProcessors(beanFactory)方法里面做了什么操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor组件继承了BeanFactoryPostProcessor组件
在这里插入图片描述
看看BeanDefinitionRegistryPostProcessor的源码
在这里插入图片描述

2.1 代码测试

在上面的代码基础上加一个MyBeanDefinitionRegistryPostProcessor的组件实现BeanDefinitionRegistryPostProcessor 接口

/**
 * @description:
 * @author: sukang
 * @date: 2020-03-14 10:41
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanDefinitionRegistry()方法执行...");
        int cout = registry.getBeanDefinitionCount();
        System.out.println("容器中定义了"+ cout +"个组件");
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Blue.class);
        registry.registerBeanDefinition("Blue", beanDefinition);
    }

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanDefinitionRegistryPostProcessor...postProcessBeanFactory()方法执行...");
        int cout = beanFactory.getBeanDefinitionCount();
        System.out.println("容器中定义了"+ cout +"个组件");
    }
}

测试结果
在这里插入图片描述

2.2源码分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 总结

  • BeanFactoryPostProcessor是BeanFactory的后置处理器。作用及执行时间为:
    • 作用:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容
    • 执行时机:所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
  • BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor。作用及执行时间为:
    • 作用:给容器中再额外添加一些组件
    • 执行时机:在所有bean定义信息将要被加载,bean实例还未创建的,优先于BeanFactoryPostProcessor执行
发布了88 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/suchahaerkang/article/details/104854581