欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring框架学习笔记——关于事务的处理(2)

程序员文章站 2022-07-05 07:58:52
...

上一篇学习了使用注解配置事务,但是只适用于中小型项目,大项目中,有很多的类,方法,需要大量的配置事务,使用aspectj框架功能,在spring配置文件中声明类,方法需要的事务。这种方式业务方法和事务配置完全分离。
实现步骤:都是在xml配置文件中实现。
1)要使用的是aspectj框架,需要加入依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

2)声明事务管理器对象

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

3)声明方法需要的事务类型(配置方法的事务属性【隔离级别,传播行为,超时】)
4)配置aop:指定哪些类需要创建代理。

<!--    声明式事务处理,与源代码完全分离-->
<!--    1声明事务管理器对象-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="myDataSource"/>
        </bean>

<!--    2声明业务方法的事务属性(隔离级别,传播行为,超时时间)
        id:自定义名称,表示<tx:advice>和</tx:advice>之间的配置内容的
        transaction-manager:事务管理器对象的id
-->
    <tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--      tx:attributes:配置事务的属性  -->
        <tx:attributes>
<!--         tx:method:给具体的方法配置事务属性,method可以有多个,分别给不同的方法设置事务属性
             name:方法的名称 1)完整的名称,不带有包和类
                            2)方法可以使用通配符,*表示任意字符
             propagation:传播行为,枚举值
             isolation:隔离级别
             rollback-for:你指定的异常类,发生异常,一定回滚
 -->
            <tx:method name="buy" propagation="REQUIRED" isolation="DEFAULT"
                       rollback-for="java.lang.NullPointerException,com.wxx.excep.NotEnoughException"/>
<!--         使用通配符,指定很多的方法-->
            <tx:method name="add*" propagation="REQUIRES_NEW"/>
<!--         指定修改方法-->
            <tx:method name="modify*"/>
<!--          删除方法-->
            <tx:method name="remove*"/>
<!--          查询方法,query,search,find-->
            <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>


    </tx:advice>
   <!--    配置aop-->
    <aop:config>
<!--        配置切入点表达式:指定哪些包中类,要使用事务
            id:切入点表达式的名称,唯一值
            expression:切入点表达式,指定哪些类要使用事务,aspectj会创建代理对象

-->
        <aop:pointcut id="servicePt" expression="execution(* *..service..*.*(..))"/>
        <!--    配置增强器:关联advice和pointcut
                advice-ref:通知,上面tx:advice那里的配置
                pointcut-ref:切入点表达式的id
        -->
        <aop:advisor advice-ref="myAdvice" pointcut-ref="servicePt"/>
    </aop:config>

运行结果与上篇一致。

相关标签: java spring aop