目录

一、简介

二、IOC整体流程


一、简介

Spring核心有两个:

  • IOC:控制反转
  • AOP:面向切面编程

相信大家在项目中都使用过Spring进行开发,都知道Spring非常强大,那么在熟练掌握Spring进行开发后,我们有必要去了解一下其中的原理,Spring工作原理也是面试中必问的一个环节,先来看看几道常见的面试题,想想看,如果被面试官问到,你会怎么答?

  • Spring IOC的工作原理?
  • Spring Bean的生命周期是怎样的?
  • Spring 中使用到了哪些设计模式?
  • Spring是如何解决循环依赖的?
  • BeanFactory和FactoryBean的区别是什么?
  • ....

显然,我们需要从源码中获取我们想要的答案,本篇文章我们先来分析一下Spring中IOC容器整个初始化过程,本篇文章暂且先不详细分析源码实现,先把整个流程理清,后面再针对其中一些重要的环节逐个分析源码是如何实现的,这样可能没那么懵,不然一进来就直接一个一个细节去抠,可能跟着跟着不知道从哪个方法进来的了。

二、IOC整体流程

Spring IOC的核心工厂类其实就是BeanFactory,从名字上也很好理解,生产 bean 的工厂,它负责生产和管理各个 bean 实例。在项目中我们更多的是使用它的子类或者实现类,像常见的AbstractApplicationContext、ApplicationContext、DefaultListableBeanFactory、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等等。

我们先来回顾一下最基本的启动 Spring 容器的例子:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
System.out.println(applicationContext.getBean("student"));

如上代码就可以利用XML配置文件来启动一个 Spring 容器。

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)throws BeansException {super(parent);// 1、设置配置文件的路径setConfigLocations(configLocations);if (refresh) {//2、容器刷新方法:IOC核心方法就是refresh()refresh();}}

在ClassPathXmlApplicationContext的构造方法中,我们可以看到有一个refresh()方法,它是整个IOC容器的核心。

refresh()主要做了下述12件事情,先说个大概:

  • 1、prepareRefresh()

容器刷新前的一些预处理工作。

  • 2、obtainFreshBeanFactory()

创建DefaultListableBeanFactory工厂,给bean工厂设置一些属性,加载配置文件信息,封装成bean定义信息。

  • 3、prepareBeanFactory(beanFactory)

同样,设置bean工厂的一些属性,如添加一些BeanPostProcessor增强器等。

  • 4、postProcessBeanFactory(beanFactory)

模板方法,留给子类扩展实现。

  • 5、invokeBeanFactoryPostProcessors(beanFactory)

执行BeanFactoryPostProcessor的postProcessBeanFactory ()增强方法。

  • 6、registerBeanPostProcessors(beanFactory)

注册BeanPostProcessor增强器,注意这里只是注册,真正是在初始化阶段的前后执行。

  • 7、initMessageSource()

初始化MessageSource,国际化处理。

  • 8、initApplicationEventMulticaster()

初始化事件多播器。

  • 9、onRefresh()

模板方法,留给子类扩展实现。

  • 10、registerListeners()

注册一些监听器。

  • 11、finishBeanFactoryInitialization(beanFactory)

IOC容器创建最重要的一个步骤:完成非懒加载的单例bean对象的实例化,包括反射创建bean对象、属性填充、循环依赖的处理、bean的初始化等等。

  • 12、finishRefresh()

容器刷新完成之后的一些处理工作。

前面我们通过文字描述了refresh()方法主要的处理流程,下面通过两张图来说明,会更加形象,好理解一点:

这里可能稍微就涉及到一些细节了,有些许复杂,大家可以先过几遍,有个印象后自己再去看源码,相信会更加清晰里面的处理逻辑。

好了,本篇文章就先介绍Spring IOC容器创建的整体流程,后面再针对部分重要的步骤进行详细的源码分析。

希望本篇文章对大家理解Spring IOC创建流程有一个比较好的认识,也希望大家能反馈表述错误或不合理、或可完善的地方,一起学习,一起进步。

Spring IOC容器启动整体流程相关推荐

  1. Spring IOC 容器启动、Bean生命周期详解

    前言 在Spring IOC 和 AOP 概览中,简要介绍了IOC容器和AOP,没有深入IOC容器Bean的实例化,此文承接上文深入分析Bean的实例化过程.生命周期. Spring IOC的过程 S ...

  2. 【Spring源码】 Spring IoC容器启动之Bean创建流程

    上篇已经分析完refresh()中大部分方法,也已经把Bean解析成BeanDefinition注册到IoC容器中,refresh还剩下一个非常重要的方法,就是下面将要分析的:finishBeanFa ...

  3. 面试官:你来说一下Spring IOC容器的创建过程

    这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程,相对来说比较简单. 不 BB,上文章目录. 1. 基础知识 1.1 什么是 Spring I ...

  4. spring ioc容器创建过程-整体流程

    文章目录 一.spring ioc 创建总览 二.BeanFactory和ApplicationContext 三.初始化DefaultListableBeanFactory 四.总结: 前面写了四篇 ...

  5. Spring(二)IOC容器的初始化流程

    文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...

  6. Spring IOC容器的依赖注入流程(收集和注册、分析和组装)

    Spring IOC容器的依赖注入流程 Spring IOC容器的依赖注入工作可以分为两个阶段: 阶段一:收集和注册 第一个阶段可以认为是构建和收集bean定义的阶段,在这个阶段中,我们可以通过XML ...

  7. Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】

      基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...

  8. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  9. Spring Ioc 源码分析(一)--Spring Ioc容器的加载

    1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:Intellj idea debug 模式 ...

  10. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

最新文章

  1. JSP的执行过程(详解)
  2. Fliptile (二进制压缩)
  3. Redis的诞生历程
  4. canvas3:绘制感叹号
  5. SQL Server 2005远程连接连不上的解决办法收藏 Microsoft给的方法
  6. PHP的错误处理机制
  7. linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图
  8. PHP的分页原理和简单实例
  9. ELK + Filebeat日志分析系统安装
  10. android自动修音,唱吧自动修音app下载-唱吧自动修音 安卓版v8.6.0-PC6安卓网
  11. android实现弹出输入法时,顶部固定,中间部分上移的效果,使用 Dialog 制作紧贴输入法顶部的输入框...
  12. PHP IE下载时提示”无法复制 无法读取源文件或磁盘”的解决办法
  13. Mac上批量修改文件的编码格式
  14. QCC3071与QCC3072有什么区别?
  15. UWB技术的工作原理
  16. php+msyql在线教师备课系统
  17. ==和===的区别、NAN
  18. mysql优化总结(四)
  19. 信安软考 第十九章 操作系统安全保护
  20. Linux下gmtime、gmtime_r、localtime、localtime_r函数详解

热门文章

  1. php标记符 编译,PHP: 编译问题 - Manual
  2. linux拷贝不是某个后缀的文件夹,linux下怎么把一个文件复制到多个文件夹里
  3. C/C++[codeup 6120]String Subtraction
  4. 容器技术Docker K8s 5 容器技术在阿里巴巴落地历程
  5. 价值连城 ImageNet图像分类大神 Andrej Karpathy的采访 给AI 深度学习从业者的建议
  6. 创建数据库以及该数据库下的表单
  7. tl-wdr5620千兆版设置虚拟服务器,TL-WDR5620路由器如何设置 TL-WDR5620路由器上网设置步骤【介绍】...
  8. presto执行一条查询分为七步
  9. 理解Visual Studio 解决方案文件格式(.sln)
  10. 一行代码安装jupyter | 解决jupyter下载慢的问题