实现BeanPostProcessor机制
2025-4-20
| 2025-4-20
Words 1497Read Time 4 min
type
status
date
slug
summary
tags
category
icon
password
之前的代码我们使用过BeanPostProcessor,它是实现了BeanPostProcessor接口,重写了里面的两个方法。
notion image
image-20230305141046252

实现后置处理器机制

之前完成了spring的依赖注入,现在完成bean后置处理器机制,bean的后置处理器是对所有bean生效的,也就是说,只要存在bean的后置处理器,那么所有的bean都会执行对应的方法。
notion image
image-20230305141509098

后置处理器执行节点

notion image
image-20230305142124721
所以要先给bean配置一个初始化方法,之前是使用配置文件配置的。
notion image
image-20230305142506150
全局搜索:InitializingBean,可以看到注释的一句话:在设置所有bean属性后,由包含{@code BeanFactory}调用,这个方法就等同于init方法,和上图一样也是在执行set方法之后调用的。
notion image
image-20230305143032179

定义接口:InitializingBean

判断一个类是否需要进行初始化,也就是是否有初始化方法,现在来看,如果一个类实现了InitializingBean这个接口,那么就代表这个类需要执行初始化方法,所以在开发中有一种接口叫做标记接口,这种接口没有任何方法,这个接口存在的意义在于就在于标记,如果一个类实现了这个接口,那么底层会去判断执行一个业务,比如Serializable接口,把对象进行序列化,把对象转换成流,可以用于保存在磁盘上或者网络传输,它不用实现任何方法,标记当前类对象是可以序列化的,是给JVM看的。
容器中判断是否实现了InitializingBean接口,实现了就调用初始化方法,实现位置是创建好bean之后

结果

这里创建了两个实例,MonsterService实现了InitializingBean接口,所以调用了初始化方法。
notion image
image-20230305151415155

实现后置处理器

原生是如何实现的

notion image
image-20230305152755709

模拟BeanPostProcessor

创建MyBeanPostProcessor类,重写这两个方法

但此时的后置处理器还未生效,因为这都是我自定义的,底层代码还未实现。
MyBeanPostProcessor实现,在扫描bean的时候如果发现类实现了MyBeanPostProcessor接口,就把这个对象放入一个单独的list
底层是和其他对象一样放入beanDefinationConcurrentMap中,只是后面再拿出来进行调用的时候需要遍历,执行,很麻烦,这里简化了代码。
接下来在执行初始化方法前后,分别调用before方法,after方法。

执行结果

对于有init方法的,会去调用后置处理器方法。
notion image
image-20230305163719215
密钥格式化宝石与石头
Loading...