本文共 2426 字,大约阅读时间需要 8 分钟。
文章目录
写在前面
在上一讲中,我们让程序停留在了下面这行代码处。
我们刚好讲完以上invokeBeanFactoryPostProcessors方法,该方法所做的事情无非就是在BeanFactory准备好以后,执行BeanFactoryPostProcessor的方法。
接下来,我们就得来说道说道registerBeanPostProcessors方法了。顾名思义,该方法就是来注册BeanPostProcessor的,即注册bean的后置处理器。其实,从该方法上的描述上,我们也能知道其作用就是注册bean的后置处理器,拦截bean的创建过程。
其实,我们之前在深扒AOP的原理时,就已经debug跟踪过该方法了。我说得更具体点,在创建AOP的核心类时,就是调用这个方法来进行处理的。不记得的同学,可以翻阅我之前写的文章哟😀!
注册BeanPostProcessor
获取所有的BeanPostProcessor
按下F5
快捷键进入registerBeanPostProcessors方法里面,如下图所示,可以看到在该方法里面会调用PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法。
于是,我们再次按下F5
快捷键进入以上方法中,如下图所示,可以看到一开始就会获取所有BeanPostProcessor组件的名字。
这里,我得提醒大家的一点是BeanPostProcessor接口旗下有非常多的子接口,这一点你查看一下BeanPostProcessor接口的继承树就知道了,如下图所示。
看到了吗,BeanPostProcessor接口旗下是不是有很多子接口啊,而且每一个子接口,还有点不一样。这里,我也只会挑出如下的几个子接口将其罗列出来,目的是为了告诉大家BeanPostProcessor接口旗下确实是有非常多的子接口,而且这些不同接口类型的BeanPostProcessor在bean创建前后的执行时机是不一样的,虽然它们都是后置处理器。
- DestructionAwareBeanPostProcessor:该接口我们之前是不是说过啊?它是销毁bean的后置处理器
- InstantiationAwareBeanPostProcessor
- SmartInstantiationAwareBeanPostProcessor
- MergedBeanDefinitionPostProcessor
获取到所有的BeanPostProcessor组件之后,我们按下F6
快捷键让程序往下运行,直至程序运行到下面这行代码处,可以看到现在向beanFactory中添加了一个BeanPostProcessorChecker类型的后置处理器,它是来检查所有BeanPostProcessor组件的。
按分好类的优先级顺序来注册BeanPostProcessor
继续按下F6
快捷键让程序往下运行,在这一过程中,可以看到后置处理器也可以按照是否实现了PriorityOrdered接口、Ordered接口以及没有实现这两个接口这三种情况进行分类。
将所有的BeanPostProcessor组件分门别类之后,依次存储在不同的ArrayList集合中。
其实,我们会发现不止有三个ArrayList集合,还有一个名字为internalPostProcessors的ArrayList集合。如果后置处理器是MergedBeanDefinitionPostProcessor这种类型的,那么它就会被存放在名字为internalPostProcessors的ArrayList集合中。
由于BeanPostProcessor还是挺多的(除了IOC容器自己拥有的以外,还有咱们自己编写的),因此你得不停地按下F6
快捷键让程序往下运行,直至程序运行到第220行代码处。
当程序运行到第220行代码处时,可以看到这是来注册实现了PriorityOrdered优先级接口的BeanPostProcessor的。因为这儿调用了一个叫registerBeanPostProcessors的方法,该方法就是来注册bean的后置处理器的,而所谓的注册就是向beanFactory中添加进去这些BeanPostProcessor。
我为何会这么说呢?按下F5
快捷键进入到registerBeanPostProcessors方法中,你就一目了然了,勿须我再多说。
然后,注册实现了Ordered接口的BeanPostProcessor,如下图所示。
接着,再来注册既没有实现PriorityOrdered接口又没有实现Ordered接口的BeanPostProcessor,如下图所示。
最后,再来注册MergedBeanDefinitionPostProcessor这种类型的BeanPostProcessor,因为名字为internalPostProcessors的ArrayList集合中存放的就是这种类型的BeanPostProcessor。
除此之外,还会向beanFactory中添加一个ApplicationListenerDetector类型的BeanPostProcessor。我们不妨点进ApplicationListenerDetector类里面去看一看,如下图所示,它里面有一个postProcessAfterInitialization方法,该方法是在bean创建初始化之后,探测该bean是不是ApplicationListener的。
也就是说,该方法的作用是检查哪些bean是监听器的。如果是,那么会将该bean放在容器中保存起来。
最最后,我得多提一嘴,以上只是来注册bean的后置处理器,即只是向beanFactory中添加了所有这些bean的后置处理器,而并不会执行它们。
转载地址:https://liayun.blog.csdn.net/article/details/114184500 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!