Spring事务管理@Transactional注解最佳实践

 更新时间:2026年02月24日 09:28:31   作者:寒人病酒  
本文详细介绍了Spring框架的核心特性,包括IOC容器、AOP面向切面编程和事务管理,重点解析了Spring事务的传播行为和隔离级别,以及SpringBoot的自动配置原理,本文给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧

Spring事务管理:@Transactional注解深度解析

Spring框架是Java后端开发的核心技术栈,掌握其原理和最佳实践至关重要。

一、Spring核心特性

事务管理是企业级应用的核心功能,理解Spring事务的传播行为和隔离级别对保证数据一致性至关重要

二、IOC容器

2.1 Bean的生命周期

Spring Bean 生命周期流程:

实例化
  ↓
属性赋值 (populateBean)
  ↓
BeanNameAware (setBeanName)
  ↓
BeanFactoryAware (setBeanFactory)
  ↓
ApplicationContextAware (setApplicationContext)
  ↓
BeanPostProcessor前置 (postProcessBeforeInitialization)
  ↓
InitializingBean (afterPropertiesSet)
  ↓
init-method (自定义初始化方法)
  ↓
BeanPostProcessor后置 (postProcessAfterInitialization)
  ↓
使用Bean (ready for use)
  ↓
DisposableBean (destroy)
  ↓
destroy-method (自定义销毁方法)

说明:
- 蓝色节点:Spring 提供的扩展接口
- 绿色节点:用户自定义的方法

2.2 依赖注入方式

// 1. 构造器注入(推荐)
@Component
public class UserService {
    private final UserRepository userRepository;
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 2. Setter注入
@Component
public class UserService {
    private UserRepository userRepository;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 3. 字段注入(不推荐)
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

三、AOP面向切面编程

3.1 AOP核心概念

  • 切面(Aspect):横切关注点的模块化
  • 连接点(JoinPoint):程序执行的某个位置
  • 切点(Pointcut):匹配连接点的表达式
  • 通知(Advice):在切点上执行的动作
  • 目标对象(Target):被代理的对象

3.2 通知类型

@Aspect
@Component
public class LoggingAspect {
    // 前置通知
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("Before: " + joinPoint.getSignature());
    }
    // 后置通知
    @After("execution(* com.example.service.*.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        System.out.println("After: " + joinPoint.getSignature());
    }
    // 返回通知
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))",
                     returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("AfterReturning: " + result);
    }
    // 异常通知
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))",
                   throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Exception ex) {
        System.out.println("AfterThrowing: " + ex.getMessage());
    }
    // 环绕通知
    @Around("execution(* com.example.service.*.*(..))")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around Before");
        Object result = joinPoint.proceed();
        System.out.println("Around After");
        return result;
    }
}

四、Spring事务管理

4.1 事务注解

@Service
public class OrderService {
    // 声明式事务
    @Transactional(
        propagation = Propagation.REQUIRED,  // 传播行为
        isolation = Isolation.READ_COMMITTED,  // 隔离级别
        timeout = 30,  // 超时时间
        readOnly = false,  // 只读
        rollbackFor = Exception.class  // 回滚异常
    )
    public void createOrder(Order order) {
        // 业务逻辑
    }
}

4.2 事务传播行为

传播行为说明
REQUIRED默认,如果存在事务则加入,否则新建
REQUIRES_NEW新建事务,挂起当前事务
SUPPORTS如果存在事务则加入,否则非事务执行
NOT_SUPPORTED非事务执行,挂起当前事务
MANDATORY必须在事务中,否则抛异常
NEVER必须非事务执行,否则抛异常
NESTED嵌套事务,回滚点保存

五、Spring Boot自动配置

5.1 自动配置原理

// @EnableAutoConfiguration 注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String[] excludeName() default {};
}
// 自动配置类示例
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    // 配置逻辑
}

5.2 常用注解

// 条件注解
@ConditionalOnClass        // 类路径下存在指定类
@ConditionalOnMissingClass  // 类路径下不存在指定类
@ConditionalOnBean         // 容器中存在指定Bean
@ConditionalOnMissingBean   // 容器中不存在指定Bean
@ConditionalOnProperty      // 配置属性满足条件
@ConditionalOnWebApplication  // Web环境

六、常见面试题

Q1: Spring中循环依赖如何解决?

答案:
Spring通过三级缓存解决循环依赖:

