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