因Spring AOP导致@Autowired依赖注入失败的解决方法
程序员文章站
2023-11-21 09:02:34
发现问题:
之前用springaop做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己...
发现问题:
之前用springaop做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己的情况不太符合。后来总结自己的情况发现:方法为private修饰的,在aop适配的时候会导致service注入失败,并且同一个service在其他的public方法中就没有这种情况,十分诡异。
解决过程:
结合查阅的资料进行了分析:在org.springframework.aop.support.aoputils中:
public static boolean canapply(pointcut pc, class targetclass, boolean hasintroductions) { if (!pc.getclassfilter().matches(targetclass)) { return false; } methodmatcher methodmatcher = pc.getmethodmatcher(); introductionawaremethodmatcher introductionawaremethodmatcher = null; if (methodmatcher instanceof introductionawaremethodmatcher) { introductionawaremethodmatcher = (introductionawaremethodmatcher) methodmatcher; } set classes = new hashset(classutils.getallinterfacesforclassasset(targetclass)); classes.add(targetclass); for (iterator it = classes.iterator(); it.hasnext();) { class clazz = (class) it.next(); method[] methods = clazz.getmethods(); for (int j = 0; j < methods.length; j++) { if ((introductionawaremethodmatcher != null && introductionawaremethodmatcher.matches(methods[j], targetclass, hasintroductions)) || methodmatcher.matches(methods[j], targetclass)) { return true; } } } return false; }
此处method[] methods = clazz.getmethods();
只能拿到public方法。
execution(* *(..))
可以匹配public/protected的,因为public的有匹配的了,目标类就代理了,,,再进行切入点匹配时也是能匹配的,而且cglib方式能拿到包级别/protected方法,而且包级别/protected方法可以直接通过反射调用。
private 修饰符的切入点 无法匹配 method[] methods = clazz.getmethods();
这里的任何一个,因此无法代理的。 所以可能因为private方法无法被代理,导致@autowired不能被注入。
修正办法:
1、将方法修饰符改为public;
2、使用aspectj来进行注入。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
上一篇: C#中各种计时器用法小结