// 三级缓存
1. singletonObjects          // 一级缓存:完整的Bean
2. earlySingletonObjects     // 二级缓存:提前暴露的Bean
3. singletonFactories        // 三级缓存:Bean的工厂
// 解决流程
1. A实例化后,放入三级缓存
2. A注入B,B需要A
3. B从三级缓存获取A的工厂,创建A的代理对象
4. B注入A的代理对象,B完成初始化
5. A继续初始化,注入B,完成初始化

Q2: @Autowired和@Resource的区别?

答案:

特性@Autowired@Resource
来源SpringJava JSR-250
匹配方式按类型,其次按名称按名称,其次按类型
Required属性支持不支持
作用位置构造器、方法、字段方法、字段

Q3: 事务失效的场景有哪些?

答案:
1. 方法不是public
2. 方法自调用(this调用)
3. 异常被捕获未抛出
4. 异常类型不匹配(默认RuntimeException)
5. 数据库引擎不支持事务
6. 未被Spring管理(无@Component等注解)

七、最佳实践

代码规范:
- 优先使用构造器注入
- 合理使用AOP,避免过度设计
- 事务粒度要小,避免大事务

性能优化:
- 使用循环依赖缓存
- 合理使用懒加载(@Lazy)
- 控制Bean的生命周期

八、总结

Spring框架博大精深,持续学习:

核心要点
- 掌握IOC和AOP原理
- 理解事务传播机制
- 熟悉自动配置原理

进阶方向
- 阅读Spring源码
- 学习Spring Cloud微服务
- 实践项目应用

推荐资源
- 《Spring实战》
- Spring官方文档
- Spring源码分析

到此这篇关于Spring事务管理@Transactional注解最佳实践的文章就介绍到这了,更多相关Spring事务管理@Transactional注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java对指定目录下文件读写操作介绍

    java对指定目录下文件读写操作介绍

    本文将详细介绍java对指定目录下文件的读写功能实现,需要的朋友可以参考下
    2012-11-11
  • MyBatis传入多个参数时parameterType的写法

    MyBatis传入多个参数时parameterType的写法

    这篇文章主要介绍了MyBatis传入多个参数时parameterType的写法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • springboot与mybatis整合实例详解(完美融合)

    springboot与mybatis整合实例详解(完美融合)

    大家都知道springboot搭建一个spring框架只需要秒秒钟。下面通过实例代码给大家介绍一下springboot与mybatis的完美融合,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • Java实现走迷宫回溯算法

    Java实现走迷宫回溯算法

    这篇文章主要为大家详细介绍了Java实现走迷宫回溯算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringBoot超详细讲解@Value注解

    SpringBoot超详细讲解@Value注解

    在使用spring框架的项目中,@Value是经常使用的注解之一。作用是将配置文件中的键对应的值分配给某类内带注解的属性。本文使您系统地了解@Value的用法。在使用Spring框架的项目中@Value是经常使用的注解之一,其作用是将配置文件中的键对应的值分配给某类内带注解的属性
    2022-07-07
  • Java详细分析梳理垃圾回收机制

    Java详细分析梳理垃圾回收机制

    垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在 Java 虚拟机的语境下,垃圾指的是死亡的对象所占据的堆空间
    2022-04-04
  • Java报错:java.util.concurrent.ExecutionException的解决办法

    Java报错:java.util.concurrent.ExecutionException的解决办法

    在Java并发编程中,我们经常使用java.util.concurrent包提供的工具来管理和协调多个线程的执行,va并发编程中,然而,在使用这些工具时,可能会遇到各种各样的异常,其中之一就是java.util.concurrent.ExecutionException,本文将详细分析这种异常的背景、可能的原因
    2024-09-09
  • 创建Maven项目和Spring IOC实例过程解析

    创建Maven项目和Spring IOC实例过程解析

    这篇文章主要介绍了创建Maven项目和Spring IOC实例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 一文让你彻底学会Java左移、右移操作

    一文让你彻底学会Java左移、右移操作

    这篇文章主要介绍了了Java中的位运算符,包括左移(<<)、右移(>>)和无符号右移(>>>),左移将数字的二进制位向左移动,相当于乘以2的n次方;右移将数字的二进制位向右移动,保留符号位,相当于除以2的n次方,文中介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • elasticsearch+logstash并使用java代码实现日志检索

    elasticsearch+logstash并使用java代码实现日志检索

    这篇文章主要介绍了elasticsearch+logstash并使用java代码实现日志检索,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论