Spring源码窥探之:扩展原理BeanFactoryPostProcessor
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的更多相关文章
- 曹工杂谈:为什么很少需要改Spring源码,因为扩展点太多了,说说Spring的后置处理器
前言 最近发了好几篇,都是覆盖框架源码,但是spring的代码,我是从没覆盖过,毕竟,如果方便扩展,没谁想去改源码,而spring就是不需要改源码的那个,真的是"对扩展开放,对修改关闭&qu ...
- spring源码解析之AOP原理
一.准备工作 在这里我先简单记录下如何实现一个aop: AOP:[动态代理] 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 1.导入aop模块:Spring AOP:(s ...
- Spring源码窥探之:扩展原理BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor,其中有两个接口,postProcessBeanDefinitionRegi ...
- Spring源码窥探之:注解方式的AOP原理
AOP入口代码分析 通过注解的方式来实现AOP1. @EnableAspectJAutoProxy通过@Import注解向容器中注入了AspectJAutoProxyRegistrar这个类,而它在容 ...
- Spring源码之注解的原理
https://blog.csdn.net/qq_28802119/article/details/83573950 https://www.zhihu.com/question/318439660/ ...
- Spring源码窥探之:声明式事务
1. 导入驱动,连接池,jdbc和AOP的依赖 <!-- c3p0数据库连接池 --> <dependency> <groupId>c3p0</groupId ...
- Spring源码窥探之:AOP注解
AOP也就是我们日常说的@面向切面编程,看概念比较晦涩难懂,难懂的是设计理念,以及这样设计的好处是什么.在Spring的AOP中,常用的几个注解如下:@Aspect,@Before,@After,@A ...
- Spring源码窥探之:@Profile
Spring为我们提供的多环境启动 1. 配置类,注入三个不同环境的数据源,并加上注解 /** * description: 以下准备了三套不同环境的数据源 * * @author 70KG * @d ...
- Spring源码窥探之:Spring AOP初步使用
AOP即面向切面编程.它的底层实际是用了spring的动态代理,具体是JDK的代理还是CGLIB的代理,就视情况而定了.本博客园仅仅作为平时记录,显得有些杂乱无章,如果想了解动态代理,设计模式,请访问 ...
随机推荐
- 引用类型前需要加ref?
方法的参数前加ref代表的是传的参数的地址,值类型前加ref的作用相当于把这个值类型当成引用类型在用,那引用类型作为参数有一种情况也需要加ref,不然得到的值会有差. 不加ref: class Pro ...
- 基于Livy的Spark提交平台搭建与开发
为了方便使用Spark的同学提交任务以及加强任务管理等原因,经调研采用Livy比较靠谱,下图大致罗列一下几种提交平台的差别. 本文会以基于mac的单机环境搭建一套Spark+Livy+Hadoop来展 ...
- DRF框架(九)——drf偏移分页组件、drf游标分页组件(了解)、自定义过滤器、过滤器插件django-filter
drf偏移分页组件 paginations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- C/C++語言 - 日常算法 - 蛇形填數
C/C++語言 - 日常算法 - 蛇形填數 日期 : 2019-06-11 問題描述: 在n×n方阵里填入1,2,…,n×n,要求填成蛇形. 例如,n=4时方阵为: 10 11 12 1 9 ...
- 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别
1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...
- HBase 系列(九)——HBase 容灾与备份
一.前言 本文主要介绍 Hbase 常用的三种简单的容灾备份方案,即CopyTable.Export/Import.Snapshot.分别介绍如下: 二.CopyTable 2.1 简介 CopyTa ...
- 使用jconsole分析内存情况
http://www.cnblogs.com/dava/p/6686436.html
- springboot笔记10——整合Redis
依赖 <dependencies> <!--web依赖--> <dependency> <groupId>org.springframework.boo ...
- np.newaxis的使用及有趣的数组相乘
a=np.array([1,2,3,4])a=a[np.newaxis,:] #固定行,相当于1行多列b=np.array([2,4,6]) b=b[:,np.newaxis] #固定列,相当与多行1 ...
- RHEL6搭建网络yum源软件仓库
RHEL的更新包只对注册用户生效,所以需要自己手动改成Centos的更新包 一.查看rhel本身的yum安装包 rpm -qa | grep yum 二.卸载这些软件包 rpm -qa | grep ...