spring IOC控制反转

news2025/6/2 14:23:44

控制反转,将对象的创建进行反转,常规情况下,对象都是开发者手动创建的,使用 loC 开发者不再需要创建对象,而是由IOC容器根据需求自动创建项目所需要的对象

  • 不用IOC,所有对象IOC开发者自己创建
  • 使用IOC,直接告诉框架,我需要哪些东西,然后spring框架创建,然后我们再拿出来用

IOC创建对象的方式:基于XML(少的很)和基于注解(配置类,扫描包)

基于XML:xml通过解析+反射创建对象。开发者把需要的对象在 XML 中进行配置,Spring 框架读取这个配置文件,根据配置文件的内容来创建对象。比较麻烦。

基于注解

1,通过配置类:用一个java类来替代XML文件,把在XML中配置的内容放到配置类中

        新建一个配置类,加@Configuration注解,这个类就相当于整个XML文件。这个类里面创建一个方法,就对应xml中的bean,返回对象即可。方法上加@Bean注解,让spring可以调用这个方法,将这个方法返回的对象存到IOC里面

        怎么获取:Bean的名称默认是方法名,也可以通过@Bean改

        感觉还是比较麻烦,写的东西太多了

2,扫包+注解

        不再依赖XML和配置类,直接将bean的创建交给目标类,在目标类添加注解来创建

        直接给类加注解,@Component注解告诉spring框架,这个类要被注入到IOC

        怎么用:加载IOC容器,指定包名扫包,然后直接就可以取Bean

        可以实现依赖注入

        依赖注入,就是一个类里面有别的类,一个对象里有其他对象,那我在这个里面的对象上加个@Autowired自动注入注解:在IOC容器里找到对应Bean,再赋值给里面的类

@Autowired:默认通过类型注入,所以在类里面叫啥名都能取出。如果要通过名字去找,那就加@Qualifier注解:表示要找名字叫啥的bean

  1. IOC容器本体在堆里面

  2. ​Bean定义存储在方法区+堆里

  3. ​​BeanDefinition​​存储在堆内存

  4. ​​Bean实例存储在堆内存(单例池​​(singletonObjects))

  5. IOC容器实例、Bean实例在堆里

  6. Bean类元数据在方法区

  7. IOC容器本身是堆内存中的一个特殊对象

  8. 所有单例Bean实例存储在容器的singletonObjects(堆内存)

  9. 类定义等元数据存储在方法区(Metaspace)

​🌰 用“餐厅点餐”比喻 Spring IOC​

想象你在一家餐厅吃饭,点了一份 ​​红烧肉​​。

​1. 传统方式(没有IOC)​

  • ​你自己动手做菜​​(相当于传统Java开发):
    • 你需要:买肉、切肉、炒菜、调味...(​​手动创建对象​​)
    • 问题:​​耦合度高​​(如果你换了一道菜,整个流程都要改)

