BeanPostPorcessor是在bean创建对象初始化前后进行拦截工作,而BeanFactoryPostProcessor是Bean工厂的后置处理器,在Bean定义加载完成之后,Bean实例初始化之前会调用postProcessBeanFactory方法.
1.实现类
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
int count = beanFactory.getBeanDefinitionCount();
String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
for (String str : beanDefinitionNames) {
System.out.println("----->" + str);
}
System.out.println("获取容器中BeanDefinition的数量-------> " + count);
}
}

2. 配置类,其中注入了一个实体类,跟一个MyBeanFactoryPostProcessor

/**
* description
*
* @author 70KG
* @date 2018/12/24
*/
@Configurationpublic class MyConfig { @Bean
public People01 people01() {
return new People01();
} @Bean
public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
return new MyBeanFactoryPostProcessor();
} }

3. 测试类

public class Test01 {

    public static void main(String[] args) {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
} }

4. 结果,可见postProcessBeanFactory方法先于构造方法执行

----->org.springframework.context.annotation.internalConfigurationAnnotationProcessor
----->org.springframework.context.annotation.internalAutowiredAnnotationProcessor
----->org.springframework.context.annotation.internalRequiredAnnotationProcessor
----->org.springframework.context.annotation.internalCommonAnnotationProcessor
----->org.springframework.context.event.internalEventListenerProcessor
----->org.springframework.context.event.internalEventListenerFactory
----->myConfig
----->people01
----->myBeanFactoryPostProcessor
获取容器中BeanDefinition的数量-------> 9
People01无参构造执行...

BeanFactoryPostProcessor调用栈:
1. AnnotationConfigApplicationContext类中AnnotationConfigApplicationContext构造中的refresh().尝试去刷新容器
2. AbstractApplicationContext类中refresh()方法的invokeBeanFactoryPostProcessors(beanFactory).
在初始化实例之前,首先对BeanFactory进行后置处理,目的就是为了在所有的Bean定义都已经加载,但还未初始化之前,向容器中
增加属性或者重写Bean的定义信息(This allows for overriding or adding properties even to eager-initializing beans)
3. AbstractApplicationContext类中invokeBeanFactoryPostProcessors()方法中的PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
4. PostProcessorRegistrationDelegate类中的invokeBeanFactoryPostProcessors()方法中的invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory)
5. PostProcessorRegistrationDelegate类中的invokeBeanFactoryPostProcessors()方法中的postProcessor.postProcessBeanFactory(beanFactory)进行回调.

Spring源码窥探之:扩展原理BeanFactoryPostProcessor的更多相关文章

  1. 曹工杂谈:为什么很少需要改Spring源码,因为扩展点太多了,说说Spring的后置处理器

    前言 最近发了好几篇,都是覆盖框架源码,但是spring的代码,我是从没覆盖过,毕竟,如果方便扩展,没谁想去改源码,而spring就是不需要改源码的那个,真的是"对扩展开放,对修改关闭&qu ...

  2. spring源码解析之AOP原理

    一.准备工作 在这里我先简单记录下如何实现一个aop: AOP:[动态代理] 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 1.导入aop模块:Spring AOP:(s ...

  3. Spring源码窥探之:扩展原理BeanDefinitionRegistryPostProcessor

    BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,其中有两个接口,postProcessBeanDefinitionRegi ...

  4. Spring源码窥探之:注解方式的AOP原理

    AOP入口代码分析 通过注解的方式来实现AOP1. @EnableAspectJAutoProxy通过@Import注解向容器中注入了AspectJAutoProxyRegistrar这个类,而它在容 ...

  5. Spring源码之注解的原理

    https://blog.csdn.net/qq_28802119/article/details/83573950 https://www.zhihu.com/question/318439660/ ...

  6. Spring源码窥探之:声明式事务

    1. 导入驱动,连接池,jdbc和AOP的依赖 <!-- c3p0数据库连接池 --> <dependency> <groupId>c3p0</groupId ...

  7. Spring源码窥探之:AOP注解

    AOP也就是我们日常说的@面向切面编程,看概念比较晦涩难懂,难懂的是设计理念,以及这样设计的好处是什么.在Spring的AOP中,常用的几个注解如下:@Aspect,@Before,@After,@A ...

  8. Spring源码窥探之:@Profile

    Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...

  9. Spring源码窥探之:Spring AOP初步使用

    AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...

随机推荐

  1. html5传感器

    html5传感器(注意苹果和安卓方向是相反的 回调函数触发的速度苹果要快很多 设置坐标不要设置在回调函数里)以下是代码<pre><!DOCTYPE html><html ...

  2. Python定时偷取妹子Chrome上网记录

    原文:教大家一招用Python实时监控自己的女朋友每天上网都在做什么! 参考这个思路,尝试自己实现一下 读取Chrome历史记录文件 1.文件可在以下路径找到,这是个sqllite数据库文件 C:\U ...

  3. java中的内存分配问题

    class A{ int i; int j; } clsaa demo{ public static void main(String[] args){ A aa = new A(); A aa; / ...

  4. js中Function引用类型中一些常见且有用的方法和属性

    Function类型 函数由于是Function类型的一个实例,所以函数名就是一个指向函数对象的指针,不会与某个函数死死的连接在一起,这也导致了js中没有真正的重载,但好处是,函数对象可以作为另一个函 ...

  5. Selenium+Java(十)Selenium常用方法

    前言: 通过前几篇博客的已经了解了元素如何定位,提示框下拉框如何处理,多表单,鼠标键盘操作.此篇博客来介绍拿到想应的driver对象后如果对于对象做一些操作. get //打开网站 driver.ge ...

  6. (转).NET Core中实现AOP编程

    原文地址:https://www.cnblogs.com/xiandnc/p/10088159.html AOP全称Aspect Oriented Progarmming(面向切面编程),其实AOP对 ...

  7. P2711 小行星 (最大流)

    题目 P2711 小行星 解析 这道题挺巧妙的,乍一看是空间上的,无从下手,稍微转换一下就可以了. 看到题目,求消除这些行星的最少次数,就是求最小割,也就是求最大流,考虑怎样建图. 考虑当我们消去一个 ...

  8. Java自学-操作符 位操作符

    Java的位操作符 位操作符 在实际工作中使用并不常见. 示例 1 : 一个整数的二进制表达 位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5. 而5的二进制是101. 所以在开始学习之前 ...

  9. pandas-14 concatenate和combine_first的用法

    pandas-14 concatenate和combine_first的用法 concatenate主要作用是拼接series和dataframe的数据. combine_first可以做来填充数据. ...

  10. string 转stream和stream转string

    string test = “Testing 1-2-3″; // convert string to stream MemoryStream stream = new MemoryStream(); ...