博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
精通Spring源码 | BeanFactoryPostProcessor
阅读量:4104 次
发布时间:2019-05-25

本文共 2396 字,大约阅读时间需要 7 分钟。

BeanFactoryPostProcessor 是 Spring 中 Bean 工厂的后置处理器,她在 Spring 加载了 Bean 的定义文件后,在 Bean 实例化之前执行。所以,当我们实现了这个接口,就可以修改整个 Bean 工厂的 Bean 的一些属性,比如,修改 Bean 的作用域,设置 despendsOn,设置是否懒加载等等。

@ComponentScan("com.javahly.spring44")public class Appconfig {}
@Componentpublic class IndexService {}
@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {	@Override	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {		BeanDefinition indexService = beanFactory.getBeanDefinition("indexService");		//默认是单例,这里我们把单例 Bean修改成原型Bean		indexService.setScope("prototype");	}}
public class Test {	public static void main(String[] args){		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class);		//输出的是原型		System.out.println(applicationContext.getBean("indexService"));		System.out.println(applicationContext.getBean("indexService"));		System.out.println(applicationContext.getBean("indexService"));	}}

而且,我们可以实现多个 BeanFactoryPostProcessor,通过 order 属性顺序执行。

@Componentpublic class MyBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor,Ordered {	@Override	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {		BeanDefinition indexService = beanFactory.getBeanDefinition("indexService");		//把单例修改成原型		indexService.setScope("prototype");		System.out.println("BeanFactoryPostProcessor1");	}	//数值越小,月优先执行	@Override	public int getOrder() {		return 0;	}}
@Componentpublic class MyBeanFactoryPostProcessor2 implements BeanFactoryPostProcessor,Ordered {	@Override	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {		BeanDefinition indexService = beanFactory.getBeanDefinition("indexService");		//把单例修改成原型		indexService.setScope("singleton");		System.out.println("BeanFactoryPostProcessor2");	}	@Override	public int getOrder() {		return 1;	}}

我们是先执行 1,再执行 2,我们先把单例改成了原型,再把原型改成了单例。

总结

在我们开发中,如果我们想动态地对 BeanDefinition 进行修改,我们就可以实现这个接口,这是 Spring 的扩展点之一。Spring内部也有一个核心的类 ConfigurationclassPostProcessor 调用 postProcessBeanFactory 这个方法对加了 @Configuration 实现了动态代理,不过ConfigurationclassPostProcessor 是实现了 BeanFactoryPostProcessor的子类BeanDefinitionRegistryPostProcessor,BeanDefinitionRegistryPostProcessor 是对 BeanFactoryPostProcessor的扩展,功能更强,也是Spring 的扩展点之一,下面的文章会讲到。

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

转载地址:http://kffsi.baihongyu.com/

你可能感兴趣的文章
JSP中文验证码
查看>>
JavaScript学习笔记1:鼠标划过选中
查看>>
JavaScript学习笔记2之特殊公告栏效果
查看>>
AJAX视频教程下载
查看>>
android 开发资源
查看>>
九度1001 A+B for Matrices
查看>>
九度1002 Grading
查看>>
九度1003 A+B
查看>>
__INT64的用法
查看>>
九度1004
查看>>
九度OJ 题目17:所有员工年龄排序
查看>>
进入IT企业必读的324个Java面试题
查看>>
九度OJ 题目1169:比较奇偶数个数
查看>>
九度OJ 题目1089:数字反转
查看>>
九度OJ 题目1098:字母统计
查看>>
九度OJ 题目1032:ZOJ
查看>>
九度OJ 题目1115:数字求和
查看>>
九度OJ 题目1022:游船出租
查看>>
九度OJ 题目1206:字符串连接
查看>>
九度OJ 题目1192:回文字符串
查看>>