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

目录
相关文章
|
3天前
|
Java 开发者 Spring
深入理解Spring Boot的@ComponentScan注解
【4月更文挑战第22天】在构建 Spring Boot 应用时,@ComponentScan 是一个不可或缺的工具,它使得组件发现变得自动化和高效。这篇博客将详细介绍 @ComponentScan 的基本概念、关键属性及其在实际开发中的应用。
20 4
|
4天前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
28 6
|
1月前
|
XML Java 数据库连接
spring boot 参数的过滤注解与实战
在Spring Boot应用中,对于入参的过滤,通常会涉及到对Web层的数据验证和处理。Spring Boot借助Spring框架提供了强大的验证框架支持,主要基于JSR-303/JSR-380(Bean Validation API)规范,以及Spring自身的@Valid或@Validated注解来实现请求参数的验证。以下是一些常见的使用案例来展示如何对参数进行过滤和验证。
29 1
|
1月前
|
Java Spring
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
使用JDBCTemplate实现与Spring结合,方法公用 ——测试(EmpDaoImplTest)
8 0
|
1月前
|
Java 数据库 Spring
【spring(四)】Spring事务管理和@Transactional注解
【spring(四)】Spring事务管理和@Transactional注解
|
12天前
|
XML Java 数据格式
进阶注解探秘:深入Spring高级注解的精髓与实际运用
进阶注解探秘:深入Spring高级注解的精髓与实际运用
26 2
|
12天前
|
XML Java 数据格式
从入门到精通:Spring基础注解的全面解析
从入门到精通:Spring基础注解的全面解析
30 2
从入门到精通:Spring基础注解的全面解析
|
16天前
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
14 0
|
1月前
|
iOS开发
iOS自动混淆测试处理笔记
iOS自动混淆测试处理笔记
12 0
|
1月前
|
Java Spring
使用spring实现邮件的发送(含测试,源码,注释)
使用spring实现邮件的发送(含测试,源码,注释)
7 0

热门文章

最新文章