当前位置: 首页 > 知识库问答 >
问题:

围绕+@transactional定制Spring AOP

楮乐邦
2023-03-14

我有一个自定义的周围实现,以匹配自定义注释。我希望自定义around在外部@transactional中执行。不幸的是,这似乎不起作用。(AOP正在工作。我看到stacktraces显示了它)。

堆栈跟踪显示我的AOP在(记录器)之前执行,MyBatis会话启动事务,MyBatis关闭事务,Spring关闭事务,然后我的AOP完成。

我认为订购我的AOP实现会有所帮助。我将返回的值设置为1。我用过。这没用。我想是因为我误读了Spring的命令。

我做错了什么?

共有1个答案

慕鹏
2023-03-14

如果order属性没有为@Transactional注释配置,那么负责事务属性-AbstractPointcutAdvisor(实际上是它的子类之一)的顾问将返回ordered.lowest_prehence,它被定义为integer.max_value。

负责自定义AOP建议(同一个AbstractPointcutAdvisor的子类)的Advisor将查看实际的建议是否实现了有序接口,如果实现了,则在排序期间将使用提供的值。如果自定义AOP建议没有实现Ordered接口,Advisor返回相同的默认Ordered.lowest_prehence,排序结果变得有点不可预测。

因此,为@Transactional注释配置order属性,如下所示

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.1.xsd>
           .......

           <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="[Order for @Transactional]">
<beans/>    
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import org.springframework.core.Ordered;

@Aspect
public class CustomAspect implements Ordered {

    @Around(value = "@annotation(CustomAnnotation)")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
    ... 
    }
    ....

    @Override
    public int getOrder() { 
        return [Order for @CustomAnnotation];
    }

    ....

}

然后,您可能在整个html" target="_blank">应用程序中拥有所有的排序自由(但静态地)。

实际上,是AspectJAwareAdvisorAutoProxyCreator在代理初始化时使用比较器org.springframework.aop.aspectJ.autoProxy.AspectJEXCENCEComparator对顾问进行排序,后者将排序委托给OrderComparator。稍后,在实际执行时,AopProxy的具体实现为特定方法保留了一个Advisies数组,它称之为拦截器,我想这可能用于动态重新排序,但在我看来,这些东西都不容易访问和/或配置。

我的环境是Spring Beans、TX、AOP-All Version4.0.3。我还有两个自定义事务管理器,一个是Hibernate绑定的,一个是JDBC DataSource绑定的,但我认为这并不重要

 类似资料:
  • 嗨,我正在尝试实现一个带有旋转的opengl程序 以下代码仅供参考:

  • 我现在正在写一个小游戏,我遇到了一个问题。我需要在一个大圆的边界上画64个小圆。所以我想要这样的东西: 我已经试过很多方法,但都不管用。如何在java中使用java实现这一点。awt。组件#paint()方法和java。awt。图形课? 谢谢

  • 当我尝试使用旋转图像视图时,我现在开始学习JavaFX 它绕着它的中轴线旋转,但是当我尝试使用 它随机旋转,我不知道它的旋转轴是一样的

  • 问题内容: 有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为… 我的结果是这样的: 如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变

  • 我在下面有一个类,我将其附加到一个对象上,以使其围绕其轴旋转。我把雪碧的枢轴通过检查员送来了。 这正是我想要的效果,但是我遇到的问题是,每当我触摸并拖动它,然后再次触摸并拖动它,它就会捕捉到一个新的位置。 我想让它做的是,当它旋转,然后再次旋转时,精灵保持其相同的旋转,而不是捕捉到一个新的位置,我想精灵的角度重置为0。接下来,我想让角度持续旋转。所以如果我朝正方向旋转,角度应该在正方向上不断增加,

  • 我正在使用OpenCV和Python在图像中查找圆。我能够使用OpenCV教程中的Hough圆变换代码找到圆。我想在圆心周围裁剪一个矩形。我没有能够得到正确的裁剪功能,并尝试了多种裁剪组合,要么得到了一个错误或图像的不正确部分。有人能说明我应该如何输入裁剪坐标吗?这就是我一直遇到的错误: 错误:(-215)大小。宽度 谢谢!