当前位置: 首页 > web >正文

IOC和Bean

IOC

IOC将对象的创建依赖关系的管理生命周期的控制从应用程序代码中解耦出来了

IOC容器的依赖注入(DI)

在程序运行过程中动态的向某个对象中注入他所需要的其他对象

依赖注入是基于反射实现的

Spring IOC 容器使用的是Map(concorrentMap)来存储Bean(Object)

概念

IOC,就是控制反转,也被称为依赖注入

在 Spring没出现之前,当一个对象需要使用其他对象来完成某些操作,就需要我们自己去创建或查找这些依赖的对象。

现在,有了 Spring,我们的对象交给 Spring管理,这些对象可以理解为存放在一个容器中的,这个容器就称为 Spring IoC 容器在 IoC 容器中,对象不再自己管理它们的依赖,而是通过构造方法参数、工厂方法的参数或者在对象创建后通过属性设置来定义它们的依赖关系。

Spring的 IoC 容器负责在创建对象时注入它们依赖的其他对象,也就是自动地把依赖的对象提供给需要它们的对象。这样一来,对象不再需要主动去查找或创建它们的依赖,而是由容器在创建对象时帮助它们完成依赖注入的过程。

控制反转的概念主要是与传统的直接构造(即 new 操作)来控制对象依赖的方式相反。传统方式中,一个对象通常会直接创建或查找它所依赖的其他对象,而在 IoC 中,对象将自身的控制权交给了容器,容器负责管理对象的创建和依赖注入,因此被称为「控制反转」。

Bean

Bean生命周期的四个阶段

Bean循环依赖

  • 通过field属性注入循环依赖(也就是注解@Autowired),IOC容器可能会解决掉

  • 通过构造器注入循环依赖,IOC容器不会解决掉

Spring解决循环依赖

使用三级缓存解决循环依赖

  • 第一级缓存:缓存的是已经实例化,属性注入,初始化的Bean对象(功能完备的bean)

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
  • 第二级缓存:缓存的是实例化之后没有完成属性注入,初始化的Bean对象(也就是new出来没有填充依赖属性的bean) 意义:提前暴露Bean,让其他的Bean知道这个Bean存在于IOC之中

private final Map<String, Object> earlySingletonObjects = new HashMap<16>;
  • 第三级缓存:生成原始对象进行AOP操作后的代理对象

private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

存在缓存依赖的Bean实例化的过程

http://www.xdnf.cn/news/5233.html

相关文章:

  • 【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
  • Android方法耗时监控插件开发
  • Java 基础面试题
  • 自定义类型-结构体(一)
  • 【Rust】枚举和模式匹配
  • 2025年数维杯赛题C题专家 组委会C题专家疑集锦
  • 5.8线性动态规划2
  • SpringMVC-执行流程
  • 40、C# 数组、链表、哈希、队列、栈数据结构的特点、优点和缺点
  • AI:生成对抗网络(GAN)
  • 【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
  • yocto的大致工作流程
  • CSS渲染性能优化
  • MySQL进阶篇2_SQL优化、锁
  • 探索 JWT(JSON Web Token):原理、结构与实践应用对比
  • RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
  • C# 使用 WinUI 3 项目模板创建桌面应用程序
  • 在 Kubernetes 中使用 Docker 实现 GPU 支持的完整方案
  • Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
  • 添加物体.
  • 2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证
  • 用jsp简单实现C语言标准化测试系统
  • (2025)图文解锁RAG从原理到实操
  • DeepSeek:开启物流行业创新变革新时代
  • 高效Python开发:uv包管理器全面解析
  • LeetCode热题100 两数之和
  • SAN 对抗网络搜索,搜索—智能编程—仙盟创梦IDE
  • 手机银行怎么打印流水账单(已解决)
  • vue访问后端接口,实现用户注册
  • MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?