菜瓜:网上整天说的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容器到底是咋肥事啊?的更多相关文章

  1. Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探

    目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2 ...

  2. 解读Spring Ioc容器设计图

    在Spring Ioc容器的设计中,有俩个主要的容器系列:一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器最基本的功能:另外一个是ApplicationContext应用上下 ...

  3. Spring IOC容器基本原理

    2.2.1 IOC容器的概念IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IOC容器 ...

  4. 1.3浅谈Spring(IOC容器的实现)

    这一节我们来讨论IOC容器到底做了什么. 还是借用之前的那段代码 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationCon ...

  5. 【spring源码分析】spring ioc容器之前生今世--DefaultListableBeanFactory源码解读

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

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

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

  7. Spring IOC 容器源码分析

    声明!非原创,本文出处 Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 S ...

  8. Spring IOC容器创建bean过程浅析

    1. 背景 Spring框架本身非常庞大,源码阅读可以从Spring IOC容器的实现开始一点点了解.然而即便是IOC容器,代码仍然是非常多,短时间内全部精读完并不现实 本文分析比较浅,而完整的IOC ...

  9. Spring源码剖析2:Spring IOC容器的加载过程

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

  10. Spring IoC容器与应用上下文的设计与实现

    一.前言 写这篇博文的主要目的如下: 通过相关类和接口分析IoC容器到底长什么样. 阐述笔者对Spring上下文和容器的理解. 介绍重要的类辅助理解SpringBoot的启动流程. 二.Spring ...

随机推荐

  1. 【最新】MySQL 5.6 保姆级安装详细教程

    MySQL5.6简介 MySQL 5.6 是 MySQL 数据库管理系统的一个重要版本,以其稳定性.性能优化和功能扩充受到广泛关注与使用.该版本在数据库领域中提供了更加高效的数据处理能力.增强的复制功 ...

  2. WindowsPE文件格式入门08.导出表

    https://bpsend.net/thread-377-1-1.html 通过cff , depends灯等软件可以看到dll,导出函数的信息,因为dll中本身就存了这些信息,存了dll中有哪些导 ...

  3. 题目集8~9总结性Blog

    一.前言 对这两次题目集的总结: 这两次题目集相较于上次迭代作业来说,在题目量和难度上都做了下调.但要求我们在理解题目意思.设计好程序结构.掌握并运用知识这三方面有一定的要求.涉及到类的继承与多态,抽 ...

  4. 装在U盘或移动固态硬盘里的系统——适用于Ventoy和VirtualBox的Win to go 和 Linux to go 系统制作教程

    写在前面 前段时间, 突然想起了大学期间折腾过的双系统, 又恰逢最近学习工作需要用到Linux系统环境, 用虚拟机又感觉性能跟不上, 因此萌生了一个用移动固态硬盘安装双系统的想法. 照着网络上各位老师 ...

  5. 深入理解Nginx-模块开发与架构解析(第2版)第一章

    为什么选择Nginx 更快 高扩展性 高可靠性 低内存消耗 单机支持10万以上的并发连接 热部署 最自由的BSD许可协议 Nginx先天的事件驱动型设计.全异步的网络I/O处理机制.极少的进程间切换以 ...

  6. 代码随想录第三天 | 链表part01

    链表理论基础 建议:了解一下链表基础,以及链表和数组的区别 文章链接:https://programmercarl.com/链表理论基础.html 不是很了解链表和数组区别的可以先看看以上的文章. 2 ...

  7. 宝塔面板部署vue项目(MyAuthWeb)

    前言 在前文中,部署好后端了,就可以开始部署前端了,本文使用常见的宝塔面板演示 宝塔面板部署vue项目一般有两种方式,一种是build成纯静态,一种是直接部署node项目 本文以TianYe负责维护的 ...

  8. CC爬虫攻击测试与防护

    CC爬虫攻击测试与防护 本文章旨在对最基本的CC攻击进行测试与防护,本次测试的所有站点均为本人自建,没有也不会去攻击其他站点.希望各位读者能够遵循当地法律法规,不要做危害他人计算机的行为 测试流程 裸 ...

  9. Linux删除目录大量文件提示argument list too long

    问题说明 目录下存在大量文件时,我们删除文件使用 rm -rf *时,删除会提示如下报错: [root@SH-IDC1-10-19-3-87 kubernetes]# rm -rf kubelet* ...

  10. CentOS 使用 IUS _ SCL 第三方软件源

    CentOS 使用 IUS / SCL 第三方软件源 使用centos 经常发现官方提供的软件包版本过低,很多时候大家会选择下载源码自行编译,带来了很多麻烦. centos安装最新版本软件包,例如gi ...