spring aop 代理private方法 报错的问题分析

在尝试使用Spring AOP进行private方法的日志切面处理时,遇到空指针异常。问题源于private和final方法不会被代理,因此在proxy对象上调用这些方法时,由于proxy对象未持有Spring注入的对象,导致空指针。解决方案通常涉及调整切入点或使用其他日志记录手段。
摘要由CSDN通过智能技术生成

spring aop 代理private方法报空指针的问题

这两天做aop切面日志时,发现private方法报空指针。
原切入点配置如下:

    @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
    public void logPoint(){

    };

当某个Controller类中含有private方法,并且该类有需要spring注入的对象时,且在该私有方法有中使用spring注入的对象时会报空指针。
那么为什么会报空指针了。咱们看一下动态代理的过程,这里使用的是cglib代理。

  Enhancer enhancer = new Enhancer();
        enhancer.setCallback(new MyInteceptor());
        enhancer.setSuperclass(A1.class);
        A1 proxy = (A1)enhancer.create();

上面是一个创建cglib代理的类。
这里有一点要记住,private和final修饰的方法,不会被代理。也就是说private和final的方法不会进入callBack。如果进入不了callBack,那么就进入不了被代理的目标对象。那么只能在proxy对象上执行private或final修饰的方法。而proxy对象是由cglib实例化的,里面没有spring注入的对象。因些报空指针。

看个示例:
这是一个A1类,里面有一个say1的私有方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值