Spring IOC容器详解:深入理解控制反转与依赖注入
一、什么是IOC?
在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类出了问题,那么可能会导致这个框架出现问题。 Spring 将创建对象的权利给了IOC,在IOC当中创建了ABC三个对象吗,那么我们我们其他的类只需要调用集合, 大大的解决了程序耦合性的问题。
IOC(Inversion of Control,控制反转) 是Spring框架的基石,其核心在于将对象的创建、依赖注入和生命周期管理权交给容器。传统开发中,对象间的强耦合关系会导致“牵一发而动全身”的问题,而IOC通过工厂模式+反射机制实现了彻底的解耦。例如:
// 传统方式:类A直接依赖类B
class A {B b = new B();
}
IOC的优势:
-
解耦:通过Spring容器统一管理对象生命周期,避免类之间的直接依赖。
-
灵活性:修改依赖关系时无需改动源码,只需调整配置文件或注解。
二、IOC容器的底层原理
IOC的实现基于以下技术:
-
dom4j解析XML:读取配置文件中的Bean定义。
-
工厂模式:通过工厂类解耦对象创建过程。
-
反射机制:动态创建对象实例。
实现流程:
-
定义Bean:在XML中配置对象信息。
- 创建工厂类:
<bean id="user" class="com.qcby.entity.User"/>
public class BeanFactory {public static Object getBean(String id) {// 1. 解析XML获取类路径String className = "com.qcby.entity.User";// 2. 反射创建对象return Class.forName(className).newInstance();}
}
三、IOC容器的两种实现
1. BeanFactory(基础容器)
-
特点:懒加载,仅在首次请求对象时创建实例。
-
适用场景:资源受限环境,如移动应用。
2. ApplicationContext(高级容器)
-
特点:预加载,启动时即创建所有单例Bean。
-
功能增强:支持国际化、事件传播等。
-
常用实现类:
-
ClassPathXmlApplicationContext:从类路径加载配置。 -
FileSystemXmlApplicationContext:从文件系统加载配置。
-
四、Bean管理:XML配置方式
1. 创建对象
<bean id="user" class="com.qcby.entity.User"/>
-
默认调用无参构造器,若类没有无参构造器会报错。
2. 属性注入
(1) Setter注入
public class User {private String name;public void setName(String name) { this.name = name; }
}
<bean id="user" class="com.qcby.entity.User"><property name="name" value="张三"/>
</bean>
(2) 构造器注入
public class Car {private String name;public Car(String name) { this.name = name; }
}
<bean id="car" class="com.qcby.eneity.Car"><constructor-arg name="name" value="宝马"/>
</bean>
(3) 集合类型注入
<bean id="collectionBean" class="com.qcby.entity.CollectionBean"><property name="list"><list><value>元素1</value><value>元素2</value></list></property><property name="map"><map><entry key="k1" value="v1"/></map></property>
</bean>
五、Bean管理:注解方式
1. 常用注解
-
@Component:通用组件标记。
-
@Controller:表现层组件。
-
@Service:业务层组件。
-
@Repository:持久层组件。
2. 使用步骤
(1) 开启注解扫描
<context:component-scan base-package="com.qcby"/>
(2) 定义Bean
@Service("userService")
public class UserServiceImpl implements UserService {// ...
}
(3) 属性注入
-
@Autowired:按类型自动装配。
-
@Qualifier:按名称装配,需与@Autowired配合。
-
@Value:注入基本类型值。
@Service
public class UserService {@Autowired@Qualifier("userDao")private UserDao userDao;@Value("${jdbc.url}")private String jdbcUrl;
}
六、纯注解配置(Spring Boot风格)
1. 核心注解
-
@Configuration:标记类为配置类。
-
@ComponentScan:指定扫描包路径。
2. 配置示例
@Configuration
@ComponentScan("com.qcby")
public class AppConfig {@Beanpublic DataSource dataSource() {return new DruidDataSource();}
}
3. 测试代码
public class Test {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = ctx.getBean(UserService.class);}
}
七、总结
-
IOC核心价值:通过解耦提升代码可维护性和扩展性。
-
XML vs 注解:
-
XML:集中管理配置,适合大型项目。
-
注解:简洁高效,适合快速开发。
-
-
适用场景:微服务架构下推荐纯注解方式,传统项目可混合使用。
掌握Spring IOC是Java开发的核心技能,合理运用能显著提升代码质量!
相关文章:
Spring IOC容器详解:深入理解控制反转与依赖注入
一、什么是IOC? 在java当中一个类想要使用另一个类的方法,就必须在这个类当中创建这个类的对象,那么可能会出现如下情况, 比如A类当中创建着B对象,B类当中有C对象,C类当中有A对象,这个如果一个类…...
Python条件处理,新手入门到精通
Python条件处理,新手入门到精通 对话实录 **小白**:(崩溃)我写了if x 1:,为什么Python会报错? **专家**:(推眼镜)**是赋值,才是比较**!想判断相…...
JPA实体类注解缺失异常全解:从报错到防御!!!
🚨 JPA实体类注解缺失异常全解:从报错到防御 🛡️ 一、💥 问题现象速览 // 经典报错示例 Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.entity.Product典型症状: &…...
Spring 源码硬核解析系列专题(三十二):Spring Cloud LoadBalancer 的负载均衡源码解析
在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Cloud Alibaba,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡组件,替代 Ribbon,支持服务发现和负载均衡策略。本篇将深入 Spring…...
生成式媒介革命已至,搜索如何借力DeepSeek破局?
作为前沿AI技术的代表,DeepSeek不仅突破了传统大模型的算力瓶颈,更以“高性能低成本开源生态”的特性,重塑传播生态。对于搜索行业从业者而言,这场技术变革既是机遇,也是挑战。 DeepSeek的三大“杀手锏”,…...
【Vue3入门1】02- Vue3的基本操作(上)
本文介绍vue3中的一些方法的操作。 目录 1. 绑定事件 v-on 2. 按键修饰符 3. 显示和隐藏 v-show 4. 条件渲染 v-if 5. 条件渲染if-else 1. 绑定事件 v-on 点击事件 v-on:click" 发生事件 " <body><div id"app">{{ msg }} <h2&g…...
【C语言】多进程/多线程
【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务,提高了系统的资源利用率和程序的运行效率…...
模糊数学 | 模型 / 集合 / 关系 / 矩阵
注:本文为来自 “模糊数学 | 模型及其应用” 相关文章合辑。 略作重排。 如有内容异常,请看原文。 模糊数学模型:隶属函数、模糊集合的表示方法、模糊关系、模糊矩阵 wamg 潇潇 于 2019-05-06 22:35:21 发布 1.1 模糊数学简介 1965 年&a…...
Browserlist 使用指南:应对浏览器兼容性问题的解决方案
前言 在前端开发中,我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多,处理这些问题可能会让人感到头疼。幸运的是,有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法…...
QinQ项展 VLAN 空间
随着以太网技术在网络中的大量部署,利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特,仅能表示 4096 个 VLAN,无法满足城域以太网中标识大量用户的需求,于是 QinQ 技术应运而生。…...
数据结构—树(java实现)
目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...
Unity射击游戏手榴弹笔记
数据 在物品系统增加一个新的物品类,手榴弹类,定义手榴弹依附物体的类、配表数据类、背包内物品数据类、新建配表、在背包增加手榴弹数组;手榴弹的预制体需要可拾取的、扔出的;背包界面增加背包内的手榴弹、场景里的手榴弹、别人…...
S32K144外设实验(七):FTM输出多路互补带死区PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…...
SingleMod
SingleMod SingleMod是一种深度学习模型,专为利用纳米孔直接RNA测序(DRS)数据在单RNA分子中精确检测m6A修饰而设计。该模型通过深度多实例回归框架进行训练,能够充分利用广泛的甲基化率标签。SingleMod是一个通用框架,可轻松适配其他核酸修饰的检测模型训练。 注意: Si…...
[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]
常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接; /proc/pid…...
单纯形法之大M法
1. 问题背景与标准化 在求解某些线性规划问题时,往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时,我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题(假设为最大化问题)&am…...
各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写
上一篇下一篇RNN(中集)待编写 代码详解 pytorch 官网主要有两个可调用的模块,分别是 nn.RNNCell 和 nn.RNN ,下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的,只需要将对输入…...
DeepSeek 发布DeepSeek-V3-0324 版本 前端与网页开发能力、推理与多任务能力提升
DeepSeek 发布 DeepSeek-V3-0324 版本 DeepSeek 发布 DeepSeek-V3-0324 版本,在其前代模型 DeepSeek-V3 的基础上进行了显著升级。 该模型专注于中文和多语言文本生成、推理、代码编写等综合能力的提升,支持 Function Calling(函数调用&…...
航班时间 | 第九届蓝桥杯省赛C++A组
小 h 前往美国参加了蓝桥杯国际赛。 小 h 的女朋友发现小 h 上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。 小 hh 对超音速飞行感到十分恐惧。 仔细观察后发现飞机的起降时间都是当地时间。 由于…...
传输层安全协议 SSL/TLS 详细介绍
传输层安全性协议TLS及其前身安全套接层SSL是一种安全传输协议,目前TLS协议已成为互联网上保密通信的工业标准,在浏览器、邮箱、即时通信、VoIP等应用程序中得到广泛的应用。本文对SSL和TLS协议进行一个详细的介绍,以便于大家更直观的理解和认…...
编程实现自我指涉(self-reference)
从计算机的组成原理出发,编程实现自我指涉(self-reference)本质上是通过代码操纵代码,形成逻辑上的闭环。这种能力不仅是编程语言设计中的一个奇妙现象,更是计算理论、计算机架构、乃至哲学层面的一种深刻映射。让我们…...
CentOS8 安装 Docker-CE
如果之前安装过docker,请先卸载旧版本: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装所需的软件包: yum install -y yum-utils 添加软件源信息(设置存储库)…...
【Docker系列八】使用 Docker run 命令部署 Nginx
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【单元测试】
一、框架 不同的编程语言有不同的测试框架,以下是一些常见的测试框架: 1)Java:JUnit、TestNG2)Python:unittest、pytest3)JavaScript:Jest、Mocha4)C#:NUni…...
【今日EDA行业分析】2025年3月24日
今日 EDA 行业分析:中国在全球格局下的奋进之路 一、引言 在半导体产业的精密体系中,EDA 软件宛如一颗璀璨的明珠,其重要性不言而喻。它不仅是集成电路设计的核心支撑,更是连接芯片设计、制造、封装与测试各环节的关键纽带。今天…...
基于 PHP 内置类及函数的免杀 WebShell
前言 PHP 作为广泛使用的服务端语言,其灵活的内置类(如 DOMDocument)和文件操作机制(.ini、.inc 的自动加载),为攻击者提供了天然的隐蔽通道。通过 动态函数拼接、反射调用、加密混淆 和 伪命名空间 等手法…...
鸿蒙移动应用开发--UI组件布局
实验要求: 制作一个B站视频卡片界面,大致如下图所示,要求应用到线性布局、层叠布局等相关课堂知识。背景图、logo及文本内容不限。 实验环境 :DevEco Studio 实验过程: 步骤1:创建项目 1. 在您的开发环境…...
内核编程十二:打印内核态进程的属性
在Linux内核中,current 是一个宏,用于获取当前正在执行的进程的 task_struct 结构体指针。current 宏返回一个指向当前正在运行的进程的 task_struct 结构体的指针。通过这个指针,内核代码可以访问和修改当前进程的各种属性和状态。 打印单个…...
C++(16)—类和对象(下) ①再探构造函数
文章目录 一、构造函数初始化方式回顾二、初始化列表详解1. 初始化列表语法与特点2. 必须使用初始化列表的成员变量 三、初始化列表的底层机制四、最佳实践五、总结 一、构造函数初始化方式回顾 在C中,构造函数用于初始化对象的成员变量。传统的初始化方式是在构造…...
[新闻.AI]国产大模型新突破:阿里开源 Qwen2.5-VL-32B 与 DeepSeek 升级 V3 模型
(本文借助 Deepseek-R1 协助生成) 在2025年3月24日至25日的短短24小时内,中国AI领域迎来两大重磅开源更新:阿里通义千问团队发布多模态大模型Qwen2.5-VL-32B-Instruct,而DeepSeek则推出编程能力大幅提升的DeepSeek-V3…...
