spring aop事务与自定义pointcut冲突,不生效

轩霄SS 发布于 2017/03/01 12:16
阅读 884
收藏 0

这是配置

 

<!-- 事务管理器配置, Jpa单数据源事务 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <!-- 配置AOP,Spring是通过AOP来进行事务管理的 -->
    <aop:config>
        <!-- 设置pointCut表示哪些方法要加入事务处理 -->
        <!-- 以下的事务是声明在DAO中,但是通常都会在Service来处理多个业务对象逻辑的关系,注入删除,更新等,此时如果在执行了一个步骤之后抛出异常
            就会导致数据不完整,所以事务不应该在DAO层处理,而应该在service,这也就是Spring所提供的一个非常方便的工具,声明式事务 -->
        <aop:pointcut id="allMethods"
            expression="execution(* com.hsae..service..*.*(..))" />
        <!-- 通过advisor来确定具体要加入事务控制的方法 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="allMethods" />
    </aop:config>
    <!-- 配置哪些方法要加入事务控制 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 把一些查询之类的方法设置为只读的事务 -->
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="query*" propagation="REQUIRED" read-only="true" />
            <tx:method name="select*" propagation="REQUIRED" read-only="true" />

            <!-- 以下方法都是可能涉及修改的方法,就无法设置为只读 -->
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="generate*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />

            <!-- 让所有的方法都加入事务管理,为了提高效率,可以把一些查询之类的方法设置为只读的事务 -->
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"
        order="3" />

    <!-- 配置日志AOP -->
    <bean id="loginLogAspect" class="com.hsae.component.log.aspect.LoginLogAspect" />
    <bean id="operationLogAspect" class="com.hsae.component.log.aspect.OperationLogAspect" />
    <aop:config>
        <aop:pointcut
            expression="execution(* com.hsae.component.controller.LoginController.login(java.lang.String,java.lang.String,org.springframework.ui.ModelMap))"
            id="loginPoincut" />
        <aop:pointcut
            expression="@annotation(com.hsae.component.log.annotation.LogOperation)"
            id="operationLogPoincut" />
        <aop:aspect ref="loginLogAspect" order="1">
            <aop:around method="logAround" pointcut-ref="loginPoincut" />
            <aop:after-throwing method="logAfterThrowable"
                throwing="e" pointcut-ref="loginPoincut" />
        </aop:aspect>
        <aop:aspect ref="operationLogAspect" order="2">
            <aop:around method="logAround" pointcut-ref="operationLogPoincut" />
            <aop:after-throwing method="logAfterThrowable"
                throwing="e" pointcut-ref="operationLogPoincut" />
        </aop:aspect>
    </aop:config>

 

加载中
返回顶部
顶部