java - 相同的类调用在 Spring AOP cglib 中无效

标签 java aop cglib

<分区>

假设我们有下面的类

@Service
class MyClass {

    public void testA() { 
        testB();
     }

    @Transactional
    public void testB() { ... }
}

现在,如果我们在测试中调用myClass.testA();,那么testB 上的@Transactional 将不会生效。我认为原因如下。

Cglib 将为 MyClass 创建一个代理 bean,如下所示:

Class Cglib$MyClass extends MyClass {

    @Override
    public void testB() {
        // ...do transactional things
        super.testB();
    }
}

现在我们调用 myClass.testA(),它将调用 MyClass.testB() 而不是 Cglib$MyClass.testB() .所以 @Transactional 是无效的。 (我说得对吗?)

我尝试为两种方法(即 testA()testB())添加 @Transactional。代理类应该是这样的。

Class Cglib$MyClass extends MyClass {

    @Override
    public void testA() {
        // ...do transactional things
        super.testA();
    }

    @Override
    public void testB() {
        // ...do transactional things
        super.testB();
    }
}

在这种情况下,虽然我们成功调用了Cglib$MyClass.testA(),它仍然会转到MyClass.testB()

所以我的结论是,同一个类中的两个方法相互调用会使aop注解无法生效,除非我们使用AopContext.currentProxy()

我上面的猜测是否正确?非常感谢您的建议!

最佳答案

这是一个众所周知的 documented (请搜索术语“自调用”)事实上,Spring AOP 由于其基于代理的性质,不会也不能捕获内部方法调用,如 this.someMethod(..).

所以正如您所说,您要么需要显式引用暴露的代理对象,要么从 Spring AOP 切换到完整的 AspectJ via load-time weaving .

关于java - 相同的类调用在 Spring AOP cglib 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42921388/

相关文章:

Java UDP 套接字回显字节

java - 切换主题

java - getLastNonConfigurationInstance 总是返回 null

java - Aspect 不适用于带有外部 jar 的 Spring Boot 应用程序

java - 如何拦截Java中的对象创建

java - 覆盖 cglib 代理上的 equals

java - struts2迭代器: avoiding code duplication

java - 如何配置aspectj忽略getter和setter

java - Spring AOP : Choosing advice seletively

Java Web 启动 : unsigned cglib