使用AOP配置Springboot事务管理

项目开发中事务管理是非常重要的一个环节,在一些信息管理系统中,不需要对事务管理进行大规模精细化控制,因此配置主动的事务管理机制是降低代码Bug的重要手段。本文主要讲述在Springboot下如何配置主动事务管理,让开发者能够聚焦在自己的业务代码实现上。

编写配置资源

在项目的src/main/resources/config下,配置transaction-management.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

  <!--
    The following settings are default settings that apply to the entire application, and define the following two for all transactional methods calls.
    ・Use REQUIRED as a transaction propagation method
    ・Roll back a transaction when an exception occurs
    
    If you can not follow this default setting, you can overwrite the settings of individual transactions by giving @Transactional.
  -->
  <tx:advice id="txAdvice">
    <tx:attributes>
      <tx:method name="load*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
      <tx:method name="search*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
      <tx:method name="get*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
      <tx:method name="find*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
      <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/> 
    </tx:attributes>
  </tx:advice>

  <!-- Apply txAdvice to all public methods that are granted @Service but not @Transactional with class / method -->
  <aop:config>
    <aop:pointcut id="serviceOperation"
      expression="execution(* *(..))
        and @within(org.springframework.stereotype.Service)
        and !@annotation(org.springframework.transaction.annotation.Transactional)
        and !@within(org.springframework.transaction.annotation.Transactional)
        and !@annotation(javax.transaction.Transactional)
        and !@within(javax.transaction.Transactional)"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
  </aop:config>

</beans>

此配置,将对项目中使用@Service注解添加事务控制,但是排除了使用或继承@javax.transaction.Transactional@org.springframework.transaction.annotation.Transactional的类。
此外,对以load,search,get,find开头的命名方法使用readonly事务。

创建配置类

将上面创建的配置资源使用Springboot的@ImportResource方法加载。

@Configuration
@ImportResource({ "classpath:/config/transaction-management.xml" })
public class TxtManagentConfiguration {
    
}

版权声明:本文为bitemet原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。