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

spring IOC控制反转

控制反转,将对象的创建进行反转,常规情况下,对象都是开发者手动创建的,使用 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)做好送给你(自动管理对象)

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

相关文章:

spring IOC控制反转

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

hot100 -- 1.哈希系列

1.两数之和 题目: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 题解: 方法1:暴力求解 def get_two_sum(nums, target):for i in range(len(nums)):for j in range(i1, len(nums)):if nums[i] nums[j…...

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

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

行为型:解释器模式

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

逻辑回归详解:从原理到实践

在机器学习的广阔领域中,逻辑回归(Logistic Regression)虽名为 “回归”,实则是一种用于解决二分类(0 或 1)问题的有监督学习算法。它凭借简单易懂的原理、高效的计算性能以及出色的解释性,在数…...

FastAPI集成APsecheduler的BackgroundScheduler+mongodb(精简)

项目架构: FastAPI(folder) >app(folder) >core(folder) >models(folder) >routers(folder) >utils(folder) main.py(file) 1 utils文件夹下新建schedulers.py from apscheduler.schedulers.background import BackgroundScheduler from apschedu…...

本地部署FreeGPT+内网穿透公网远程访问,搞定ChatGPT外网访问难题

‌FreeGPT‌是一个基于GPT 3.5/4的ChatGPT聊天网页用户界面,提供了一个开放的聊天界面,开箱即用‌。ChatGPT是非常热门的,但访问体验一直不太理想。为了解决这一问题,出现了各类方法和工具,其中FreeGPT是一款非常实用的…...

linux 1.0.3

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

基于RK3588的智慧农场系统开发|RS485总线|华为云IOT|node-red|MQTT

一、硬件连接流程 本次采用的是 总线型拓扑:所有设备并联到两根 RS485 总线上(A 和 B-) 二、通信协议配置 1. 主从通信模式 RS485 是半双工:同一时间只能有一个设备发送数据主从架构:通常一个主设备(…...

解锁程序人生学习成长密码,从目标设定开始

解锁程序人生学习成长密码,从目标设定开始 关键词:程序员成长、目标设定、学习路径、技能提升、职业规划、刻意练习、反馈机制 摘要:本文深入探讨程序员如何通过科学的目标设定方法实现职业成长。文章从目标设定的重要性出发,详细介绍了SMART原则、OKR方法等技术,并结合程…...

简单cnn

数据增强 在图像数据预处理环节,为提升数据多样性,可采用数据增强(数据增广)策略。该策略通常不改变单次训练的样本总数,而是通过对现有图像进行多样化变换,使每次训练输入的样本呈现更丰富的形态差异&…...

C#集合循环删除某些行

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

相机定屏问题分析四:【cameraserver 最大request buffer超标】后置视频模式预览定屏闪退至桌面

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:相机定屏问题分析三:【配流ConfigStream失败】外屏打开相机视频照片人像来回切换后,相机页面卡死,点击没反应9055522 这一篇我们开始讲: 相机定屏问题分析四:【cameraserver 最大request buffer超…...

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

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

告别重复 - Ansible 配置管理入门与核心价值

告别重复 - Ansible 配置管理入门与核心价值 还记得我们在 SRE 基础系列中反复强调的“减少琐事 (Toil)”和“拥抱自动化”吗?想象一下这些场景: 你需要部署一个新的 Web 服务集群,每台服务器都需要安装 Nginx、配置防火墙规则、同步 Web 内容、启动服务……手动操作不仅耗时…...

3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云

目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码…...

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

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

卫生间改造翻新怎么选产品?我在瑞尔特找到了解决方案

在一场打掉重来的卫生间翻新改造中,最令人头疼的,从来都不是瓷砖、吊顶这类“看得见”的工序,而是那些每天都在用、但选错一次就要懊悔好多年的卫浴产品。从功能到体验,从老人适配到美学搭配,这事真不是买个贵的就够了…...

C++ list数据删除、list数据访问、list反转链表、list数据排序

list数据删除&#xff0c;代码见下 #include<iostream> #include<list>using namespace std;void printList(const list<int>& l) {for (list<int>::const_iterator it l.begin(); it ! l.end(); it) {cout << *it << " "…...

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()方法&#xff0c;可以监听客户端的GET请求&#xff0c;具体的语法格式如下&#xff1a; // 1、导入express const express req…...

mysql安装教程--笔记

一、Windows 系统安装 方法1&#xff1a;使用 MySQL Installer&#xff08;推荐&#xff09; 1. 下载安装包 访问 MySQL 官网下载页面&#xff0c;选择 MySQL Installer for Windows。 2. 运行安装程序 双击下载的 .msi 文件&#xff0c;选择安装类型&#xff1a; ◦ Developer…...

C++ 观察者模式:设计与实现详解

一、引言 在现代软件开发中,组件间的交互与通信是系统设计的核心挑战之一。观察者模式(Observer Pattern)作为一种行为设计模式,提供了一种优雅的解决方案,用于实现对象间的一对多依赖关系。本文将深入探讨 C++ 中观察者模式的设计理念、实现方式及其应用场景。 二、观察…...

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

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

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

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

深入探讨redis:主从复制

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

帕金森常见情况解读

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

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

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

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

1. 背景 在前面的文章中&#xff0c;我们已经介绍了 carplay 在车机中的角色划分&#xff0c; 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。 【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 技术解析&#xff1a;NW969、NW978、NW980与NW984的架构创新 美光&#xff08;Micron&#xff09;的闪存颗粒系列&#xff0c;尤其是NW969、NW978、NW980和NW984&#xff0c;代表了存储技术的前沿突破。这些产品均采用第九代3D TLC&#xf…...