​2. Spring IOC方式(控制反转)​

  • ​你只需要点菜,厨师(Spring容器)帮你做​​:
    • ​你(程序员)​​:告诉餐厅(Spring)你要什么(@Component@Service等)
    • ​餐厅(Spring容器)​​:
      • 有一个​​菜单(Bean定义)​​,记录所有能做的菜(BeanDefinition
      • 有一个​​厨房(IOC容器)​​,负责做菜(ApplicationContext
      • 有一个​​服务员(依赖注入)​​,把做好的菜端给你(@Autowired

​📌 关键名词解释​

​专业名词​​餐厅比喻​​作用​
​IOC(控制反转)​你不用自己做菜,交给餐厅​对象的创建权交给Spring​
​DI(依赖注入)​服务员把菜端给你​自动装配对象​
​Bean​餐厅的菜(如红烧肉、鱼香肉丝)​Spring管理的Java对象​
​ApplicationContext​餐厅的厨房+菜单系统​Spring容器的核心接口​
​BeanDefinition​菜单上的菜谱(记录怎么做)​描述如何创建Bean​
​@Component/@Service​你在菜单上登记新菜​告诉Spring这个类要管理​
​@Autowired​服务员自动送菜​自动注入依赖对象​

​🍳 代码示例​

​1. 传统方式(手动创建对象)​

public class Restaurant {
    public static void main(String[] args) {
        // 你自己做菜(手动new对象)
        Chef chef = new Chef();
        Dish dish = chef.cook("红烧肉");
        System.out.println("吃:" + dish.getName());
    }
}

​问题​​:如果换厨师(new AnotherChef()),代码要改很多地方。


​2. Spring IOC方式(自动管理对象)​

​(1) 定义Bean(登记菜单)​
@Service // 告诉Spring:这是一个Bean,让容器管理
public class Chef {
    public Dish cook(String name) {
        return new Dish(name);
    }
}
​(2) 依赖注入(自动送菜)​
@RestController
public class RestaurantController {
    
    @Autowired // Spring自动找Chef对象并注入
    private Chef chef;
    
    @GetMapping("/order")
    public String order() {
        Dish dish = chef.cook("红烧肉");
        return "吃:" + dish.getName();
    }
}

​优势​​:

  • ​不用自己new Chef()​,Spring自动管理
  • ​换厨师(换实现类)不影响代码​​(只需改配置)

​🔍 核心思想总结​

  1. ​IOC(控制反转)​​:对象的创建权交给Spring,你不用自己new
  2. ​DI(依赖注入)​​:Spring自动把依赖的对象(如Chef)注入到你的类里。
  3. ​Bean​​:Spring管理的对象(@Component@Service等标注的类)。
  4. ​ApplicationContext​​:Spring的“厨房”,负责创建和管理Bean。

​🚀 一句话理解​

​传统开发​​:你自己做菜(手动new对象)
​Spring IOC​​:你点菜,餐厅(Spring)做好送给你(自动管理对象)

这样代码更灵活、更易维护! 🎯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2394045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode hot100刷题日记——31.二叉树的直径

二叉树直径详解 题目描述对直径的理解解答:dfs小TIPS 题目描述 对直径的理解 实际上,二叉树的任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。 那我们找二叉树的直径(最大路径&#xff09…

行为型:解释器模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的:针对某种语言并基于其语法特征创建一系列的表达式类(包括终极表达式与非终极表达式)​,利用树结构模式…

linux 1.0.3

挂载 这个虚拟机啥时候都能挂起 会有一个这个东东 选择连接虚拟机,然后就连到linux了 这有两个键,一个是和主机连接一个是和虚拟机连接 先把U盘拔掉 原本是没有这个盘的,但是插上去之后,电脑创建了一个虚拟的盘 也就是图中的F…

C#集合循环删除某些行

你想要在遍历集合(例如List)的同时删除某些元素时,直接在循环中删除元素可能会导致问题,因为这可能会改变集合的大小和导致索引问题; 可以用for循环的倒序来删除; 如果要删除满足特定条件的所有元素&…

【Linux 学习计划】-- 进程地址空间

目录 进程地址的引入 进程地址空间基础原理 区域划分的本质 如何理解进程地址空间 越界访问的本质 进一步理解写时拷贝 重谈 fork 返回值 结语 进程地址的引入 我们先来看一段代码: 首先我们可以看到,父进程和子进程是可以同时可以看到一个变量…

CTFHub-RCE 命令注入-过滤空格

观察源代码 代码里面可以发现过滤了空格 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 我们尝试将空格转义打开这个文件 利用 ${IFS} 127.0.0.1|cat${IFS}flag_195671031713417.php 可是发现 文本内容显示不出来&…

Express教程【002】:Express监听GET和POST请求

文章目录 2、监听post和get请求2.1 监听GET请求2.2 监听POST请求 2、监听post和get请求 创建02-app.js文件。 2.1 监听GET请求 1️⃣通过app.get()方法,可以监听客户端的GET请求,具体的语法格式如下: // 1、导入express const express req…

【PostgreSQL 03】PostGIS空间数据深度实战:从地图服务到智慧城市

PostGIS空间数据深度实战:从地图服务到智慧城市 关键词 PostGIS, 空间数据库, 地理信息系统, GIS, 空间查询, 地理分析, 位置服务, 智慧城市, 空间索引, 坐标系统 摘要 PostGIS是PostgreSQL的空间数据扩展,它将普通的关系数据库转变为强大的地理信息系统…

HIT-csapp大作业:程序人生-HELLO‘s P2P

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算学部 学  号 2023111813 班 级 23L0518 学 生 鲁永哲 指 导 教 师 史先俊 计…

深入探讨redis:主从复制

前言 如果某个服务器程序,只部署在一个物理服务器上就可能会面临一下问题(单点问题) 可用性问题,如果这个机器挂了,那么对应的客户端服务也相继断开性能/支持的并发量有限 所以为了解决这些问题,就要引入分布式系统&#xff0c…

帕金森常见情况解读

一、身体出现的异常节奏​ 帕金森会让身体原本协调的 “舞步” 出现错乱。它是一种影响身体行动能力的状况,随着时间推进,就像老旧的时钟,齿轮转动不再顺畅,使得身体各个部位的配合逐渐失衡,打乱日常行动的节奏。​ …

清华大学发Nature!光学工程+神经网络创新结合

2025深度学习发论文&模型涨点之——光学工程神经网络 清华大学的一项开创性研究成果在《Nature》上发表,为光学神经网络的发展注入了强劲动力。该研究团队巧妙地提出了一种全前向模式(Fully Forward Mode,FFM)的训练方法&…

【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】

1. 背景 在前面的文章中,我们已经介绍了 carplay 在车机中的角色划分, 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。 【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】…

C++学习-入门到精通【11】输入/输出流的深入剖析

C学习-入门到精通【11】输入/输出流的深入剖析 目录 C学习-入门到精通【11】输入/输出流的深入剖析一、流1.传统流和标准流2.iostream库的头文件3.输入/输出流的类的对象 二、输出流1.char* 变量的输出2.使用成员函数put进行字符输出 三、输入流1.get和getline成员函数2.istrea…

NW969NW978美光闪存颗粒NW980NW984

NW969NW978美光闪存颗粒NW980NW984 技术解析:NW969、NW978、NW980与NW984的架构创新 美光(Micron)的闪存颗粒系列,尤其是NW969、NW978、NW980和NW984,代表了存储技术的前沿突破。这些产品均采用第九代3D TLC&#xf…

使用 ssld 提取CMS 签名并重签名

拿SpringBoard的cms签名和entitlements.xml,对tihook.dylib进行重签名 工具来源:https://github.com/eksenior/ssld

大厂前端研发岗位PWA面试题及解析

文章目录 一、基础概念二、Service Worker 深度三、缓存策略实战四、高级能力五、性能与优化六、调试与部署七、安全与更新八、跨平台兼容九、架构设计十、综合场景十一、前沿扩展一、基础概念 什么是PWA?列举3个核心特性 解析:渐进式网页应用。核心特性:离线可用、类原生体…

第十四章 MQTT订阅

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

腾讯云推出云开发AI Toolkit,国内首个面向智能编程的后端服务

5月28日,腾讯云开发 CloudBase 宣布推出 AI Toolkit(CloudBase AI Toolkit),这是国内首个面向智能编程的后端服务,适配 Cursor 等主流 AI 编程工具。 云开发 AI Toolkit旨在解决 AI 辅助编程的“最后一公里”问题&…

前端-不对用户显示

这是steam的商店偏好设置界面,在没有被锁在国区的steam账号会有5个选项,而被锁在国区的账号只有3个选项,这里使用的技术手段仅仅在前端隐藏了这个其他两个按钮。 单击F12打开开发者模式 单击1处,找到这一行代码,可以看…