zoukankan      html  css  js  c++  java
  • spring-boot源码分析之BeanFactory · 叁

    前言

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

    BeanFactory初始化过程

    ApplicationContextInitializer初始化

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

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

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

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

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

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

    发现ignoredDependencyInterfaces

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

    ignoredDependencyInterfaces存放的是需要忽略的依赖接口,默认情况下只会加入BeanFactoryAware的接口,根据官方解释,加入ignoredDependencyInterfaces中的接口,会忽略依赖检查,并且不会被autowire

    找到beanDefinitionMap初始化开始的地方

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

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

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

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

    总结

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

    好了,各位小伙伴晚安!

  • 相关阅读:
    指令周期与机器周期
    MFC使用Access数据库
    函数指针的用途
    大端模式和小端模式
    Matlab信号展开
    EL表达式的11个内置对象
    JSP 4个域对象、7个动作指令、9个内置对象
    阿里巴巴java代码规范
    HDDATA基本注意事项
    SVN相关
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15240534.html
Copyright © 2011-2022 走看看