当前位置: 首页 > news >正文

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.1 Bean 声明注解(替代 XML 的)

3.2 依赖注入注解(替代 XML 的)

3.3 AOP 与事务注解

3.4 其他常用注解

四、系列总结:Spring 框架的 “知识闭环”


一、Spring 整合 MyBatis:持久层开发的 “企业标配”

        MyBatis 是 Java 领域最流行的持久层框架,而 Spring 是企业级开发的 “骨架”—— 两者整合后,Spring 可接管 MyBatis 的核心组件(如SqlSessionFactoryMapper接口),实现 “Bean 管理” 与 “数据持久化” 的无缝衔接。《Spring 框架学习笔记.pdf》详细列出了整合的完整步骤,我们结合实战案例逐一拆解。

1.1 整合核心目标:让 Spring 管理 MyBatis 组件

        传统 MyBatis 开发中,需手动创建SqlSessionFactorySqlSession,并通过SqlSession获取 Mapper 接口,存在 “资源管理繁琐”“代码冗余” 的问题。Spring 整合 MyBatis 的核心目标是:

  1. Spring 管理SqlSessionFactory:替代手动build,通过配置文件注入数据源;
  2. Spring 管理 Mapper 接口:无需手动getMapper,Spring 自动生成 Mapper 代理对象;
  3. 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,存储数据库连接四要素。需注意:变量名不能用driverusername,否则会与系统环境变量冲突,需用driverClassuser替代:

# 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,避免手动配置依赖:

注解作用匹配规则
@AutowiredSpring 提供的依赖注入默认 byType,可结合@Qualifier byName
@ResourceJava 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":原型模式
@PostConstructBean 初始化后执行初始化资源(如加载配置)
@PreDestroyBean 销毁前执行释放资源(如关闭连接)

使用示例

@Component
@Scope("prototype") // 原型模式,每次getBean新建实例
public class User {@PostConstructpublic void init() {System.out.println("User初始化");}@PreDestroypublic void destroy() {System.out.println("User销毁");}
}

四、系列总结:Spring 框架的 “知识闭环”

        至此,《Spring 框架学习笔记.pdf》的核心内容已通过三篇博客完整覆盖,从基础到实战形成闭环:

  1. 第一篇(基础篇):聚焦 IOC 容器,掌握了 Spring 的核心思想、环境搭建、Bean 的创建与生命周期,解决了 “对象创建控制权” 的问题;
  2. 第二篇(进阶篇):聚焦 DI 与 AOP,掌握了依赖注入的三种方式、AOP 的核心概念与配置,解决了 “对象依赖解耦” 与 “通用逻辑提取” 的问题;
  3. 第三篇(实战篇):聚焦企业级实战,掌握了 Spring 整合 MyBatis 的完整流程、声明式事务的配置与优化,以及核心注解的总结,解决了 “数据持久化” 与 “数据一致性” 的问题。

        Spring 的核心优势在于 “解耦” 与 “整合”—— 通过 IOC/DI 解耦对象依赖,通过 AOP 解耦通用逻辑,通过整合 MyBatis、事务等组件形成完整的开发体系。后续学习中,可进一步拓展 Spring MVC、Spring Boot 等技术,但 Spring 的三大核心(IOC、DI、AOP)是所有拓展的基础,务必扎实掌握。

        希望本系列博客能帮你从 “Spring 入门” 到 “Spring 精通”,在企业级开发中灵活运用 Spring 解决实际问题,同时应对面试中的核心考点。


文章转载自:

http://rCDvtZOj.fstdf.cn
http://Z8UYf6vE.fstdf.cn
http://0u2owFYo.fstdf.cn
http://Ixkfb0Wu.fstdf.cn
http://d4SxiKsU.fstdf.cn
http://82CCYheA.fstdf.cn
http://t2V4sN17.fstdf.cn
http://uuvPArC6.fstdf.cn
http://JmTvjUxu.fstdf.cn
http://BCDE3R0B.fstdf.cn
http://uBlu9UvZ.fstdf.cn
http://oWYu2bA2.fstdf.cn
http://5zXjH3Dr.fstdf.cn
http://DxvaCZQS.fstdf.cn
http://Dp93gwkv.fstdf.cn
http://8AGClggg.fstdf.cn
http://DgzW6aYR.fstdf.cn
http://3IsXeh8h.fstdf.cn
http://YzLySc3i.fstdf.cn
http://Hodwm5Kf.fstdf.cn
http://JK7F0Jka.fstdf.cn
http://1xUjtDUc.fstdf.cn
http://wzbONgq7.fstdf.cn
http://IPmSldQG.fstdf.cn
http://rF2144vV.fstdf.cn
http://1D29yKES.fstdf.cn
http://0uvEn6RO.fstdf.cn
http://MTT0rLAg.fstdf.cn
http://T90uGNe5.fstdf.cn
http://tbgvLMxo.fstdf.cn
http://www.dtcms.com/a/385053.html

相关文章:

  • Java:使用spring-cloud-gateway的应用报DnsNameResolverTimeoutException原因和解决方法
  • 【ARM-day06-KEY实验-中断】
  • 实战优化!多智能体React模式:层级指挥的黄金法则​
  • 容器逃逸漏洞
  • 石头科技出海升级:全球电商业财一体化与OMS实践
  • (二)文件管理-文件权限-chmod命令的使用
  • 使用 cAdvisor 监控容器
  • MongoDB 删除集合
  • 【C++】C++中内存管理的利器“智能指针”
  • C++——高并发内存池设计(一)
  • 快速入门HarmonyOS应用开发(一)
  • 深入解析 `pthread_detach`:告别线程的优雅之道
  • Arduino 通讯接口全景解析:从硬件到软件的跨板对话艺术
  • Python3练习题
  • AI GEO 实战:借百度文小言优化,让企业名称成搜索热词
  • 数字图像处理(1)OpenCV C++ Opencv Python显示图像和视频
  • 《拆解Unity开发顽疾:从UI渲染异常到物理交互失效的实战排障手册》
  • 安装和初始化配置Git
  • 蓝牙BLE调制端GFSK高斯滤波查表设计原理
  • PPO算法-强化学习
  • Spring Boot 实战:优雅地将配置文件映射为Java配置类并自动注入
  • ADC转换原理与应用详解
  • 第五章 搭建ZYNQ视频图像处理系统——软件设计
  • Chapter6—原型模式
  • Java字符串操作:从入门到精通
  • 如何科学评估CMS系统性能优化效果?
  • 批量更新和批量插入,内含jdbc工具类
  • 3D地球可视化教程 - 第2篇:夜晚纹理与着色器入门
  • Ajax笔记2
  • DDoS高防IP是什么? DDoS攻击会暴露IP吗?