Spring IOC核心详解:掌握控制反转与依赖注入
文章目录
- 前言
- 一、IOC核心思想
- 二、IOC容器实现
- 1.核心接口:
- 2.XML配置范例
- 三、Bean管理实践
- 1.创建对象
- (1)基于xml方式创建对象
- (2)用注解的方式创建对象
- 2.依赖注入
- (1)基于xml方式注入属性
- 基础类型注入
- 集合类型注入
- 对象引用注入
- (2)用注解的方式注入属性
- 基础类型注入
- 集合类型注入
- 对象关系注入
- (3)配置方式关键对比表
- 四、IOC优势总结
- 总结
前言
在传统软件开发中,对象间的依赖关系往往通过硬编码实现:类A直接实例化类B,形成紧密的代码耦合。这种模式导致系统难以维护、扩展困难,且单元测试复杂度陡增。
Spring的IOC(控制反转) 正是为解决这一问题而生。
一、IOC核心思想
传统开发痛点:对象间强耦合(A类直接new B类对象)
解决方案:工厂模式+反射机制+XML解析,实现控制权反转
二、IOC容器实现
1.核心接口:
- BeanFactory:延迟加载(使用时创建对象)
- ApplicationContext:立即加载(推荐使用)
// 基础容器(延迟加载)
BeanFactory factory = new XmlBeanFactory(resource);
// 增强容器(立即加载)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
2.XML配置范例
<!-- 创建对象 -->
<bean id="userService" class="com.example.UserServiceImpl"/><!-- 依赖注入 -->
<bean id="dataSource" class="com.example.DruidDataSource"><property name="url" value="jdbc:mysql://localhost:3306/db"/><property name="username" value="root"/><property name="password" value="123456"/>
</bean>
三、Bean管理实践
1.创建对象
(1)基于xml方式创建对象
核心配置语法:
<!-- 基础对象定义 -->
<bean id="userService" class="com.example.UserServiceImpl"/><!-- 带初始化参数的构造器 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><constructor-arg name="url" value="jdbc:mysql://localhost:3306/db"/>
</bean>
关键要素解析:
- id:Bean的唯一标识符(IOC容器中的对象名称)
- class:全限定类名(包名+类名)
- 默认机制:调用无参构造器实例化对象
默认示例:
<!-- 服务层Bean -->
<bean id="orderService" class="com.service.OrderServiceImpl"/><!-- DAO层Bean -->
<bean id="userDao" class="com.dao.UserDaoImpl"/>
(2)用注解的方式创建对象
Spring核心注解映射表
注解 | 适用场景 | 等效XML配置 |
---|---|---|
@Component | 通用组件声明 | <bean class="完整类路径"/> |
@Service | 业务逻辑层组件 | <bean id="service".../> |
@Repository | 数据持久层组件 | <bean id="dao".../> |
@Controller | 表现层控制器 | <bean id="controller".../> |
注解特性说明:
- 四者本质都是
@Component
的特殊化形式 - 默认Bean命名规则:首字母小写的类名(如
UserServiceImpl
→userServiceImpl
) - 可通过注解value属性自定义Bean名称(例:
@Service("orderService")
)
实现步骤:
<context:component-scan base-package="com.example"/>
开启组件扫描
@Service("orderService") // 自定义Bean名称
public class OrderServiceImpl implements OrderService {// 类实现
}
最佳实践:
- 明确分层使用特定注解(如@Service用于服务层)
- 默认Bean名称为类名首字母小写(如UserDaoImpl→userDaoImpl)
- 需要配合@ComponentScan注解或XML配置开启扫描
2.依赖注入
(1)基于xml方式注入属性
基础类型注入
<bean id="config" class="com.example.AppConfig"><property name="maxThread" value="200"/><property name="timeout" value="5000"/>
</bean>
集合类型注入
<bean id="collectionBean" class="com.example.CollectionDemo"><!-- 数组注入 --><property name="ips"><array><value>192.168.1.1</value><value>10.0.0.1</value></array></property><!-- Map注入 --><property name="settings"><map><entry key="env" value="prod"/><entry key="version" value="1.2.0"/></map></property><!-- 对象引用集合 --><property name="services"><list><ref bean="userService"/><ref bean="orderService"/></list></property>
</bean>
对象引用注入
<bean id="userService" class="com.service.UserServiceImpl"><property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.dao.UserDaoImpl"/>
(2)用注解的方式注入属性
基础类型注入
@Service
public class PaymentService {@Value("${payment.timeout:300}") // 带默认值的属性注入private Integer timeout;@Value("Alipay") // 直接赋值private String defaultMethod;
}
集合类型注入
@Configuration
public class AppConfig {@Beanpublic List<String> whiteList() {return Arrays.asList("192.168.1.1", "10.0.0.1");}
}@Service
public class SecurityService {@Autowiredprivate List<String> whiteList; // 自动注入集合
}
对象关系注入
@Service
public class OrderService {// 按类型自动装配(推荐方式)@Autowiredprivate UserDao userDao;// 精确指定Bean名称@Autowired@Qualifier("clusterUserDao")private UserDao backupDao;// 构造器注入(不可变依赖推荐)private final PaymentService paymentService;@Autowiredpublic OrderService(PaymentService paymentService) {this.paymentService = paymentService;}
}
(3)配置方式关键对比表
特性 | XML配置 | 注解方式 |
---|---|---|
可读性 | 集中配置,结构层级清晰 | 配置分散在代码中,需结合代码阅读 |
维护性 | 修改配置需重新编译部署 | 配置与代码共存,修改即时生效 |
灵活性 | 支持热更新,运行时动态调整 | 需重新编译生效 |
复杂配置 | 擅长处理多对象嵌套关系 | 适合简单直接的配置 |
适用场景 | 第三方组件集成/历史遗留系统改造 | 现代Spring应用/自主开发组件管理 |
对比说明:
- 混合配置策略推荐:核心业务组件使用注解,基础设施配置使用XML
- 注解方式编译时验证更严格,能提前发现配置错误
- XML支持
placeholder
动态替换,适合环境差异配置 - 注解驱动开发效率更高,符合现代编程习惯
四、IOC优势总结
- 解耦:对象创建权交给容器
- 可维护:统一管理依赖关系
- 易测试:轻松替换Mock对象
- 扩展性强:方便集成其他框架
总结
IOC不仅是框架特性,更代表了软件设计的哲学转变。掌握其精髓,开发者将能构建出真正面向变化的弹性系统,在快速迭代的数字化时代保持技术竞争力。通过深入理解对象创建和依赖注入的多种实现方式,开发者可以根据具体场景灵活选择最合适的配置策略,构建出既灵活又易于维护的Spring应用程序。
相关文章:
Spring IOC核心详解:掌握控制反转与依赖注入
文章目录 前言一、IOC核心思想二、IOC容器实现1.核心接口:2.XML配置范例 三、Bean管理实践1.创建对象(1)基于xml方式创建对象(2)用注解的方式创建对象 2.依赖注入(1)基于xml方式注入属性基础类型…...
Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发
DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序,必须通过Servlet来处理 没有Servlet,java是无法处理web请求的 Web交互: 接收请求HttpServletRequest:可以获取到请求的信息,比如uri&#…...
Linux 内核源码阅读——ipv4
Linux 内核源码阅读——ipv4 综述 在 Linux 内核中,IPv4 协议的实现主要分布在 net/ipv4/ 目录下。以下是一些关键的源文件及其作用: 1. 协议栈核心 net/ipv4/ip_input.c:处理接收到的 IPv4 数据包(输入路径)。net…...
组合总和 II:去重逻辑深度解析
组合总和 II:去重逻辑深度解析 在算法中,解决“组合总和 II”这类问题时,去重往往是最具挑战性的一环。如何避免重复组合,同时保证所有组合的唯一性,是实现高效算法的关键。今天,我们就来深度解析组合总和…...
蓝桥杯备考:二分答案之路标设置
最大距离,找最小空旷指数值,我们是很容易想到用二分的,我们再看看这个答案有没有二段性 是有这么个二段性的,我们只要二分就行了,但是二分的check函数是有点不好想的,我们枚举空旷值的时候,为了…...
[HY000][1366] Incorrect string value: ‘å¼ ä¸‘ for column ‘name‘ at row 1
常见原因 字符集不兼容 插入的数据包含当前字符集(如 latin1)不支持的特殊字符(如中文、Emoji 等)。 表、列或连接的字符集未正确配置为支持目标字符(如未使用 utf8mb4)。 客户端/服务端编码不一致 客户…...
什么是C++对象之间的view proxies
在C中,view proxies 是一种轻量级的对象,用于提供对另一个对象的间接访问或视图,而不直接拥有或管理该对象的数据。它们通常用于简化对复杂数据结构的访问,或在不需要复制数据的情况下提供特定的视图。 1. View Proxies 的核心概…...
MyBatis参数赋值技巧:#{} 和 ${} 的区别与实践
目录 一、前言二、 #{} 和${} 的使用方法和区别2.1 #{}使用方法2.2 ${}使用方法2.3#{} 和 ${} 的主要区别2.4使用建议 三、总结 一、前言 在 MyBatis 中,#{} 和 ${} 都用于在 SQL 语句中绑定参数,但它们在具体实现和安全性方面有所不同。理解它们的区别…...
5-1 使用ECharts将MySQL数据库中的数据可视化
方法一:使用Python Flask框架搭建API 对于技术小白来说,使用ECharts将MySQL数据库中的数据可视化需要分步骤完成。以下是详细的实现流程: 一、技术架构 后端服务:使用Python Flask框架搭建API(简单易学ÿ…...
协程的调度的对称与非对称
下图表示的就是对称协程,进入到该协程之后只能有一个操作就是yield,把cpu让回给调度器; 下图表示非对称协议,可以有两个操作,就是resume和yield,从哪里resume的,yield就会回到该位子;...
C# 中比较实用的关键字,基础高频面试题!
前言 在C#编程中关键字是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧。熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键。 DotNetGuide 全面的C#/.NET/.NET Core学习、工作、面试指…...
文献分享: XTR——优化Token级检索的高效多向量模型
原文章 文章目录 1. XTR \textbf{1. XTR} 1. XTR原理 1.1. \textbf{1.1. } 1.1. 导论 1.2. XTR \textbf{1.2. XTR} 1.2. XTR的训练和推理 2. \textbf{2. } 2. 实验与分析 2.1. \textbf{2.1. } 2.1. 实验配置与结果 2.2. \textbf{2.2. } 2.2. 结果分析 3. \textbf{3. } 3. 其它分…...
【数据结构】C语言实现树和森林的遍历
C语言实现树和森林的遍历 导读一、树的遍历二、森林的遍历2.1 为什么森林没有后序遍历?2.2 森林中存不存在层序遍历?三、C语言实现3.1 准备工作3.2 数据结构的选择3.3 树与森林的创建3.4 树与森林的遍历3.4.1 先根遍历3.4.2 后根遍历3.4.3 森林的遍历3.5 树与森林的销毁3.6 算…...
《Python深度学习》第七讲:生成式深度学习
在深度学习的世界里,生成式模型是一种非常有趣且富有创造力的技术。它们能够生成全新的内容,比如文本、图像、音乐等,甚至可以创造出从未见过的虚拟世界。这一讲,我们将深入探讨生成式深度学习的核心技术,包括 LSTM 文本生成、DeepDream、神经风格迁移、变分自编码器(VAE…...
Spring的IOC
在现代 Java 开发中,Spring 框架几乎无处不在,特别是其核心的 IOC(Inversion of Control) 容器,几乎所有Spring的功能都与它紧密相关。 一、什么是IOC IOC,全称为 Inversion of Control(控制反…...
常考计算机操作系统面试习题(四)
目录 1. Peterson 算法伪代码 2. 信号量生产者消费者问题分析 3. 注释 Peterson 主函数并分析输出结果 4. 用 fork 创建子进程的程序 1. Peterson 算法伪代码 题目: 写出 Peterson 算法的伪代码。 参考答案: // 定义变量 boolean flag[2]; //…...
Visual Studio Code 连接 SAP ERP 系统
首先确保服务打开 在vscode,在extension安装ABAP remote filesystem,然后打开设置SAP 系统的地址配置 CtrlshiftP 执行代码:AbapFS connect to an ABAP system,可以根据要求一步一步配置。 根据配置。加载系统 也可以直接在extens…...
从报错到成功:Mermaid 流程图语法避坑指南✨
🚀 从报错到成功:Mermaid 流程图语法避坑指南 🚀 🚨 问题背景 在开发文档或技术博客中,我们经常使用 Mermaid 流程图 来可视化代码逻辑。但最近我在尝试绘制一个 Java Stream 转换流程图时,遭遇了以下报错…...
TDengine 中的 show 命令
简介 SHOW 命令可以用来获取简要的系统信息。若想获取系统中详细的各种元数据、系统信息和状态,请使用 select 语句查询 INFORMATION_SCHEMA 数据库中的表, 详见 元数据查询 SHOW APPS SHOW APPS;显示接入集群的应用(客户端)信息。 SHOW …...
博弈论中的均衡精炼:完美贝叶斯均衡、序贯均衡与颤抖手均衡详解
博弈论中的均衡精炼:完美贝叶斯均衡、序贯均衡与颤抖手均衡详解 1. 引言:为什么需要均衡精炼? 在博弈论中,纳什均衡是分析策略互动的核心工具,但其存在一个显著缺陷:无法排除不合理的均衡。例如࿰…...
github代理 | 快速clone项目
代理网址: https://ghproxy.com/ https://ghproxy.com/代理网址: https://ghproxy.com/ 比如需要克隆的项目git地址为:https://github.com/AUTOMATIC1111/stable-diffusion-webui.git git clone https://ghproxy.com/https://github.com/AUTO…...
C语言基础与进阶学习指南(附运行效果图及术语解析)
C语言基础与进阶学习指南(附运行效果图及术语解析) 目录 C语言标准与编译流程CPU与内存基础C语言基础语法数据类型详解变量与内存管理运算符与表达式输入输出函数函数与内存管理指针与内存操作结构体与高级应用 1. C语言标准与编译流程 1.1 C语言标准演…...
【Scrapy】Scrapy教程8——处理子链接
通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…...
Python推导式深入解析
引言 Python 以其简洁、高效的语法而备受开发者喜爱,其中推导式(Comprehensions)更是 Python 语法的一大特色。推导式提供了一种简洁明了的方式来创建列表、集合和字典等数据结构,让代码更加紧凑和易读。本文将深入探讨 Python 推…...
在 macOS 上配置 SSH 连接 GitHub
在 macOS 上使用 SSH 连接 GitHub,可以免去每次使用 Git 时输入密码的麻烦,提高开发效率。本文将介绍如何在 macOS 上生成 SSH 密钥并配置 GitHub 进行身份认证。 1. 检查是否已有 SSH 密钥 在终端运行以下命令,检查是否已有 SSH 密钥&#…...
常考计算机操作系统面试习题(二)(中)
目录 24. 操作系统的主要功能有哪些? 25. 文件的属性主要有哪些? 26. 对文件的基本操作主要有哪些? 27. 目录的基本操作有哪些? 28. 目录的逻辑结构有哪些种? 29. 简述银行家算法的Available、Max、Allocation、…...
手机录视频风噪太大?华为Pura X“AI降风噪“太硬核了
你是否也在用手机录像时,比如大海海浪、阅览群山、空旷的原野的时候,呼啸的风总是能沦为刺耳的噪音,让精心构思的镜头,最后因为呼啸的风声最终成为“灾难现场”。传统的解决方式往往陷入两难:物理防风罩影响收音指向性…...
React 事件处理
1. React 事件处理的基本概念 React 事件处理的特点: 驼峰命名法:事件名采用驼峰命名法,如 onClick、onChange。JSX 语法:事件处理函数通过 JSX 传递给元素,如 <button onClick{handleClick}>。合成事件&#…...
搭建React简单项目
一、项目构建 目录结构: 安装脚手架 npm install -g create-react-app // or yarn add -g create-react-app 一、项目版本 1、react:"^18.3.1"; 2、react-router-dom:"^6.23.1"; 3、项目创…...
ROCK 280A-M 工业级电调:高性能无人机动力心脏,重塑严苛场景飞行边界
—— 工业级动力控制系统解决方案 —— 【产品概述】 针对工业级无人机高负载、复杂工况需求,南昌长空科技的ROCK 280A-M 电调以航空级标准打造动力控制中枢。采用工业级控制算法与智能自适应系统,为多旋翼 / 固定翼无人机提供稳定动力支撑,突…...
带你从入门到精通——自然语言处理(十. BERT)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下: 带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客 带你从入门到精通——自然语言处理(二…...
八股JAVA并发
多线程 线程的创建方式有哪些? 1.继承Thread类 2.实现Runnable接口 3.Callable接口FutureTask 4.线程池 1.继承Thread类 这是最直接的一种方式,用户自定义类继承java.lang.Thread类,重写其run()方法,run()方法中定义了线程执行的具体任务。…...
#include <hello.h> 与 #include “hello.h“的区别
#include <hello.h> 和 #include "hello.h" 在C/C中用于包含头文件,但它们在搜索头文件时的行为有所不同,这可能导致前者找不到头文件的情况。 ### 区别 1. **搜索路径不同** - #include "hello.h":编译器首先…...
PyPDF2简单介绍
PyPDF2 是一个开源的纯 Python 库,用于读取、操作和创建 PDF 文件。它最初是 PyPDF 的改进版,功能更丰富。 安装: bash pip install PyPDF2核心功能 1.合并 PDF 文件 python from PyPDF2 import PdfMergermerger PdfMerger() merger.appe…...
记录flutter编译项目遇到的问题
目录 1.更换flutter版本 2.解压到指定地址 3.在Android Studio配置 问题: Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source! Resolving dependencies... The current Dart SDK version is 3.3.0. Because coach d…...
小米AX6000上安装tailscale
在之前的文章中,已经介绍了如何解锁ax6000的ssh,以及必坑指南。 今天突发奇想,为了不让我的nas天天开着tailscale,所以我想让我的tailscale运行在路由器,这样完美实现穿透。 首先,通过ssh登录ax6000&#x…...
git使用经验(一)
git使用经验(一) 我之前已经下载了别人的代码,我想在此基础上进行修改,并移动到自己的私有仓库,方便上传到自己的私有仓库自己进行版本控制 git clone下来别人的代码,删除有关git的隐藏文件 进入到自己的…...
C语言【文件操作】详解中
引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前,希望您先仔细看一下这篇博文,理解一下文件指针和流的概念:C语言【文件操作】详解上-CSDN博客文章浏览阅读606次,点赞26次,收藏4次。先整体认识一下文件是…...
基于SpringBoot的在线学习平台
项目介绍 平台采用B/S结构,后端采用主流的SpringBoot语言进行开发,前端采用主流的Vue.js进行开发。是一个综合的在线学习平台,该平台有管理员、教师、学生三类角色,各项功能根据不同角色分别设定。 整个平台包括前台和后台两个部分…...
鸿蒙生态开发
鸿蒙生态开发概述 鸿蒙生态是华为基于开源鸿蒙(OpenHarmony)构建的分布式操作系统生态,旨在通过开放共享的模式连接智能终端设备、操作系统和应用服务,覆盖消费电子、工业物联网、智能家居等多个领域。以下从定义与架构、核心技术…...
qt实现一个简单http服务器和客户端
一、功能简介 服务器: 登录功能、下载文件功能 客户端: 登录功能、下载文件功能、上传成绩功能 二、服务器代码 //HttpServer.h #ifndef HTTPSERVER_H #define HTTPSERVER_H#include <QMainWindow> #include <QTcpSocket> #include <QTc…...
深入理解Linux网络随笔(五):深度理解本机网络I/O
深入理解Linux网络随笔(五):深度理解本机网络I/O 文章目录 深入理解Linux网络随笔(五):深度理解本机网络I/O本机发送过程本机接收过程总结 分析本机网络I/O部分源码需要知道本机I/O是什么?扮演什…...
Debian12生产环境配置笔记
在 Debian 12 上进行生产环境配置的详细步骤,涵盖软件更新、基础软件安装、Docker 及 Redis 部署,以及 Nginx 配置多个虚拟主机等内容。所有命令均以 root 用户身份执行,无需添加 sudo 1. 更新软件 首先,确保系统上的所有软件包…...
工业物联网的范式革命:从“云边“ 到“边边” 协的技术跃迁
基于DIOS操作系统的去中心化重构 一、云边协同模式的局限性:技术瓶颈与成本困局 当前工业物联网主流的云边协同架构(Cloud-Edge Collaboration)已暴露出显著短板,其核心问题源于对中心云的过度依赖: 带宽资源挤占与…...
python学习笔记--实现简单的爬虫(二)
任务:爬取B站上最爱欢迎的编程课程 网址:编程-哔哩哔哩_bilibili 打开网页的代码模块,如下图: 标题均位于class_"bili-video-card__info--tit"的h3标签中,下面通过代码来实现,需要说明的是URL中…...
【蓝桥杯速成】| 8.回溯算法
因为在进行背包问题的练习时,发现很多题目需要回溯,但本人作为小白当然是啥也不知道 那么就先来补充一下回溯算法的知识点,再进行练习 理论基础 回溯算法本质上是一种递归函数,是纯暴力搜索方法, 适合组合问题、排列…...
聚水潭商品信息集成MySQL的高效解决方案
聚水潭商品信息集成到MySQL的技术案例分享 在数据驱动的业务环境中,如何高效、准确地将聚水潭系统中的商品信息集成到MySQL数据库,是许多企业面临的重要挑战。本文将详细介绍一个实际运行的方案——“聚水潭-商品信息查询-->BI崛起-商品信息表_copy”…...
【数学建模】多目标规划模型:原理、方法与应用
多目标规划模型:原理、方法与应用 文章目录 多目标规划模型:原理、方法与应用引言1. 多目标规划的基本概念1.1 数学模型1.2 Pareto最优解/有效解1.3 满意解方法 2. 多目标规划的主要求解方法2.1 加权求和法2.2 ε-约束法2.3 理想点法2.4 优先级法&#x…...
基于Spring Boot的党员学习交流平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Flink CDC 与 SeaTunnel CDC 简单对比
Flink CDC 与 SeaTunnel CDC 简单对比 CDC 技术概述 变更数据捕获(Change Data Capture,简称 CDC)是一种用于捕获数据库中数据变更的技术,能够实时识别、捕获并输出数据库中的插入、更新和删除操作。CDC 技术在现代数据架构中扮…...