Java 类内部方法调用会使 AOP 环绕逻辑后于业务代码执行

一,问题描述

其中AOP切面是环绕通知,
但是调用A方法时,代码会先执行B方法,再执行AOP切面

    class AB {
        public void A() {
            B();
        }

        @AOP
        public void B() { //业务逻辑 
        }
    }

二,原因解释

AOP 的工作原理

在 Spring AOP 中,切面(如环绕通知)是通过动态代理实现的。Spring 会为被代理的对象创建一个代理对象,所有的外部调用都会经过这个代理对象,从而触发切面逻辑。然而,同一个类内部的方法调用不会经过代理对象。

当 A 方法调用 B 方法时,这是类内部的直接调用,不会经过 Spring 的代理对象,因此 AOP 切面逻辑不会生效。

三,解决方案

方法1:通过代理对象调用 B 方法

@Component
public class AB {

    @Autowired
    private AB self; // 注入自身代理对象

    public void A() {
        self.B(); // 通过代理对象调用 B 方法
    }

    @AOP
    public void B() {
        // 业务逻辑
    }
}

或者

@Component
public class AB {

    @Autowired
    private ApplicationContext;

    public void A() {
       this.applicationContext.getBean(AB.class).B(); // 通过代理对象调用 B 方法
    }

    @AOP
    public void B() {
        // 业务逻辑
    }
}

方法2:将 B 方法抽取到另一个类中

// 类 AB
@Component
public class AB {

    @Autowired
    private BC bc;

    public void A() {
        bc.B(); // 调用 BC 类中的 B 方法
    }
}

// 类 BC
@Component
public class BC {

    @AOP
    public void B() {
        // 业务逻辑
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值