Spring事务为什么会失效?(一)

hexiaox810
发布于 2022-6-6 17:36
浏览
0收藏

 

不用Spring管理事务?
如果对AOP的实现不太熟悉的话可以看我之前的文章,或者到我网站www.javashitang.com上查看系列文章

2w字搞懂Spring AOP的前世今生


让我们先来看一下不用spring管理事务时,各种框架是如何管理事务的

使用JDBC来管理事务

Spring事务为什么会失效?(一)-鸿蒙开发者社区

使用Hibernate来管理事务

Spring事务为什么会失效?(一)-鸿蒙开发者社区

业务逻辑和事务代码是耦合到一块的,并且和框架的具体api绑定了。当我们换一种框架来实现时,里面对事务控制的代码就要推倒重写,并不一定能保证替换后的api和之前的api有相同的行为。

「统一的事务抽象」

基于这些问题,Spring抽象了一些事务相关的顶层接口。无论是全局事务还是本地事务,JTA,JDBC还是Hibernate,Spring都使用统一的编程模型。使得应用程序可以很容易的在全局事务与本地事务,或者不同事物框架之间进行切换。

「下图为Spring事物抽象的核心类」 

Spring事务为什么会失效?(一)-鸿蒙开发者社区Spring事务为什么会失效?(一)-鸿蒙开发者社区针对不同的数据访问技术,使用不用的PlatformTransactionManager类即可

Spring事务为什么会失效?(一)-鸿蒙开发者社区编程式事务管理
当我们使用Spring的事务时,可以使用编程式事务或者声明式事务。

当使用编程式事务的时候,可以直接使用事务的顶层接口,也可以使用模版类TransactionTemplate

 

使用PlatformTransactionManager
   

Spring事务为什么会失效?(一)-鸿蒙开发者社区Spring事务为什么会失效?(一)-鸿蒙开发者社区Spring事务为什么会失效?(一)-鸿蒙开发者社区

使用TransactionTemplate

当我们直接使用PlatformTransactionManager来管理事务时,有很多模版代码。例如业务代码正常执行,提交事务,否则回滚事务。我们可以把这部分模版代码封装成一个模版类,这样使用起来就很方便了,如下所示

Spring事务为什么会失效?(一)-鸿蒙开发者社区

如下图所示,TransactionTemplate#execute方法就是一个典型的模版方法

Spring事务为什么会失效?(一)-鸿蒙开发者社区

我们可以传入如下2个接口的实现类来执行业务逻辑,TransactionCallback(需要返回执行结果)或TransactionCallbackWithoutResult(不需要返回结果)

声明式事务管理
为了让使用更加简洁,Spring直接把事务代码的执行放到切面中了,我们只需要在业务代码方法上加上一个@Transactional注解即可,这种方式我们最常用哈

使用@Transactional注解

此时事务相关的定义我们就可以通过@Transactional注解来设置了

Spring事务为什么会失效?(一)-鸿蒙开发者社区Spring事务为什么会失效?(一)-鸿蒙开发者社区 在这里插入图片描述

源码解析
我们需要在配置类上加上@EnableTransactionManagement注解,来开启spring事务管理功能

Spring事务为什么会失效?(一)-鸿蒙开发者社区

「TransactionManagementConfigurationSelector#selectImports」

Spring事务为什么会失效?(一)-鸿蒙开发者社区

往容器中注入AutoProxyRegistrar和ProxyTransactionManagementConfiguration这2个类,那这2个类有啥作用呢?(源码太多了,我就不贴代码一步一步分析了,主要是理清思路)

Spring事务为什么会失效?(一)-鸿蒙开发者社区

 在这里插入图片描述

AutoProxyRegistrar主要就是往容器中注入一个类InfrastructureAdvisorAutoProxyCreator,这个类有什么作用呢?

「看一下继承关系,原来是继承自AbstractAutoProxyCreator,用来实现自动代理没跑了!」

Spring事务为什么会失效?(一)-鸿蒙开发者社区

 BeanFactoryTransactionAttributeSourceAdvisor主要就是往容器中注入了一个Advisor类,用来保存Pointcut和Advice

Spring事务为什么会失效?(一)-鸿蒙开发者社区

 对应的Pointcut为TransactionAttributeSourcePointcut的实现类,是一个匿名内部类,即筛选的逻辑是通过TransactionAttributeSourcePointcut类来实现的

 

文章转自公众号:Java识堂

分类
标签
已于2022-6-6 17:36:53修改
收藏
回复
举报
回复
    相关推荐