声明式事务测试 :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、目标方法先执行,如果异常,获取到事务管理器,并利用其进行回滚。如果正常,利用事务管理器提交事务

目录
相关文章
|
14天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
97 26
|
17天前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
163 89
|
2月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
181 73
|
4天前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
33 16
|
2月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
60 21
|
1月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
47 10
|
1月前
|
SQL Java 关系型数据库
【SpringFramework】Spring事务
本文简述Spring中数据库及事务相关衍伸知识点。
50 9
|
2月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
127 13
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
1月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。