Spring注解驱动开发第43讲——Spring IOC容器创建源码解析(三)之注册BeanPostProcessor
发布日期:2021-06-30 17:56:27 浏览次数:3 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring注解驱动开发第44讲——Spring IOC容器创建源码解析(四)之初始化MessageSource组件
下一篇:Spring注解驱动开发第42讲——Spring IOC容器创建源码解析(二)之执行BeanFactoryPostProcessor

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月28日 17时19分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章