• Java -- Spring学习笔记8、AspectJ的AOP配置管理事务


    1、AspectJ的AOP配置管理事务

    在大型项目中、可以使用AspectJ的AOP配置管理事务。在配置文件中声明类、方法需要的事务。业务和事务配置完全分离。

    • 需要四个步骤、如下:

      • 添加依赖
      • 声明事务管理器对象
      • 声明方法需要的事务类型
      • 配置aop、指定哪些类需要创建代理

    1.1、添加依赖

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

    1.2、声明事务管理器对象

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="myDataSource"/>
    </bean>
    

    1.3、声明方法需要的事务类型

    <!--
            声明业务方法它的属性、也就是隔离级别、传播行为、超时时间
            id:自定义名称
            transaction-manager:事务管理器对象的id
        -->
        <tx:advice id="myAdvice" transaction-manager="transactionManager">
            <!--
                tx:attributes:配置事务属性
            -->
            <tx:attributes>
                <!--
                  tx:method:给具体的方法配置事务属性、可以有多个、分别给不同的方法配置属性
                  name:方法名称、不要带包名。也可以使用通配符 * 表示任意字符
                  propagation:传播行为
                  isolation:隔离级别
                  rollback-for:指定的异常类名、全限定类名。发生异常先和这里边的进行比对
                  如果发生的异常类型是这里边的,就回滚,如果不是、而是运行时异常、也会回滚
                -->
                <tx:method name="buy" propagation="REQUIRED" isolation="DEFAULT"
                           rollback-for="java.lang.NullPointerException,com.rg.error.NotEnoughException"/>
                <!--
                    这里就给一个buy方法添加了事务、而在项目中方法会有多个,所以就可以使用通配符
                    使用通配符、接口中的方法命名要有规则
                    比如:addUser、addSales、addGoods....
                         removeUser、removeSales、removeGoods....
                         modifyUser、modifySales、modifyGoods....
                         selectUser、selectGoods、selectName....
                -->
                <!--添加-->
                <tx:method name="add*" propagation="REQUIRES_NEW"/>
                <!--删除-->
                <tx:method name="remove*"/>
                <!--修改-->
                <tx:method name="modify*"/>
                <!-- * 就是以上方法以外的、如:query、find、select等等-->
                <tx:method name="*" read-only="true" propagation="SUPPORTS"/>
                <!--
                    从上往下、依次匹配
                -->
            </tx:attributes>
    </tx:advice>
    

    1.4、配置aop、指定哪些类需要创建代理

    <!--
            上边配置中、method的值只是方法名、但是一个项目中不同的包下可能有好多方法名称一样
            比如在上边配置中、首先指定的buy方法、那么service包下、dao包下都可能有buy方法
            所以、还需要配置切入点表达式、指定哪些类需要事务
        -->
        <aop:config>
            <!--
                id:切入点表达式的名称、唯一值
                expression:切入点表达式、指定哪些类需要事务、aspectJ会创建代理对象
            -->
            <aop:pointcut id="serviceCut" expression="execution(* *..service..*.*(..))"/>
    
            <!--
                配置器增强、关联advice和pointcut
                advice-ref:通知、上边tx:advice中的配置
                pointcut-ref:切入点表达式的id
    
                概括来讲、如果切入点表达式里的方法和通知里配置的一样、那么就会有事务的属性了
                aspectJ会创建对应的代理对象
            -->
            <aop:advisor advice-ref="myAdvice" pointcut-ref="serviceCut"/>
    </aop:config>
    

    这样、service包下或者子包下左右的buy方法都有了事务属性。业务中如果出现异常、一定回滚。

  • 相关阅读:
    使用ar_receipt_api_pub.apply失误
    部门组织架构和岗位变更
    值集不能修改的原因
    ShopEx安装过程
    javascript二分法
    增加TableSpace
    刚毕业的大学生,你到底为什么被解雇掉了?(转)
    oracle EBS关闭窗口出现红条(进度/进展)
    分享一个jQuery的时间轴插件:TimergliderJS
    分享另外一个jQuery的超酷幻灯插件:jQuery Chop Slider 2.0
  • 原文地址:https://www.cnblogs.com/dcy521/p/14772336.html
Copyright © 2020-2023  润新知