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的私有方法