在之前的文章中,我们分析了整个beanFactory,其中有一些配置我们还是不怎么清楚,这一篇,我们仔细的分析BeanPostProcessor这个类的作用和存在的意义,并举一些实例辅助我们理解BeanPostProcessor
官方解读
首先我们看看官方对于BeanPostProcessor
这个接口设计的是个相对factory的相关hook,具体功能是允许自定义修改新创建bean的实例,其具体描述ApplicationContexts会在对应的bean的definitions中自动检测BeanPostProcessor,且在创建的任意bean后应用它,还可以通过factory给其他类进行注册使用
讲到这里,我们可以发现BeanPostProcessor就是spring 给了我们一个修改bean的契机,我们通过beanDefinition查找到目标类,紧接着spring进行实例化该类,这样我们就得到了目标bean,但是出于业务或其他等考虑,我们想对bean做一些更改,这个时候beanPostProcessor就是大发神威的时候了
到这里,我们看看其具体的方法:
postProcessBeforeInitialization
注意before,应用BeanPostProcessor返回一个实例,在任何bean初始化回调之前,
(对于postProcessAfterInitialization也是一样的)
当其他非实现BeanPostProcessor的bean且在同一个容器的bean在初始化的时候,才会回调这个方法
所以这个方法是作用BeanPostProcessor在初始化之前进行处理,
postProcessAfterInitialization
注意after,所以这个方法是作用BeanPostProcessor在初始化之后进行处理
以上就是beanPostProcessor的具体方法和官方解读,下面搞几个例子,辅助解下beanPostProcessor毒,让我们形成记忆神经元,哈哈哈
实例
先上一个简易demo
首先我们先构建一个springboot环境,并创建一个我们调试的bean:
public class ClazzBean {
public String name;
public String clazz;
@Override
public String toString() {
return "ClazzBean{" +
"name='" + name + '\'' +
", clazz='" + clazz + '\'' +
'}';
}
}
接着我们想springboot容器中声明我们测试bean:
@Bean
public ClazzBean getClazzBean() {
return new ClazzBean();
}
最后我们创建一个实现了BeanPostProcessor的Processor类,如下:
接下来我们看看结果:
我们可以看到,我们的BeanPostProcessor已经生效了。可能还有人迷惑,生效了我们能干嘛用,下面再举一个例子,抛砖引玉下
Demo2:
这里我不打算新写一个demo,我们在原有的demo1上进行修改,用来加深记忆,接下来我们要实现一个功能,
功能如下:
- 1.我们目标bean永远返回为json格式
- 2.若我们目标bean一些需要的成员变量没有被赋值,就赋值上我们给的默认初始值
不过我们还需要临时准备一些工具
-
创建一个注解
在这里插入图片描述 -
然后我们修改一下我们的目标bean
在这里插入图片描述 -
最后我们改动下我们的beanPostProcessor
-
对于postProcessBeforeInitialization而言,我们做如下改动
在这里插入图片描述 -
对于postProcessAfterInitialization而言,我们做如下改动
在这里插入图片描述
-
注意after之后的格式已经变成我们需要的json格式了,而目标bean也赋值上了我们的默认值
结语
到这我们对BeanPostProcessor的抛砖引玉也就结束了,但是对BeanPostProcessor的应用远不止于此,相信细心的童鞋在springboot这个架子中,本身就有很多对BeanPostProcessor的应用,不失为我们学习的一些标准代码哦~
举一些小例子好比我们对一些数据的筛选,以及数据bean的过滤等,加载一些配置文件等等,都是一个非常好的时机,对于我们的项目而言也优雅很多,更多精彩,就靠大家挖掘了!!