Spring 框架从入门到精通(第三篇)——Spring 整合 MyBatis、声明式事务与注解总结
在前两篇博客中,我们掌握了 Spring 的 IOC 容器、依赖注入(DI)与面向切面编程(AOP),解决了 “对象管理” 与 “通用逻辑解耦” 的问题。但企业级开发中,还需解决两个核心需求:数据持久化(与 MyBatis 整合) 和数据一致性(事务管理)。本篇将基于《Spring 框架学习笔记.pdf》,聚焦 Spring 的 “企业级实战能力”:Spring 整合 MyBatis(持久层方案)、声明式事务管理(数据一致性保障)、核心注解总结(提升开发效率),带大家完成从 “基础语法” 到 “项目落地” 的跨越。
目录
一、Spring 整合 MyBatis:持久层开发的 “企业标配”
1.1 整合核心目标:让 Spring 管理 MyBatis 组件
1.2 整合步骤(Maven 项目)
步骤 1:添加整合依赖
步骤 2:配置数据库连接参数(jdbc.properties)
步骤 3:编写 Spring 核心配置文件(applicationContext.xml)
步骤 4:编写 MyBatis 核心配置文件(SqlMapConfig.xml)
步骤 5:生成 POJO、Mapper 接口与映射文件(逆向工程)
步骤 6:编写 Service 层(调用 Mapper)
步骤 7:测试整合效果
二、声明式事务管理:保障数据一致性的 “关键能力”
2.1 事务的核心基础:ACID 特性与并发问题
1. 事务的 ACID 特性(数据一致性的基石)
2. 事务并发问题(需隔离级别解决)
3. 事务隔离级别(解决并发问题)
2.2 事务传播策略:解决 “事务嵌套” 问题
2.3 声明式事务配置(两种方式)
方式 1:XML 配置声明式事务
方式 2:注解配置声明式事务(企业主流)
测试事务回滚
三、Spring 核心注解总结:提升开发效率的 “快捷键”
3.3 AOP 与事务注解
3.4 其他常用注解
四、系列总结:Spring 框架的 “知识闭环”
一、Spring 整合 MyBatis:持久层开发的 “企业标配”
MyBatis 是 Java 领域最流行的持久层框架,而 Spring 是企业级开发的 “骨架”—— 两者整合后,Spring 可接管 MyBatis 的核心组件(如SqlSessionFactory
、Mapper接口
),实现 “Bean 管理” 与 “数据持久化” 的无缝衔接。《Spring 框架学习笔记.pdf》详细列出了整合的完整步骤,我们结合实战案例逐一拆解。
1.1 整合核心目标:让 Spring 管理 MyBatis 组件
传统 MyBatis 开发中,需手动创建SqlSessionFactory
、SqlSession
,并通过SqlSession
获取 Mapper 接口,存在 “资源管理繁琐”“代码冗余” 的问题。Spring 整合 MyBatis 的核心目标是:
- Spring 管理
SqlSessionFactory
:替代手动build
,通过配置文件注入数据源; - Spring 管理 Mapper 接口:无需手动
getMapper
,Spring 自动生成 Mapper 代理对象; - Spring 管理事务:整合 MyBatis 事务与 Spring 事务,保证数据一致性。
1.2 整合步骤(Maven 项目)
步骤 1:添加整合依赖
需引入 Spring 核心依赖、MyBatis 依赖、MyBatis-Spring 整合包(mybatis-spring
)、数据库驱动、连接池依赖,《Spring 框架学习笔记.pdf》中明确了依赖清单:
<dependencies><!-- 1. Spring核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.3.18.RELEASE</version></dependency><!-- 2. MyBatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!-- 3. MyBatis-Spring整合包(核心) --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!-- 4. 数据库驱动与连接池 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.8</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- 5. 日志与测试 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency>
</dependencies>
关键依赖说明:mybatis-spring
是整合的 “桥梁”,提供SqlSessionFactoryBean
(Spring 管理SqlSessionFactory
)、MapperScannerConfigurer
(自动扫描 Mapper 接口)等核心类。
步骤 2:配置数据库连接参数(jdbc.properties)
在src/main/resources
下新建jdbc.properties
,存储数据库连接四要素。需注意:变量名不能用driver
和username
,否则会与系统环境变量冲突,需用driverClass
和user
替代:
# jdbc.properties
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytestdb?serverTimezone=GMT&useSSL=false&serverTimezone=Asia/Shanghai
user=root
password=root
步骤 3:编写 Spring 核心配置文件(applicationContext.xml)
这是整合的 “核心配置”,需完成三件事:加载属性文件、配置数据源、管理 MyBatis 组件,《Spring 框架学习笔记.pdf》提供了完整配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 1. 加载jdbc.properties属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 2. 配置数据源(DBCP连接池) --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${driverClass}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></bean><!-- 3. 配置SqlSessionFactory(MyBatis核心) --><bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/> <!-- 注入数据源 --><property name="configLocation" value="classpath:SqlMapConfig.xml"/> <!-- 关联MyBatis配置 --></bean><!-- 4. 配置Mapper扫描器(自动生成Mapper代理对象) --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.jr.mapper"/> <!-- 扫描Mapper接口所在包 --><property name="sqlSessionFactoryBeanName" value="factory"/> <!-- 关联SqlSessionFactory --></bean><!-- 5. 开启注解扫描(扫描Service、Component等) --><context:component-scan base-package="com.jr"/></beans>
关键配置说明:
SqlSessionFactoryBean
:替代 MyBatis 的SqlSessionFactoryBuilder
,由 Spring 管理SqlSessionFactory
,无需手动创建;MapperScannerConfigurer
:扫描basePackage
下的所有 Mapper 接口,自动生成代理对象并注册到 Spring 容器,后续可通过@Autowired
直接注入 Mapper。
步骤 4:编写 MyBatis 核心配置文件(SqlMapConfig.xml)
MyBatis 的配置无需过多内容,只需配置 “类型别名”(简化resultType
书写),其他配置(如数据源)已由 Spring 接管:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置类型别名:扫描com.jr.pojo包,类名首字母小写作为别名 --><typeAliases><package name="com.jr.pojo"/></typeAliases>
</configuration>
步骤 5:生成 POJO、Mapper 接口与映射文件(逆向工程)
手动编写 POJO 和 Mapper 文件效率低,可通过 MyBatis 逆向工程自动生成。《Spring 框架学习笔记.pdf》提到 “逆向工程生成 pojo 实体类、mapper 接口、mapper.xml 映射文件”,这里以Dept
表为例,生成核心文件:
POJO 类(Dept.java):
package com.jr.pojo;import lombok.Data;
import org.springframework.stereotype.Component;@Data // Lombok简化getter/setter(可选)
@Component // 声明为Spring Bean
public class Dept {private Integer deptno;private String dname;private String loc;
}
Mapper 接口(DeptMapper.java):
package com.jr.mapper;import com.jr.pojo.Dept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface DeptMapper {// 新增部门@Insert("insert into dept values(#{deptno},#{dname},#{loc})")int insertDept(Dept record);// 删除部门@Delete("delete from dept where deptno=#{deptno}")int deleteDept(int deptno);// 查询所有部门@Select("select * from dept")List<Dept> selectAll();
}
(注:也可通过 XML 编写 SQL,此处用注解简化,XML 方式见《Spring 框架学习笔记.pdf》)
步骤 6:编写 Service 层(调用 Mapper)
通过@Service
声明 Service Bean,通过@Autowired
注入 Mapper 接口(Spring 已自动生成代理对象):
package com.jr.service.impl;import com.jr.mapper.DeptMapper;
import com.jr.pojo.Dept;
import com.jr.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service // 声明为Service层Bean
public class DeptServiceImpl implements DeptService {// 注入Mapper接口(Spring自动生成代理对象)@Autowiredprivate DeptMapper deptMapper;@Overridepublic int addDept(Dept dept) throws Exception {return deptMapper.insertDept(dept);}@Overridepublic int removeDept(int id) throws Exception {return deptMapper.deleteDept(id);}@Overridepublic List<Dept> findAll() throws Exception {return deptMapper.selectAll();}
}
步骤 7:测试整合效果
编写 JUnit 测试类,通过 Spring 容器获取 Service,调用方法验证整合是否成功:
package com.jr.test;import com.jr.pojo.Dept;
import com.jr.service.DeptService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;public class SpringMyBatisTest {private DeptService deptService;// 测试前初始化Spring容器@Beforepublic void setUp() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");deptService = context.getBean("deptServiceImpl", DeptService.class);}// 测试查询所有部门@Testpublic void testFindAll() throws Exception {List<Dept> depts = deptService.findAll();for (Dept dept : depts) {System.out.println(dept.getDeptno() + ":" + dept.getDname() + "(" + dept.getLoc() + ")");}}// 测试新增部门@Testpublic void testAddDept() throws Exception {Dept dept = new Dept();dept.setDeptno(100);dept.setDname("测试组");dept.setLoc("沈阳");int result = deptService.addDept(dept);System.out.println(result == 1 ? "新增成功" : "新增失败");}
}
运行结果说明:查询时输出所有部门数据,新增时返回 1(表示成功),说明 Spring 与 MyBatis 整合成功。
二、声明式事务管理:保障数据一致性的 “关键能力”
在多 SQL 操作场景(如 “新增部门后更新员工部门号”),若中途出现异常,会导致 “部分 SQL 执行成功,部分失败”,破坏数据一致性。Spring 的声明式事务管理可通过配置或注解,自动完成 “事务开启、提交、回滚”,无需手动编写事务代码。《Spring 框架学习笔记.pdf》详细讲解了事务的特性、隔离级别、传播策略及配置方式。
2.1 事务的核心基础:ACID 特性与并发问题
1. 事务的 ACID 特性(数据一致性的基石)
事务是 “数据库操作的最小工作单元”,必须满足 ACID 特性,《Spring 框架学习笔记.pdf》对其定义如下:
- 原子性(Atomicity):事务要么全执行,要么全回滚(如 “转账” 不能只扣钱不进账);
- 一致性(Consistency):事务执行前后,数据库状态保持一致(如转账前后总金额不变);
- 隔离性(Isolation):多个事务并发执行时,互不干扰(如 A 事务未提交的数据,B 事务不可见);
- 持久性(Durability):事务提交后,数据永久保存到数据库(即使系统崩溃也不丢失)。
2. 事务并发问题(需隔离级别解决)
多事务并发执行时,会出现 4 类问题,《Spring 框架学习笔记.pdf》列出了具体场景:
- 脏读:A 事务读取 B 事务未提交的数据,B 事务回滚后,A 读取的数据无效;
- 不可重复读:A 事务多次读取同一数据,B 事务修改该数据并提交,A 两次读取结果不一致;
- 幻读:A 事务按条件查询数据,B 事务新增符合条件的数据,A 再次查询时 “多了一条数据”;
- 丢失更新:A、B 事务同时更新同一数据,后提交的事务覆盖先提交的事务,导致先更新的数据丢失。
3. 事务隔离级别(解决并发问题)
Spring 支持 5 种隔离级别,对应数据库的隔离级别,可通过配置指定,《Spring 框架学习笔记.pdf》明确了各级别的作用:
隔离级别 | 作用 | 解决的并发问题 | 效率 |
---|---|---|---|
DEFAULT | 默认值,跟随数据库隔离级别 | 取决于数据库 | 中等 |
READ_UNCOMMITTED | 允许读取未提交数据 | 无(会出现所有并发问题) | 最高 |
READ_COMMITTED | 只读取已提交数据 | 解决脏读 | 较高 |
REPEATABLE_READ | 读取数据加锁,禁止修改 | 解决脏读、不可重复读 | 中等 |
SERIALIZABLE | 对表加锁,事务串行执行 | 解决所有并发问题 | 最低 |
推荐选择:MySQL 默认REPEATABLE_READ ,Oracle 默认READ_COMMITTED ,开发中优先使用DEFAULT (跟随数据库)。 |
2.2 事务传播策略:解决 “事务嵌套” 问题
当 Service 方法调用另一个 Service 方法时(如addDept
调用updateEmp
),需定义 “内层事务如何与外层事务协作”,这就是事务传播策略。Spring 提供 7 种传播策略,《Spring 框架学习笔记.pdf》重点强调了常用策略:
传播策略 | 作用 | 适用场景 |
---|---|---|
REQUIRED(默认) | 若当前有事务,加入事务;无则新建事务 | 增删改方法(如 add、delete) |
SUPPORTS | 若当前有事务,加入事务;无则非事务执行 | 查询方法(如 findAll) |
REQUIRES_NEW | 无论当前是否有事务,都新建事务 | 独立事务(如日志记录,不影响主事务) |
NESTED | 嵌套事务,内层事务回滚不影响外层事务 | 子任务(如批量新增中的单条失败) |
2.3 声明式事务配置(两种方式)
声明式事务基于 AOP 实现,无需修改业务代码,只需通过 XML 或注解配置 “哪些方法需要事务”。
方式 1:XML 配置声明式事务
需配置 “事务管理器”“事务通知”“AOP 切面”,将事务逻辑织入目标方法,《Spring 框架学习笔记.pdf》提供了完整配置:
XML 配置文件(applicationContext.xml 新增):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" <!-- 引入tx命名空间 -->xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><!-- 1. 已有的配置(数据源、SqlSessionFactory、扫描等) --><!-- ... 省略 ... --><!-- 2. 配置事务管理器(DataSourceTransactionManager) --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/> <!-- 注入数据源 --></bean><!-- 3. 配置事务通知(定义传播策略) --><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><!-- 增删改方法:REQUIRED策略 --><tx:method name="add*" propagation="REQUIRED"/><tx:method name="remove*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><!-- 查询方法:SUPPORTS策略 --><tx:method name="find*" propagation="SUPPORTS" read-only="true"/></tx:attributes></tx:advice><!-- 4. 配置AOP切面:关联事务通知与切点 --><aop:config><!-- 定义切点:ServiceImpl包下的所有方法 --><aop:pointcut id="servicePointcut" expression="execution(* com.jr.service.impl.*.*(..))"/><!-- 织入事务通知 --><aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/></aop:config></beans>
关键配置说明:
DataSourceTransactionManager
:Spring 的 JDBC 事务管理器,负责事务的开启、提交、回滚;tx:advice
:定义事务策略,name
通过 “方法前缀” 匹配目标方法(如add*
匹配 add 开头方法);read-only="true"
:查询方法设为只读,数据库可优化性能(禁止修改操作)。
方式 2:注解配置声明式事务(企业主流)
注解配置更简洁,通过@Transactional
注解直接标注方法或类,无需 XML 切面配置,《Spring 框架学习笔记.pdf》推荐此方式:
XML 开启注解事务支持(applicationContext.xml 新增):
<!-- 配置事务管理器(同XML方式) -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><!-- 开启注解事务支持 -->
<tx:annotation-driven transaction-manager="txManager"/>
在 Service 方法或类上添加@Transactional
:
package com.jr.service.impl;import com.jr.mapper.DeptMapper;
import com.jr.pojo.Dept;
import com.jr.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
// 类级别注解:所有方法默认REQUIRED策略
@Transactional(propagation = Propagation.REQUIRED)
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;// 方法级别注解:覆盖类级别配置(可选)@Overridepublic int addDept(Dept dept) throws Exception {return deptMapper.insertDept(dept);}// 查询方法:SUPPORTS策略,只读@Override@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)public List<Dept> findAll() throws Exception {return deptMapper.selectAll();}// 测试事务回滚:同时执行insert和update,异常时回滚@Overridepublic boolean updateDept(Dept dept, String loc) throws Exception {int i = deptMapper.insertDept(dept); // 新增dept.setLoc(loc);i += deptMapper.updateDept(dept); // 更新(假设存在updateDept方法)// 故意抛出异常,测试回滚if (loc == null) throw new Exception("地址不能为空");return i == 2;}
}
测试事务回滚
编写测试方法,触发异常验证事务是否回滚:
@Test
public void testTransactionRollback() {try {Dept dept = new Dept();dept.setDeptno(101);dept.setDname("测试回滚组");// 传入null地址,触发异常deptService.updateDept(dept, null);} catch (Exception e) {System.out.println("事务回滚:" + e.getMessage());// 查询是否新增成功(预期:未新增,因为事务回滚)List<Dept> depts = deptService.findAll();boolean exists = depts.stream().anyMatch(d -> d.getDeptno() == 101);System.out.println("新增部门是否存在:" + exists); // 输出false}
}
运行结果:新增操作被回滚,数据库中无deptno=101
的部门,说明事务生效。
注意事项:Spring 事务默认只回滚RuntimeException
,若需回滚 checked 异常(如Exception
),需在@Transactional
中指定rollbackFor = Exception.class
。
三、Spring 核心注解总结:提升开发效率的 “快捷键”
在前面的实战中,我们用到了大量注解(如@Service
、@Autowired
、@Transactional
)。《Spring 框架学习笔记.pdf》对常用注解进行了整理,我们按 “功能分类” 总结,方便后续开发查阅。
3.1 Bean 声明注解(替代 XML 的<bean>
)
用于将类注册为 Spring Bean,无需手动配置<bean>
标签:
注解 | 作用 | 适用场景 |
---|---|---|
@Component | 通用 Bean 声明 | 无明确分层的类(如工具类) |
@Service | 语义化 Bean 声明(Component 子类) | Service 层类(如 DeptServiceImpl) |
@Repository | 语义化 Bean 声明(Component 子类) | Dao 层 / Mapper 接口(如 DeptMapper) |
@Controller | 语义化 Bean 声明(Component 子类) | Controller 层类(如 UserController) |
使用示例:
@Service // Service层Bean,默认id为"deptServiceImpl"(类名首字母小写)
public class DeptServiceImpl implements DeptService { ... }
3.2 依赖注入注解(替代 XML 的<property>
)
用于自动注入 Spring 容器中的 Bean,避免手动配置依赖:
注解 | 作用 | 匹配规则 |
---|---|---|
@Autowired | Spring 提供的依赖注入 | 默认 byType,可结合@Qualifier byName |
@Resource | Java EE 提供的依赖注入(JSR-250) | 默认 byName,次选 byType |
@Value | 注入基本类型 / 配置文件参数 | 结合${key} 读取 properties |
使用示例:
@Service
public class DeptServiceImpl implements DeptService {// @Autowired+@Qualifier:按Name注入Mapper@Autowired@Qualifier("deptMapper")private DeptMapper deptMapper;// @Value:注入配置文件中的url@Value("${url}")private String dbUrl;
}
3.3 AOP 与事务注解
用于配置 AOP 切面和事务管理:
注解 | 作用 | 关键属性 |
---|---|---|
@Aspect | 声明类为 AOP 切面 | 无 |
@Pointcut | 定义 AOP 切点 | value :切点表达式 |
@Before | 前置通知 | value :关联切点 |
@After | 后置通知 | value :关联切点 |
@Transactional | 声明事务 | propagation :传播策略,rollbackFor :回滚异常 |
使用示例:
// AOP切面示例
@Aspect
@Component
public class LogAspect {@Pointcut("execution(* com.jr.service.*.*(..))")public void servicePointcut() {}@Before("servicePointcut()")public void beforeLog() {System.out.println("前置通知:执行方法前日志");}
}// 事务示例
@Service
public class DeptServiceImpl implements DeptService {@Override@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public int addDept(Dept dept) throws Exception {return deptMapper.insertDept(dept);}
}
3.4 其他常用注解
注解 | 作用 | 使用场景 |
---|---|---|
@Scope | 指定 Bean 的作用域 | value="prototype" :原型模式 |
@PostConstruct | Bean 初始化后执行 | 初始化资源(如加载配置) |
@PreDestroy | Bean 销毁前执行 | 释放资源(如关闭连接) |
使用示例:
@Component
@Scope("prototype") // 原型模式,每次getBean新建实例
public class User {@PostConstructpublic void init() {System.out.println("User初始化");}@PreDestroypublic void destroy() {System.out.println("User销毁");}
}
四、系列总结:Spring 框架的 “知识闭环”
至此,《Spring 框架学习笔记.pdf》的核心内容已通过三篇博客完整覆盖,从基础到实战形成闭环:
- 第一篇(基础篇):聚焦 IOC 容器,掌握了 Spring 的核心思想、环境搭建、Bean 的创建与生命周期,解决了 “对象创建控制权” 的问题;
- 第二篇(进阶篇):聚焦 DI 与 AOP,掌握了依赖注入的三种方式、AOP 的核心概念与配置,解决了 “对象依赖解耦” 与 “通用逻辑提取” 的问题;
- 第三篇(实战篇):聚焦企业级实战,掌握了 Spring 整合 MyBatis 的完整流程、声明式事务的配置与优化,以及核心注解的总结,解决了 “数据持久化” 与 “数据一致性” 的问题。
Spring 的核心优势在于 “解耦” 与 “整合”—— 通过 IOC/DI 解耦对象依赖,通过 AOP 解耦通用逻辑,通过整合 MyBatis、事务等组件形成完整的开发体系。后续学习中,可进一步拓展 Spring MVC、Spring Boot 等技术,但 Spring 的三大核心(IOC、DI、AOP)是所有拓展的基础,务必扎实掌握。
希望本系列博客能帮你从 “Spring 入门” 到 “Spring 精通”,在企业级开发中灵活运用 Spring 解决实际问题,同时应对面试中的核心考点。