前言
前面的篇幅里有提到通过InitializingBean和Disposable等接口可以对bean的初始化和销毁做一些自定义操作,那么有一点要注意,那仅仅是在bean被容器实例化之后的操作,在spring的世界里,要想对实例化这个过程做点什么,作为一个普通业务的开发人员,显然不需要去继承ApplicationContext或者BeanFactory,因为spring container为我们提供了一些接口,让我们以插件的形式去扩展BeanFactory对bean的初始化操作,其中就有我们今天的主角——BeanPostProcessor(以下简称bpp)接口。
源码,先睹为快
这个用法很简单,它只有两个方法,我们实现自己的BeanPostProcessor,Spring能自动注册到容器中。
其中before方法是在bean实例化之后,属性设置之后但在初始化方法之前执行;after方法是在各种初始化方法之后执行。
说到这里可能有人会想,这跟生命周期中的其它初始化接口有啥区别?其它的初始化方法也可以修改bean啊,这个问题问得好,那么我们来说下这个接口与InitializingBean Disposable接口以及自定义的init destroy方法的本质区别
在这里有两种特殊的bpp不得不说,假设你需要自定义一个类似于@Autowire或者@Inject的注入功能的注解的时候(你可能会用到InjectionMetadata),普通的bpp可能就满足不了你的需要了,你可能用到两个特殊的bpp。
MergedBeanDefinitionPostProcessor(以下简称mbdpp)
InstantiationAwareBeanPostProcessor(以下简称iabpp)
他们都是继承自bpp,但在spring bean 创建的过程中切入点不同于普通的bpp。
InstantiationAwareBeanPostProcessor接口
看注释
postProcessBeforeInstantiation方法
查阅AbstractAutowireCapableBeanFactory的createBean方法(这个方法是Spring容器创建bean的核心方法),可以看到,postProcessBeforeInstantiation是在bean实例化之前,postProcessAfterInstantiation是在实例化之后属性设置以及autowire注入之前,它一般是spring框架内部使用,但在这里大有可为,用postProcessBeforeInstantiation可以生成代理对象( 一般作法是让postProcessorBeforeInstantiation方法返回不为null,这样就会中断后续创建bean实例的过程,会以这个方法返回的对象作为bean实例),看源码:
postProcessPropertyValues方法
用postProcessPropertyValues 可以完成对属性的各种操作,注解中元数据的解析等,Spring的@Autowire注入,JSR330的@Inject以及JSR250的@Resource等注入操作都是通过这个方法完成。
这接口的用处在spring底层较多,有兴趣的同学可以翻阅源码,以下是两个比较典型的实现。
AutowiredAnnotationBeanPostProcessor
AbstractAutoProxyCreator
MergedBeanDefinitionPostProcessor接口
这个接口传入了一个RootBeanDefinition,这里允许我们修改bean的定义,@AutuwiredAnnotationBeanPostProcessor通过实现这个方法检查并注册需要注入的成员。
BeanFactoryPostProcessor(bfpp)
除了BeanPostProcessor还有一种想必大家都知道,那就是BeanFactoryPostProcessor
bfpp是作为beanFactory的一个很重要扩展插件,可以用来自定义BeanDefination的。它与bpp主要区别在于:
好了,说了这么多,来看下Spring创建bean的大致流程图,这里只标出了比较关键的节点
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
主要内容:一、场景引入,问题初现,二、volatile的作用及背后的原理,三、总结 & 提醒一、场景引入,问题初现 很多同学出去面试,都会被问到一个常见的问题:说说你对volatile的理解? 不少初出茅庐的同学可能会有点措手不及,因为可能就是之前没关注过这个。但是网上百度一下呢,不少文章写的很好,但是理论扎的太深,文字太多,图太少,让人有点难以理解。 基于上述痛点,这篇文章尝试站在年轻同学的角度,用最简单的大白话,加上多张图给大家说一下,volatile到底是什么? 当然本文不会把理论
前面写了Android 开发:由模块化到组件化(一),很多小伙伴来问怎么没有Demo啊?之所以没有立刻放demo的原因在还有许多技术点没说完. 今天我们就来细细评味Java当中Annotation,也就是我们常说的注解. 本文按照以下顺序进行:元数据->元注解->运行时注解->编译时注解处理器. 什么是元数据(metadata) 元数据由metadata译来,所谓的元数据就是“关于数据的数据”,更
我正在尝试将帖子ID添加到下一个和上一个帖子中。当前使用下面的代码给我带来了不希望看到的页面的post id的效果。
SQLite 是一个开源数据库,具有许多类似于其他关系数据库(如 SQL)的功能。 如果你是应用程序开发人员,你可能还会注意到 SQLite 查询看起来或多或少像 SQL 一样。 在 Android 中选择 SQLite 的原因是其内存占用较低。 Android 开发者喜欢 SQLite 的原因是它不需要设置或配置数据库,并且可以在应用程序中直接调用。 6.1 深入理解 SQLite 正如我们在上
为了面试,准备了好久的八股文,面试时候根本没问,而且也没手撕算法,跟网上别人的面经不一样,好懵逼,不会是kpi面吧#软件开发笔面经#
作者:小傅哥 博客:https://bugstack.cn 原文:https://mp.weixin.qq.com/s/g7YdIe_FSrk-WE8nQRO3TA 一、前言 是的,在写了4篇关于Spring核心源码的面经内容后,我决定要去手撸一个Spring了。为啥这么干呢?因为所有我想写的内容,都希望它是以理科思维理解为目的的学会,而不是靠着硬背记住。而目前面经中涉及到的每一篇Spring源码