首页 > 开发 > Java > 正文

因Spring AOP导致@Autowired依赖注入失败的解决方法

2024-07-13 10:09:44
字体:
来源:转载
供稿:网友

发现问题:

之前用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来进行注入。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对VeVb武林网的支持。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表