【Spring】IOC容器到底是咋肥事啊?
菜瓜:网上整天说的IOC容器是个啥啊?
水稻:IOC?就是Inversion of Control,控制反转啊
菜瓜:soga,原来是控制反转啊,我知道了!你这不是等于白说吗?
水稻:别急,听我慢慢说(概念只是为了帮助人们去理解的辅助工具):
- 作为一个正常的Javaer,如果没有Spring,我们在A对象里面用到B对象,是不是要自己创建或者引用B,这些操作都是由调用者A来控制
- 来到熟悉的Spring,直接使用@Autowired注入B开箱即用,A不用再管B的创建啥的,只需要有个装B的容器给A分配就行了。这个容器就是IOC容器
菜瓜:哦,就是A引用B本来由自己创建的,结果变成了IOC容器分配对象了。且如果有多个对象之间存在引用关系就省了好多代码?
水稻:deideidei,那你知道Spring的IOC容器初始化是咋做的吗?
菜瓜:如果是我的话,就利用工厂,在项目启动的时候将所有的对象封装到一个大的容器里面,就是上次我们说的那个工厂模式稍微改造一下,把创建出来的对象存起来,用的时候再去取。
水稻:思路正确,接下来进入你最喜欢的源码解析环节。Spring启动的过程其实也是IOC容器初始化的过程,以SpringBoot为例
- 先介绍几个重点对象,再看流程
AbstractApplicationContext:核心方法refresh()定义了Spring容器的整个初始化流程 - 模板方法模式(你懂的)
AnnotationConfigApplicationContext:以注解方式启动Spring容器时的上下文。
- 初始化它的时候会调用方法AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
- 该方法会注册BeanPostProcessor接口的实现类信息到BeanDefinitionNames中,最为关键的ConfigurationClassPostProcessor为SpringBoot启动类上的注解提供了支撑
BeanFactoryPostProcessor接口:对BeanFactory指指点点
BeanPostProcessor接口:对Bean的信息指指点点
- 你知道的@Autowired@Resource@ComponentScan@Bean@Import@Configuration注解都是它的实现类来解析的- 假设你看过SpringBoot的启动类源码(你点一下那个run方法跟进去找)能发现流程中反射初始化了AnnotationConfigApplicationContext类,然后调用AbstractApplicationContext的refresh方法,对容器进行初始化
- 第一步是创建BeanFactory工厂,过程中会解析xml标签并将其封装成BeanDefinition对象
- 接下来会初始化BeanFactoryPostProcessor和BeanPostProcessors实现类对象,该过程会搜集注解形式配置的bean对象放入容器BeanDefinitionNames容器
- 最后遍历BeanDefinitionNames容器,挨个实例化对象,放入工厂中
菜瓜:流程我大概清楚了,里面还有好多细节还是懵的。想具体了解一下注解是怎么扫描的。BeanDefinition是什么。BeanPostProcessors干了什么
水稻:这个我也还整不太灵清。我得下去再看看
【Spring】IOC容器到底是咋肥事啊?的更多相关文章
- Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探
目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2 ...
- 解读Spring Ioc容器设计图
在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...
- Spring IOC容器基本原理
2.2.1 IOC容器的概念IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器 ...
- 1.3浅谈Spring(IOC容器的实现)
这一节我们来讨论IOC容器到底做了什么. 还是借用之前的那段代码 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationCon ...
- 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Spring IOC 容器源码分析
声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...
- Spring IOC容器创建bean过程浅析
1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...
- Spring源码剖析2:Spring IOC容器的加载过程
spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...
- Spring IoC容器与应用上下文的设计与实现
一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...
随机推荐
- 【最新】MySQL 5.6 保姆级安装详细教程
MySQL5.6简介 MySQL 5.6 是 MySQL 数据库管理系统的一个重要版本,以其稳定性.性能优化和功能扩充受到广泛关注与使用.该版本在数据库领域中提供了更加高效的数据处理能力.增强的复制功 ...
- WindowsPE文件格式入门08.导出表
https://bpsend.net/thread-377-1-1.html 通过cff , depends灯等软件可以看到dll,导出函数的信息,因为dll中本身就存了这些信息,存了dll中有哪些导 ...
- 题目集8~9总结性Blog
一.前言 对这两次题目集的总结: 这两次题目集相较于上次迭代作业来说,在题目量和难度上都做了下调.但要求我们在理解题目意思.设计好程序结构.掌握并运用知识这三方面有一定的要求.涉及到类的继承与多态,抽 ...
- 装在U盘或移动固态硬盘里的系统——适用于Ventoy和VirtualBox的Win to go 和 Linux to go 系统制作教程
写在前面 前段时间, 突然想起了大学期间折腾过的双系统, 又恰逢最近学习工作需要用到Linux系统环境, 用虚拟机又感觉性能跟不上, 因此萌生了一个用移动固态硬盘安装双系统的想法. 照着网络上各位老师 ...
- 深入理解Nginx-模块开发与架构解析(第2版)第一章
为什么选择Nginx 更快 高扩展性 高可靠性 低内存消耗 单机支持10万以上的并发连接 热部署 最自由的BSD许可协议 Nginx先天的事件驱动型设计.全异步的网络I/O处理机制.极少的进程间切换以 ...
- 代码随想录第三天 | 链表part01
链表理论基础 建议:了解一下链表基础,以及链表和数组的区别 文章链接:https://programmercarl.com/链表理论基础.html 不是很了解链表和数组区别的可以先看看以上的文章. 2 ...
- 宝塔面板部署vue项目(MyAuthWeb)
前言 在前文中,部署好后端了,就可以开始部署前端了,本文使用常见的宝塔面板演示 宝塔面板部署vue项目一般有两种方式,一种是build成纯静态,一种是直接部署node项目 本文以TianYe负责维护的 ...
- CC爬虫攻击测试与防护
CC爬虫攻击测试与防护 本文章旨在对最基本的CC攻击进行测试与防护,本次测试的所有站点均为本人自建,没有也不会去攻击其他站点.希望各位读者能够遵循当地法律法规,不要做危害他人计算机的行为 测试流程 裸 ...
- Linux删除目录大量文件提示argument list too long
问题说明 目录下存在大量文件时,我们删除文件使用 rm -rf *时,删除会提示如下报错: [root@SH-IDC1-10-19-3-87 kubernetes]# rm -rf kubelet* ...
- CentOS 使用 IUS _ SCL 第三方软件源
CentOS 使用 IUS / SCL 第三方软件源 使用centos 经常发现官方提供的软件包版本过低,很多时候大家会选择下载源码自行编译,带来了很多麻烦. centos安装最新版本软件包,例如gi ...