spring-boot源码分析之BeanFactory · 叁

spring-boot源码分析之BeanFactory · 叁

前言

今天我们继续研究BeanFactory,不过今天分享的内容有点零散,主要包括三个方面的内容,一个是ApplicationContextInitializer的初始化,这个严格来说和BeanFactory没什么关系,但是源码也分析了,所以这里提一下;另一个是ignoredDependencyInterfaces,这个是BeanFactory的一个核心属性,用于屏蔽我们不需要进行依赖检查和自动注入的接口;最后一个是beanDefinitionMap,这一次我们找到了它最开始初始化的代码,所以这里一起分享下。

BeanFactory初始化过程

ApplicationContextInitializer初始化

下面是ApplicationContextInitializer的初始化操作,ApplicationContextInitializerspring boot提供的一套初始化机制,它的initialize方法在spring boot容器刷新前执行,通常被用来进行配置文件初始化,我们也可以自己定义自己的ApplicationContextInitializer,后面我们可以做一期demo示例。

ApplicationContextInitializer的初始化操作是在 prepareContext方法中被执行的,默认情况下,会有7ApplicationContextInitializer被执行

spring-boot源码分析之BeanFactory · 叁

下面是第一个ApplicationContextInitializer的方法源码其他类似,需要注意的是ApplicationContextInitializer本身是顺序的,而且方法内部也有排序操作:

spring-boot源码分析之BeanFactory · 叁

在第二个ApplicationContextInitializer初始化方法内容,它往容器中注册了BeanFactory的后置处理器

spring-boot源码分析之BeanFactory · 叁

回到容器初始化开始的地方

根据下面的截图,我们可以看出来,beanFactory其实在容器创建完成后,已经完成了一部分初始化操作,所以想要搞清楚beanFactroy的初始,必须要回到beanFactory初始化的地方。

spring-boot源码分析之BeanFactory · 叁

发现ignoredDependencyInterfaces

ignoredDependencyInterfacesBeanFactory的一个核心属性,用于屏蔽我们不需要进行依赖检查和自动注入的接口,下面是BeanFactory初始化ignoredDependencyInterfaces的代码,这段代码也是在创建容器的时候被执行的。

spring-boot源码分析之BeanFactory · 叁ignoredDependencyInterfaces存放的是需要忽略的依赖接口,默认情况下只会加入BeanFactoryAware的接口,根据官方解释,加入ignoredDependencyInterfaces中的接口,会忽略依赖检查,并且不会被autowire

spring-boot源码分析之BeanFactory · 叁

找到beanDefinitionMap初始化开始的地方

下面是beanDefinitionMap最开始初始化的代码,我们可以看到,在执行完registry.registerBeanSefinition方法之后,第一个beandefinition信息被成功注册。

下面是registerAnnotationConfigProcessors方法的完整截图:

spring-boot源码分析之BeanFactory · 叁
spring-boot源码分析之BeanFactory · 叁
spring-boot源码分析之BeanFactory · 叁
spring-boot源码分析之BeanFactory · 叁

这个方法在AnnotationConfigUtils这个类中,它是在实例化AnnotationConfigServletWebServerApplicationContextreader属性的时候被执行的。

spring-boot源码分析之BeanFactory · 叁
spring-boot源码分析之BeanFactory · 叁

这个方法的作用是注册给定的注解后置处理器,从包名上我们可以看出来,这五个类有两个是和事件监听器相关的,有三个是和注解相关的,其中还有一个类没有被注入,是和jpa相关的组件,应该和我们没有引入jpa的依赖和配置有关系。关于beanDefinitionMap我们暂时就先说这么多,至于这五个最先被注册的元老级类,我们后面再来详细了解。

总结

spring boot的源码真的太上头了spring-boot源码分析之BeanFactory · 叁,这些内容本来是中午要输出的,但是由于早上没有太多进展,最后连图都没画好,然后中午也没有理出内容,一直等到下班回到家spring-boot源码分析之BeanFactory · 叁,才开始真正干活,所以今天的绝大多数内容都是晚上回到家才搞出来的。严格来说,最近这几天都是如此,但是经过我最近这段时间的梳理和硬啃,现在感觉多少有点眉目了,自我感觉关于run方法我已经梳理完40%~50%的内容,剩下reflush方法大概能占到30%的内容,事件监听相关内容大概占比20%,反正感觉慢慢能看见胜利的曙光了spring-boot源码分析之BeanFactory · 叁……加油吧,没有别的选择了spring-boot源码分析之BeanFactory · 叁~

好了,各位小伙伴晚安spring-boot源码分析之BeanFactory · 叁

– END –


原文始发于微信公众号(云中志):spring-boot源码分析之BeanFactory · 叁

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/40490.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!