源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-06-21 07:52 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:因Spring AOP导致@Autowired依赖注入失败的解决方法
[b]发现问题:[/b] 之前用springAOP做了个操作日志记录,这次在往其他类上使用的时候,service一直注入失败,找了网上好多内容,发现大家都有类似的情况出现,但是又和自己的情况不太符合。后来总结自己的情况发现:方法为private修饰的,在AOP适配的时候会导致service注入失败,并且同一个service在其他的public方法中就没有这种情况,十分诡异。 [b]解决过程:[/b] 结合查阅的资料进行了分析:在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; 
}
此处[code]Method[] methods = clazz.getMethods();[/code]只能拿到public方法。 [code]execution(* *(..)) [/code]可以匹配public/protected的,因为public的有匹配的了,目标类就代理了,,,再进行切入点匹配时也是能匹配的,而且cglib方式能拿到包级别/protected方法,而且包级别/protected方法可以直接通过反射调用。  private 修饰符的切入点 无法匹配 [code]Method[] methods = clazz.getMethods(); [/code]这里的任何一个,因此无法代理的。 所以可能因为private方法无法被代理,导致@Autowired不能被注入。 [b]修正办法:[/b]      1、将方法修饰符改为public;      2、使用AspectJ来进行注入。 [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部