type
status
date
slug
summary
tags
category
icon
password
之前的代码我们使用过BeanPostProcessor,它是实现了BeanPostProcessor接口,重写了里面的两个方法。

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

image-20230305141509098
后置处理器执行节点

image-20230305142124721
所以要先给bean配置一个初始化方法,之前是使用配置文件配置的。

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

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

image-20230305151415155
实现后置处理器
原生是如何实现的

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

image-20230305163719215