Spring IOC容器启动整体流程
目录
一、简介
二、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容器启动整体流程相关推荐
- Spring IOC 容器启动、Bean生命周期详解
前言 在Spring IOC 和 AOP 概览中,简要介绍了IOC容器和AOP,没有深入IOC容器Bean的实例化,此文承接上文深入分析Bean的实例化过程.生命周期. Spring IOC的过程 S ...
- 【Spring源码】 Spring IoC容器启动之Bean创建流程
上篇已经分析完refresh()中大部分方法,也已经把Bean解析成BeanDefinition注册到IoC容器中,refresh还剩下一个非常重要的方法,就是下面将要分析的:finishBeanFa ...
- 面试官:你来说一下Spring IOC容器的创建过程
这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程,相对来说比较简单. 不 BB,上文章目录. 1. 基础知识 1.1 什么是 Spring I ...
- spring ioc容器创建过程-整体流程
文章目录 一.spring ioc 创建总览 二.BeanFactory和ApplicationContext 三.初始化DefaultListableBeanFactory 四.总结: 前面写了四篇 ...
- Spring(二)IOC容器的初始化流程
文章目录 一.Spring 核心容器类 1.1 BeanFactory 1.2 ApplicationContext 1.3 BeanDefinition 二.IOC容器的初始化 2.1 基于Xml的 ...
- Spring IOC容器的依赖注入流程(收集和注册、分析和组装)
Spring IOC容器的依赖注入流程 Spring IOC容器的依赖注入工作可以分为两个阶段: 阶段一:收集和注册 第一个阶段可以认为是构建和收集bean定义的阶段,在这个阶段中,我们可以通过XML ...
- Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】
基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Spring Ioc 源码分析(一)--Spring Ioc容器的加载
1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:Intellj idea debug 模式 ...
- spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
最新文章
- JSP的执行过程(详解)
- Fliptile (二进制压缩)
- Redis的诞生历程
- canvas3:绘制感叹号
- SQL Server 2005远程连接连不上的解决办法收藏 Microsoft给的方法
- PHP的错误处理机制
- linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图
- PHP的分页原理和简单实例
- ELK + Filebeat日志分析系统安装
- android自动修音,唱吧自动修音app下载-唱吧自动修音 安卓版v8.6.0-PC6安卓网
- android实现弹出输入法时,顶部固定,中间部分上移的效果,使用 Dialog 制作紧贴输入法顶部的输入框...
- PHP IE下载时提示”无法复制 无法读取源文件或磁盘”的解决办法
- Mac上批量修改文件的编码格式
- QCC3071与QCC3072有什么区别?
- UWB技术的工作原理
- php+msyql在线教师备课系统
- ==和===的区别、NAN
- mysql优化总结(四)
- 信安软考 第十九章 操作系统安全保护
- Linux下gmtime、gmtime_r、localtime、localtime_r函数详解
热门文章
- php标记符 编译,PHP: 编译问题 - Manual
- linux拷贝不是某个后缀的文件夹,linux下怎么把一个文件复制到多个文件夹里
- C/C++[codeup 6120]String Subtraction
- 容器技术Docker K8s 5 容器技术在阿里巴巴落地历程
- 价值连城 ImageNet图像分类大神 Andrej Karpathy的采访 给AI 深度学习从业者的建议
- 创建数据库以及该数据库下的表单
- tl-wdr5620千兆版设置虚拟服务器,TL-WDR5620路由器如何设置 TL-WDR5620路由器上网设置步骤【介绍】...
- presto执行一条查询分为七步
- 理解Visual Studio 解决方案文件格式(.sln)
- 一行代码安装jupyter | 解决jupyter下载慢的问题