spring学习笔记(23)基于tx/aop配置切面增强事务

简介: <div class="markdown_views"><p>在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点: <br>1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。 <br>2.

在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点:
1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。
2. 事务属性的配置串虽然能包含较多信息,但配置较易出错。

针对这些问题,我们可以基于Schema,引入tx和aop的命名空间来改进我们的配置:

  1. 引入命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
  1. tx\aop核心配置
<!-- 配置事务属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRES_NEW" />
        <tx:method name="update*" propagation="REQUIRES_NEW" />
        <tx:method name="delete*" propagation="REQUIRES_NEW" />
        <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>
<!-- 配置事务切入点,以及把事务切入点和事务属性关联起来 -->
<aop:config proxy-target-class="true">
    <aop:pointcut expression="execution(* com.yc.service.*.*(..))"
        id="ServicePointcut" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="ServicePointcut" />
</aop:config> 

这里需要特别注意的是,我们需要在标签中将proxy-target-class配置成true,否则会出现和上一篇文章相同的错误:我们定义的类无法转换成代理类
这里我们通过来配置我们的事务增强属性。在标签中,常见属性及其说明如下,其中,除了name属性是必选外,其他都是可选的

属性 说明 默认 允许值
name 匹配方法名 必须声明,至少为* 可使用*通配符
propagation 事务传播行为 REQUIRED REQUIRED,SUPPORTS和MANDATORY和REQUIRES_NEW和NOT_SUPPORTED和NEVER和NESTED
read-only 设置当前事务是否只读 false true,false
isolation 事务隔离级别 DEFAULT READ_UNCOMMITTED和READ_COMMITTED和REPEATABLE_READ和SERIALIZABLE
timeout 设置事务的超时时间 -1 默认由顶层事务系统决定
rollback-for 内容为异常名,表示当抛出这些异常时事务回滚,可以用逗号分隔配置多个 无默认值 可以使用异常名称的片段进行匹配如ception等
no-rollback-for 内容为异常名,表示当抛出这些异常时继续提交事务,可以用逗号分隔配置多个 无默认值 可以使用异常名称的片段进行匹配如ception等。

在这里运行和上一篇文章同样的测试程序,我们会得到相同的结果

目录
相关文章
|
2月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
1月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
494 5
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1615 0
|
XML Java 数据库连接
【Spring学习笔记 五】Spring注解及Java类配置开发
【Spring学习笔记 五】Spring注解及Java类配置开发
187 0
|
XML Java 数据格式
Spring学习笔记:02 spring配置
Spring学习笔记:02 spring配置
|
Java 数据库连接 Spring
spring学习笔记(22)声明式事务配置,readOnly无效写无异常
<div class="markdown_views"> <p>在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的
1751 0
|
Java 数据库连接 数据库
spring学习笔记(21)编程式事务配置,service层概念引入
<div class="markdown_views"> <h1 id="访问数据库事务导入">访问数据库事务导入</h1> <p>在我之前的文章<a href="http://blog.csdn.net/qwe6112071/article/details/50976354">《spring学习笔记(19)mysql读写分离后端AOP控制实例》</a>中模拟数据库读写分离的
3245 0
|
Java 关系型数据库 数据库连接
spring学习笔记(17)数据库配置[1]spring数据连接池详解
<div class="markdown_views"> <h1 id="数据连接池">数据连接池</h1> <p>在spring中,常使用数据库连接池来完成对数据库的连接配置,类似于线程池的定义,数据库连接池就是维护有一定数量数据库连接的一个缓冲池,一方面,能够即取即用,免去初始化的时间,另一方面,用完的数据连接会归还到连接池中,这样就免去了不必要的连接创建、销毁工作,提升
4496 0