Spring AOP失效的场景

Spring AOP其实是通过动态代理实现的,那么今天要聊的这个问题就是设想什么情况不能使用动态代理,这个问题其实跟Spring事务失效的场景差不多

内部类调用

首先就是类内部的调用,比如一些私有方法调用,内部类调用,以及同一个类中方法的自调用等。

例如以下方法都是因为在对象内部直接调用其他方法,就会用原始对象直接调用了,不会调用到代理对象,所以代理会失效。 

//1
public class MyService {
    public void doSomething() {
        doInternal(); // 自调用方法
    }

    public void doInternal() {
        System.out.println("方法一");
    }
}

//2
public class MyService {
    public void doSomething() {
        doInternal(); // 自调用私有方法
    }

    private void doInternal() {
        System.out.println("方法二");
    }
}


//3
public class OuterClass {
    private class InnerClass {
        public void doSomething() {
            System.out.println("方法三");
        }
    }

    public void invokeInnerClassMethod() {
        InnerClass innerClass = new InnerClass();
        innerClass.doSomething(); // 调用内部类方法
    }
}

还有一种方法,也无法被代理,那就是final方法,由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。

总结

使AOP失效的场景一共有五个

1、私有方法调用
2、静态方法调用
3、final方法调用
4、类内部自调用
5、内部类方法调用

AOP 可能会失效场景主要有以下几种: 1. 目标对象的方法没有被调用:如果目标对象的方法没有被调用,那么 AOP 就不会生效。这可能是因为代码中逻辑错误、调用了错误的方法或者缺少必要的配置等原因所致。 2. 目标对象的方法没有被代理:如果目标对象的方法没有被代理,那么 AOP 就不会生效。这可能是因为目标对象没有实现任何接口,而使用了 JDK 动态代理,或者没有使用 Spring 提供的代理工厂进行代理而直接使用了 new 关键字创建了目标对象等原因所致。 3. AOP 配置错误:如果 AOP 配置错误,那么 AOP 就不会生效。这可能是因为切点表达式写错、通知类型配置错误、切面顺序配置错误等原因所致。 4. 代理对象的作用域错误:如果代理对象的作用域错误,那么 AOP 就不会生效。例如,将代理对象的作用域配置为 prototype,那么每次从容器中获取代理对象时都会创建一个新的代理对象,这会导致 AOP 失效。 5. 代理对象的类型错误:如果代理对象的类型错误,那么 AOP 就不会生效。例如,将代理对象的类型配置为目标对象的类型而不是接口类型,这会导致使用 JDK 动态代理时 AOP 失效。 综上所述,AOP 可能会失效的原因主要包括目标对象的方法没有被调用、目标对象的方法没有被代理、AOP 配置错误、代理对象的作用域错误和代理对象的类型错误等。在使用 AOP 时应注意避免这些问题,并进行相应的排查和调试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值