声明式事务测试 :Spring注解笔记系列(一)

简介: 事务拦截器:先获取事务相关的一些属性,再来获取PlateformTransactionManager,如果事先没有添加任何指定TransactionManager,最终会从容器中按照类型获取一个PlateformTransactionManager

声明式事务测试 :Spring注解笔记系列(一)


一、序言


1、为何写?

好记性不如烂笔头。


2、写来何用?

温故而知新,你懂得。


3、有谁看?

本系列笔记可作为阅读《Think In Java》辅助理解,人不可止步,圈地自封。


二、环境搭建


(1) 导入相关依赖(数据源、数据库驱动、Spring-jdbc模块)

(2) 配置数据源,JdbcTemplate(Spring提供的简化数据库操作工具)操作数据

(3) 给方法加上标注@Transactional 表示当前方法是一个事务方法

(4) @EnableTransactionManagement 开启基于注解的事务管理功能

(5) 配置事务管理器来控制事务


三、@Transactional


(1) 方法加上该注解则说明:表示当前方法是一个事务方法


四、@EnableTransactionManagement


(1) 开启基于注解的事务管理功能


(2) 原理


EnableTransactionManagement使用Import导入了TransactionManagementConfigurationSelector(继承的是ImportSelector)类,给容器中导入两个组件


A、使用selectImports(AdviceMode adviceMode)方法(AdviceMode就是该注解里定义的adviceMode属性且默认就是proxy)判断如果是PROXY,则返回String数组(AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()),如果是AspectJ则返回String数组


(TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME)


B、AutoProxyRegistrar其实就是给容器中注册Bean的(ImportBeanDefinitionRegistrar),调用ImportBeanDefinitionRegistrar(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) 给容器中注册Bean


1、判断如果是proxy,则使用AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);,并且设置了proxyTargetClass,

则会Object proxyTargetClass = candidate.get("proxyTargetClass");,其中proxyTargetClass就是该注解中定义的值(如果它为true,但是默认为false)


1.1、proxy且不等于true,调用registerAutoProxyCreatorIfNecessary(registry)。首先创建一个自动代理创建器(registerAutoProxyCreatorIfNecessary) 创建器会调用如需创建器(registerAutoProxyCreatorIfNecessary(registry, null)),如需创建器会调用需要器(registerOrEscalateApcAsRequired()), 需要器会创建一个组件(InfrastructureAdvisorAutoProxyCreator) 给容器中注册一个组件InfrastructureAdvisorAutoProxyCreator(后置处理器)


1.2、InfrastructureAdvisorAutoProxyCreator利用后置处理器机制在对象创建之后,返回一个代理对象(其中有增强器),代理对象执行方法利用拦截器链进行调用


C、ProxyTransactionManagementConfiguration作用


1、给容器中注册事务增强器


1.1、事务增强器要用事务注解的信息:AnnotationTransactionAttributeSource解析事务注解

1.2、事务拦截器:TransactionInterceptor保存了事务属性的信息,事务管理器(该类为方法拦截器)

              方法拦截器:比如容器中有一个代理对象,代理对象要执行目标方法,方法拦截器就会进行工作

1.3、AOP中四个通知方法最终都被整合成事务增强器,增强器变为MethodInterceptor


2、MethodInterceptor如何工作


2.1、在目标执行的时候,因为是代理对象在执行,由于代理对象会执行拦截器链(MethodInterceptor)  

2.2、事务拦截器:先获取事务相关的一些属性,再来获取PlateformTransactionManager,如果事先没有添加任何指定TransactionManager,最终会从容器中按照类型获取一个PlateformTransactionManager

2.3、目标方法先执行,如果异常,获取到事务管理器,并利用其进行回滚。如果正常,利用事务管理器提交事务

目录
相关文章
|
15天前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
89 2
|
16天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
2天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
9 1
Spring高手之路24——事务类型及传播行为实战指南
|
5天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
23 4
SpringBoot必须掌握的常用注解!
|
7天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
40 2
|
7天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
25 1
|
18天前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
29 1
|
21天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
21天前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
6 0