springboot中service @Autowired突然为
2021-04-19 本文已影响0人
我爱福尔摩斯呀
最近SpringCloud项目中突然有个模块中的一个Controller中的 @Autowired Service突然变成null了,没有修改过相关的业务代码。想来想去这个问题是出在加了个AOP的日志记录模块之后才出现的。
仔细搜索了找到了答案。
这个问题是由于Controller中注入的Service或方法用的修饰符是private,而使用Spring AOP要确认目标方法的修饰符不为private
以下是转载的原理:原地址:https://www.cnblogs.com/bmwsl/p/11280613.html
Spring的aop机制使用的是jdk自身的动态代理机制或者cglib的代理机制实现,分别基于接口和子类继承机制实现。
再具体到 spring aop部分的源码
Method[] methods = clazz.getMethods();
用JAVA反射的方式获取也只能拿到public/protected方法,所以private方法无法被代理 , 最终导致bean注入失败。
综上,这其实是个很简单的问题,但是在编码不规范,或者旧项目改造这类场景中会出现而且不容易发现的问题,开发人员往往执念于未对原方法逻辑有任何改动而忽略掉。使用新加入的切面要确认目标方法的修饰符不为private。