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>

关键要素解析:

  1. id:Bean的唯一标识符(IOC容器中的对象名称)
  2. class:全限定类名(包名+类名)
  3. 默认机制:调用无参构造器实例化对象

默认示例:

<!-- 服务层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".../>

注解特性说明:

  1. 四者本质都是@Component的特殊化形式
  2. 默认Bean命名规则:首字母小写的类名(如UserServiceImpluserServiceImpl
  3. 可通过注解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应用/自主开发组件管理

对比说明

  1. 混合配置策略推荐:核心业务组件使用注解,基础设施配置使用XML
  2. 注解方式编译时验证更严格,能提前发现配置错误
  3. XML支持placeholder动态替换,适合环境差异配置
  4. 注解驱动开发效率更高,符合现代编程习惯

四、IOC优势总结

  • 解耦:对象创建权交给容器
  • 可维护:统一管理依赖关系
  • 易测试:轻松替换Mock对象
  • 扩展性强:方便集成其他框架

总结

IOC不仅是框架特性,更代表了软件设计的哲学转变。掌握其精髓,开发者将能构建出真正面向变化的弹性系统,在快速迭代的数字化时代保持技术竞争力。通过深入理解对象创建和依赖注入的多种实现方式,开发者可以根据具体场景灵活选择最合适的配置策略,构建出既灵活又易于维护的Spring应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源&#xff0c;它们有类似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别&#xff1a; 1. 功能的演进 ReplicationController 是 Kubernete…

CSS基础知识一览

持续维护 选择器 display 常用属性 浮动 弹性布局

IS-IS原理与配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNet…

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看&#xff01; 一、Visual Studio Code下载 下载官网&#xff1a;https://code.visualstudio.com/ 进入官网后点击右上角的Download &…

git推送代码相关学习——(一)

推荐去阅读一下廖老师的git相关的教程https://liaoxuefeng.com/books/git/introduction/index.html 这个系列就来学习一下git操作。 第一步&#xff0c;新建项目 去github中新建一个项目&#xff0c;然后依据项目来进行本地的开发工作。 第二步&#xff0c;拉取项目 git c…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下&#xff0c;CMS平台作为企业内容管理的核心载体&#xff0c;其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现&#xff0c;模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…

Maya基本操作

基本操作 按住ALT键&#xff0c;左键旋转视角&#xff0c;中键平移视角&#xff0c;右键放大缩小视角。 按空格键切换4格视图。 导入FBX格式文件后&#xff0c;无贴图显示。 按6键开启。着色纹理显示 坐标轴相关 修改菜单-左键最上面的虚线。固定修改选项窗口。 选中物体…

政安晨【超级AI工作流】—— 使用Dify通过工作流对接ComfyUI实现多工作流协同

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 一、准备工作 Dify跑起来 ollama局域网化配置 Dify配置并验证 启动ComfyUI 二、…

【蓝桥杯】12111暖气冰场(多源BFS 或者 二分)

思路 这题可以用BFS做&#xff0c;也可以用二分来做。 用二分这里只提供一个思路&#xff1a;对时间来二分查找&#xff0c;check函数就是检查在特定的时间 t 0 t_0 t0​内每一个暖气炉的传播距离能否覆盖所有格子。 用BFS做&#xff1a; 由几个点开始向外扩散&#xff0c;知道…

【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

【JavaEE】网络编程socket

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

1 22年年底想用gpt做出一个pbft的算法仿真&#xff0c;到了25年终于可以结合gpt grok perplexcity deepseek等实现了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1.1简化版 // 定义 Windows 版本&#xff0c;确保条件变量相关函数可用 #define _WIN32_W…

【并发编程】聊聊forkJoin的原理和最佳实践

对于线程池来说&#xff0c;其实本质就是一个生产者消费者的模式&#xff0c;而通过竞争的方式从队列中获取任务执行。本质上其实就是按照任务级别进行处理&#xff0c;但是对于一些可以分而治之的任务&#xff0c;传统的线程池没有办法分治处理。一是无法对大任务进行拆分&…

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …

Java 填充 PDF 模版

制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop&#xff0c;安装过程很简单&#xff0c;一路下一步即可。用 OnlyOffice 制作 PDF 模版&#xff08;表单&#xff09; 使用 OnlyOffice 表单设计器&#xff0c;制作表单&#xff0c;如下图 注意命名…

使用安装 Kettle 教程 Pentoho 10.2.0.0-222 安装 连接mysql

流程 准备下载安装测试链接常见问题 准备 需要提前安装好 JDK 配置好环境变量 &#xff08;教程看前文&#xff09; 安装好mysql&#xff08;教程看前文&#xff09; 下载好pentaho链接数据库驱动 下载pentaho安装包 https://pentaho.com/wp-content/uploads/2024/04/three-s…

MySQL表的增加、查询、修改、删除的基础操作

MySQL表的增加、查询、修改、删除的基础操作 一、CRUD二、新增数据 insert2.1 单行数据 全列插入2.2 多行数据 指定列插入 三、查询 select3.1 全列查询&#xff08;select *&#xff09;3.2 指定列查询3.3 表达式查询3.4 去重&#xff1a;distinct3.5 带有排序的查询&#x…

Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站

开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组&#xff0c;开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App&#xff0c;登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…

Linux上位机开发实战(能用的开发板计算资源)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家所能想到的嵌入式上位机开发&#xff0c;如果是linux&#xff0c;同时涉及到嵌入式的话&#xff0c;一般都会认为是把pc linux的软件port到板子…

STM32中断

中断的基本概念 中断具体定义&#xff1a;操作系统课程里有清晰的阐述。 STM32中断&#xff1a;中断来了&#xff0c;主程序都得立即暂停&#xff0c;程序由硬件电路自动跳转到中断程序中。中断执行前&#xff0c;进行现场保护&#xff1b;中断执行后&#xff0c;会再还原现场…