spring Bean创建的完整过程记录

目录
  • 前言
  • 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创建过程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring实战之调用实例工厂方法创建Bean操作示例

    本文实例讲述了Spring实战之调用实例工厂方法创建Bean操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" x

  • Spring工厂方法创建(实例化)bean实例代码

    目标明确 简单叙述一下本文想要解决的问题:如何在Spring中不再使用Spring创建Bean实例,而是把Bean创建过程转移到开发者手中. 思路清晰 创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: <bean id="" class="工厂类" factory-method="静态工厂方法"/

  • Spring Bean实例的创建及构造器的挑选

    一.举个栗子 public class BeanServiceImpl implements BeanService { } @Configuration public class ConfigurationBean { @Bean public BeanService beanService() { BeanServiceImpl beanService = new BeanServiceImpl(); System.out.println("beanService: " + bea

  • Spring创建bean对象三种方式代码实例

    一.使用无参构造方法创建 二.使用静态工厂创建 三.使用实例工厂创建 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • spring Bean创建的完整过程记录

    目录 前言 bean创建的流程图 快速开始 总结 前言 复习一下spring实现IOC的源码流程准备工作: ​强烈建议大家从git上拉取spring源码来学习Spring源码.因为里面相较于IDEA生成的会有注释,里面有的方法会有注释看起来会省力一点. ​以下都是用5.0.2版本来做阐述. bean创建的流程图 写在前面:建议大家一定要自己用实例跑一遍,做好记录.如果只是看看会非常抽象.此流程图作为梗概,便于加强记忆和理解,新手或无基础的有个印象即可.等跟随本文走通一遍,在回过头看这个图,或许会

  • SpringBoot整合Swagger2的完整过程记录

    目录 前言 一.Spring Boot Web 整合 Swagger2 过程 1.1.添加 Swagger2 相关依赖 1.2.配置 Swagger2 配置类 二.配置 Swagger2 接口常用注解 2.1.@Api 请求类说明 2.2.@ApiOperation 方法的说明 2.3.@ApiImplicitParams 和 @ApiImplicitParam 方法参数说明 2.4.@ApiResponses 和 @ApiResponse 方法返回值的说明 2.5.@ApiModel 和 @A

  • Spring Bean创建和循环依赖

    目录 1 前言 2 Bean 的创建 createBeanInstance populateBean initializeBean 循环依赖问题 总结 1 前言 前文已经讲述了Spring BeanFactory 与 FactoryBean 的区别详情,在本文中将继续讲解 Bean 的创建和初始化,在这个环节中将会涉及到 Bean 的创建.初始化和循环依赖内容. 2 Bean 的创建 在前文中已经讲述了 Spring 容器启动的核心方法 refresh,关于 Bean 的创建和初始化方法都是在 

  • Spring bean对象实例化实现过程图解

    好了 我们聊聊 Bean 的实例化过程的几个重要角色 BeanDefinitionRegistryPostProcessor 接口 Refresh().invokeBeanFactoryPostProcessors 这个方法里面. BeanDefinitionRegistryPostProcessor 这个接口的调用分为三部: 1.调用实现了 PriorityOrdered 排序接口 2.调用实现了 Ordered 排序接口 3.没有实现接口的调用 这个接口我的理解:获取 BeanDefinit

  • Spring Security认证的完整流程记录

    目录 前言 认证上下文的持久化 认证信息的封装 查找处理认证的 Provider 类 认证逻辑 总结 前言 本文以用户名/密码验证方式为例,讲解 Spring Security 的认证流程,在此之前,需要你了解 Spring Security 用户名/密码认证的基本配置. Spring Security 是基于过滤器的,通过一层一层的过滤器,处理认证的流程,拦截非法请求. 认证上下文的持久化 处于最前面的过滤器叫做 SecurityContextPersistenceFilter,Spring

  • Spring bean生命周期配置过程解析

    1.实例化bean AbstractAutowireCapableBeanFactory类中的 createBeanInstance(beanName, mbd, args); 2.为bean注入属性 AbstractAutowireCapableBeanFactory类中的 populateBean(beanName, mbd, instanceWrapper); 3.调用各种实现的Aware接口(BeanNameAware, BeanFactoryAware, ApplicationCont

  • vue实现一个单文件组件的完整过程记录

    目录 前言 单文件组件 基本概念 简单的loader 解析组件内容 注册组件 获取脚本内容 Data URI和Object URI 动态导入 实现 行为层 兼容性问题及其他 总结 前言 前端开发人员只要了解过vue.js框架可能都知道单文件组件.vue.js中的单文件组件允许在一个文件中定义一个组件的所有内容.这是一个非常有用的解决方案,在浏览器网页中已经开始提倡这种机制.但是不幸的是,这个概念自从2017年8月被提出以来,到现在没有任何进展,像是已经要消亡了一样.然而,深入研究这个主题并试着使

  • SpringBoot整合EasyExcel的完整过程记录

    目录 为什么要用EasyExcel 1.EasyExcel简介 2.使用EasyExcel实现写 2.1 创建实体类 2.2 测试写Excel 3.使用EasyExcel实现读 3.1 创建读取操作的监听器 3.2 测试读Excel 4.springboot项目实践EasyExcel 4.1 pom中引入相关依赖 4.2 创建数据库表及添加数据 4.3 实体类 4.4 Controller层 4.5 Service层 4.6 创建监听器(核心部分) 4.7 结果展示 总结 为什么要用EasyEx

  • 一篇文章带你玩转Spring bean的终极利器

    前言 前面的篇幅里有提到通过InitializingBean和Disposable等接口可以对bean的初始化和销毁做一些自定义操作,那么有一点要注意,那仅仅是在bean被容器实例化之后的操作,在spring的世界里,要想对实例化这个过程做点什么,作为一个普通业务的开发人员,显然不需要去继承ApplicationContext或者BeanFactory,因为spring container为我们提供了一些接口,让我们以插件的形式去扩展BeanFactory对bean的初始化操作,其中就有我们今天

  • 详解Spring简单容器中的Bean基本加载过程

    本篇将对定义在 XMl 文件中的 bean,从静态的的定义到变成可以使用的对象的过程,即 bean 的加载和获取的过程进行一个整体的了解,不去深究,点到为止,只求对 Spring IOC 的实现过程有一个整体的感知,具体实现细节留到后面用针对性的篇章进行讲解. 首先我们来引入一个 Spring 入门使用示例,假设我们现在定义了一个类 org.zhenchao.framework.MyBean ,我们希望利用 Spring 来管理类对象,这里我们利用 Spring 经典的 XMl 配置文件形式进行

随机推荐