[特殊字符] Spring IOC/DI 核心知识点 CSDN 风格总结

一、Spring 核心概述

表格

核心特性 说明
定位 轻量级 JavaEE 全栈开发框架,简化企业级应用开发
核心优势 1. IOC:控制反转,解耦对象创建;2. AOP:面向切面,统一处理通用逻辑;3. 生态整合:无缝对接 MyBatis、Redis 等框架
二、IOC(控制反转):解决对象耦合问题
1. 核心概念
  • 耦合 :传统开发中 Service 硬编码 new Dao(),修改 Dao 需改动 Service,耦合度高;
  • IOC 本质:将对象创建权从开发者(正转)交给 Spring 容器(反转),容器统一管理对象生命周期;
  • 实现思路
    • 手动工厂模式:通过 properties 配置类路径 → 反射创建对象 → 存入 Map 供调用;
    • Spring 容器:通过 applicationContext.xml 配置 <bean>,容器启动时自动反射创建对象并缓存。
2. Spring IOC 快速上手(XML 版)

xml

复制代码
<!-- 核心配置:IOC 容器创建对象 -->
<bean id="userDao" class="com.hg.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.hg.service.UserServiceImpl"></bean>

java

运行

复制代码
// 从容器获取对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ac.getBean("userService", UserService.class);
三、DI(依赖注入):给对象赋值解依赖

表格

javascript 复制代码
| 注入方式             | 核心要求               | 配置语法                                                                                                                                                                                                                              | 关键说明                                                                                      |
| :--------------- | :----------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |
| **构造方法注入**       | 类中提供对应构造方法         | `xml<br><bean id="userService" class="com.hg.service.UserServiceImpl"><br>    <constructor-arg name="形参名" ref="userDao"/>  <!-- 注入对象 --><br>    <constructor-arg index="1" value="字符串值"/>  <!-- 注入基本类型 --><br></bean><br>`        | 1. `name` 匹配构造方法形参名;<br>2. `index` 按参数列表索引(从 0 开始);<br>3. `ref` 引用容器内 Bean,`value` 赋值基本类型 |
| **Set 方法注入(推荐)** | 类中提供 `setXxx()` 方法 | `xml<br><bean id="userService" class="com.hg.service.UserServiceImpl"><br>    <property name="userDao" ref="userDao"/>  <!-- 对应 setUserDao() --><br>    <property name="msg" value="字符串值"/>  <!-- 对应 setMsg() --><br></bean><br>` | 1. `name` = set 方法去掉 `set` 后首字母小写;<br>2. 容错率高,新手优先使用                                      |
| **自动注入**         | 类中提供 set 方法        | `xml<br><bean id="userService" class="com.hg.service.UserServiceImpl" autowire="byType"/><br>`                                                                                                                                    | 1. `byType`:按类型匹配容器内 Bean 自动注入;<br>2. 需保证同类型 Bean 唯一,否则报错                                 |

|---|---|---|---|
| | | | |

四、核心避坑指南
  1. IOC 常见问题
    • <bean>class 必须写全类名,且为实现类(不能是接口);
    • 获取 Bean 时 id 需与配置一致,否则报 NoSuchBeanDefinitionException
  2. DI 常见问题
    • 构造注入:参数数量 / 类型 / 顺序需与构造方法完全匹配,否则报 Could not resolve matching constructor
    • Set 注入:name 拼写 / 大小写错误,导致 setXxx() 无法被调用,最终对象为 null;
    • 自动注入:同类型多个 Bean 时需改用 byName(按 id 匹配)。
五、实战核心思想
  1. 解耦:IOC 让对象创建与使用分离,DI 让对象依赖由容器自动赋值,彻底摆脱硬编码;
  2. 简化开发:开发者只需关注业务逻辑,对象创建、依赖管理全部交给 Spring 容器;
  3. 灵活扩展:修改配置文件即可替换实现类,无需改动业务代码。

总结

  1. Spring 核心是 IOC(容器管理对象)+ DI(自动注入依赖),核心目标是解耦;
  2. 注入方式优先级:Set 注入(新手首选)> 自动注入 > 构造方法注入;
  3. 配置核心规则:<bean> 定义对象,property/constructor-arg 完成赋值,ref/value 区分对象 / 基本类型。
相关推荐
Chan162 小时前
LeetCode 热题 100 | 链表
java·数据结构·spring boot·算法·leetcode·链表·java-ee
袋鼠云数栈2 小时前
构建金融级数据防线:数栈 DataAPI 的全生命周期管理实践
java·大数据·数据库·人工智能·api
拾贰_C2 小时前
[spring boot | springboot web ] spring boot web项目启动失败问题
前端·spring boot·后端
indexsunny2 小时前
互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用解析
java·spring boot·面试·kafka·spring security·电商·microservices
独自破碎E2 小时前
手撕真题-计算二叉树中两个节点之间的距离
java·开发语言
顺风尿一寸2 小时前
从 Java File.length() 到 Linux 内核:一次系统调用追踪之旅
java·linux
诚实可靠小郎君_dpc2 小时前
如何把特斯拉接入OpenClaw,让🦞做你的行车小助理
后端·agent
@atweiwei2 小时前
MySQL vs MongoDB 深度对比(底层存储数据结构与并发控制篇)
数据结构·数据库·后端·sql·mysql·mongodb·个人开发
为美好的生活献上中指2 小时前
*Java 沉淀重走长征路*之——《Java Web 应用开发完全指南:从零到企业实战(两万字深度解析)》
java·开发语言·前端·html·javaweb·js