Controller @Autowired注解 注入值突然为null的问题

记录一个不易被发现的代码问题:原本一个运行正常的项目 , 最近出现一个奇怪的问题 。 在某个Controller的方法中 , 使用的某些@autowired注入的bean值变成了null 。诡异的是 , 同样的bean在其他Controller中 , 甚至在当前Controller的其他方法中 , 都一切如常。

经过问题排查,分析原因,发现这些方法在某次feature后加入了aop切面做日志分析,于是查看相关修改涉及到的出现类似问题的方法修饰符,都是private修饰的方法 。

解释一下原因:

Spring的aop机制使用的是jdk自身的动态代理机制或者cglib的代理机制实现,分别基于接口和子类继承机制实现。

再具体到 spring aop部分的源码

Method[] methods = clazz.getMethods();
用JAVA反射的方式获取也只能拿到public/protected方法,所以private方法无法被代理 , 最终导致bean注入失败。

综上,这其实是个很简单的问题,但是在旧项目改造这类场景中会出现而且不容易发现的问题,开发人员往往执念于未对原方法逻辑有任何改动而忽略掉。使用新加入的切面要确认目标方法的修饰符不为private

 

posted @ 2019-08-01 09:39  leon.sang  阅读(2256)  评论(1编辑  收藏  举报