spring Bean创建的完整过程记录

 更新时间:2022年01月17日 12:36:08   作者:Jimmyhe  
这篇文章主要给大家介绍了关于Spring中Bean实例创建的相关资料,文中通过实例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

复习一下spring实现IOC的源码流程准备工作:

​强烈建议大家从git上拉取spring源码来学习Spring源码。因为里面相较于IDEA生成的会有注释,里面有的方法会有注释看起来会省力一点。

​以下都是用5.0.2版本来做阐述。

bean创建的流程图

写在前面:建议大家一定要自己用实例跑一遍,做好记录。如果只是看看会非常抽象。此流程图作为梗概,便于加强记忆和理解,新手或无基础的有个印象即可。等跟随本文走通一遍,在回过头看这个图,或许会有收获

源码走一遍bean的定义这是我的bean目录结构,只是做一个例子

获取核心容器对象,bean最后都会放在此容器对象中

    *   ApplicationContext的三个实现类
    *   ClassPathXmlApplicationContext  它可以加载类路径下的配置文件,要求必须在类路径下
    *   FileSystemXmlApplicationContext  可以加载任意路径下的配置文件,必须有访问权限
    *   AnnotationConfigApplicationContext 用于读取注解创建容器的
    
    这里我用ClassPathXmlApplicationContext来做演示
    
   public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    }
}

快速开始

建议用IDEA的debug模式来观察Spring的IOC过程

进入到此类的构造方法中

查看setConfigLocations,就是将配置文件加载到configLocations里去

向下执行,查看refresh()

this.prepareRefresh(): 此方法是准备工作,大家感兴趣可以点进去看一下,可以看到里面是获取时间,获取环境信息的一些设置。

this.obtainFreshBeanFactory(): 这一步是创建beanFactory,并且读取Bean的信息,源码注释中还有写到

// Tell the subclass to refresh the internal bean factory.会告诉子类去刷新内部bean工厂

this.refreshBeanFactory:

	 * This implementation performs an actual refresh of this context's underlying
	 * bean factory, shutting down the previous bean factory (if any) and
	 * initializing a fresh bean factory for the next phase of the context's lifecycle.
	 
	 这个实现类的方法会刷新容器中的beanFactory,关闭之前存在的并且初始化新的beanFactory

利用this.createBeanFactory() 创建了一个beanFactory,类型为DefaultListableBeanFactory

这个类接着往下走:this.loadBeanDefinitions(beanFactory);

	 * Load bean definitions into the given bean factory, typically through
	 * delegating to one or more bean definition readers.
	 
	 这个方法会将beandefinitionsReader读取到的bean definitions放入bean工厂,我们以上提出的三种
	 注入方式都会走到这里,将bean信息丢进去

返回上述 refresh()

this.prepareBeanFactory(beanFactory); 设置和忽略一些对象值

this.postProcessBeanFactory(beanFactory); 空方法可自定义扩展

this.invokeBeanFactoryPostProcessors(beanFactory);

	 * Instantiate and invoke all registered BeanFactoryPostProcessor beans,
	 * respecting explicit order if given.
	 * <p>Must be called before singleton instantiation.
	 
	 实例化所有beanFactory组件

registerBeanPostProcessors(beanFactory);

Instantiate and register all BeanPostProcessor beans,  //先注册再调用

initApplicationEventMulticaster(); 观察者模式监听器, 监听组件的相关状态,并决定相关调用方法。

finishBeanFactoryInitialization(beanFactory); 重要!!

	 * Finish the initialization of this context's bean factory,
	 * initializing all remaining singleton beans.
	 
	 完成了容器bean factory的初始化,并且初始化其他的bean单例对象

beanFactory.preInstantiateSingletons(); 实例化方法

此方法最后this.getBean(beanName)

继续

Return an instance, which may be shared or independent, of the specified bean.

注释已经很清楚了,此方法会返回一个实例,就是我们的bean对象

进入到createBean方法中

继续进入![image-20200714221630608](/Users/hjj/Library/Application Support/typora-user-images/image-20200714221630608.png)

继续进入

Instantiate the given bean using its default constructor.

这个方法注释说明了实例化对象是用构造器完成的

继续看他如何构造的

ca 就是Constructor,从这里我们基本可以看出容器内,bean对象的实例化
是利用反射的基本原理,获取类构造器,然后newInstance来实现的

以上就是bean对象实例化的基本过程,下面是实例化完成后的初始化过程

回到这里,实例化完成后

注释说明了在populateBean完成bean的初始化

继续

会看到在此方法里会调用前置和后置处理器来初始化Bean

以上就完成了bean的实例化过程,文章开头的那个图刚开始有点懵,但是一旦跑完一遍bean的实例化过程,再次结合图,就清晰了很多。本文只是简单的跟随debug顺序,完整的走了一遍bean实例化的过程,还有特殊情况并没有讨论,后期会重新用新文章再来拓展。

如有不足还请指正。

总结

到此这篇关于spring Bean创建的文章就介绍到这了,更多相关Spring Bean创建过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一起因MySQL时间戳精度引发的血案分析

    一起因MySQL时间戳精度引发的血案分析

    这篇文章主要给大家介绍了一起因MySQL时间戳精度引发的血案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • java的静态方法调用方式

    java的静态方法调用方式

    这篇文章主要介绍了java的静态方法调用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring Security权限想要细化到按钮实现示例

    Spring Security权限想要细化到按钮实现示例

    这篇文章主要为大家介绍了Spring Security权限想要细化到按钮实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 深入解析Spring中的立即加载和延迟加载

    深入解析Spring中的立即加载和延迟加载

    本文介绍了Spring框架中的立即加载和延迟加载策略,并解释了它们的适用场景和使用方法,根据具体的需求和应用场景,选择合适的加载策略,可以提高应用程序的性能和资源利用效率,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • Servlet Filter过滤器执行顺序

    Servlet Filter过滤器执行顺序

    这篇文章主要介绍了Servlet Filter过滤器执行顺序的相关资料,帮助大家更好的理解为什么要用过滤器,感兴趣的朋友可以了解下
    2020-12-12
  • Java8新特性详解与实战分享

    Java8新特性详解与实战分享

    Java 8作为Java语言的一个重要更新,引入了一系列新特性,这些特性不仅提高了代码的可读性和可维护性,还增强了程序的性能,本文将详细介绍Java 8中的几个关键使用技巧,并通过代码案例来展示它们的应用,需要的朋友可以参考下
    2024-06-06
  • JAVA_基本LDAP操作实例

    JAVA_基本LDAP操作实例

    这篇文章介绍了JAVA_基本LDAP操作实例,有需要的朋友可以参考一下
    2013-09-09
  • java递归与非递归实现扫描文件夹下所有文件

    java递归与非递归实现扫描文件夹下所有文件

    这篇文章主要为大家详细介绍了java递归与非递归实现扫描文件夹下所有文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java 关于String字符串原理上的问题

    Java 关于String字符串原理上的问题

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,让我们一起来了解它
    2022-04-04
  • Java数据脱敏常用方法(3种)

    Java数据脱敏常用方法(3种)

    数据脱敏常用在电话号码和身份证号,本文主要介绍了Java数据脱敏常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论