全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

发现问题:

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

总结

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


# spring  # autowired注入  # autowired  # 注入失败  # 无法注入  # Spring依赖注入中的@Resource与@Autowired详解  # SpringBoot使用@Autowired为多实现的接口注入依赖  # 关于Spring的@Autowired依赖注入常见错误的总结  # Spring使用@Autowired为抽象父类注入依赖代码实例  # 详解Spring依赖注入:@Autowired  # @Resource和@Inject区别与实现原理  # spring中@Autowired自动注入依赖项的使用  # 自己的  # 都有  # 不太  # 修饰符  # 其他的  # 可以直接  # 找了  # 这种情况  # 任何一个  # 这篇文章  # 谢谢大家  # 中就  # 进行了  # 能拿到  # 网上  # 有疑问  # java  # brush  # pre  # class 


相关文章: 西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  公众号网站制作网页,微信公众号怎么制作?  如何快速生成凡客建站的专业级图册?  如何在阿里云通过域名搭建网站?  装修招标网站设计制作流程,装修招标流程?  如何用PHP快速搭建CMS系统?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  Thinkphp 中 distinct 的用法解析  完全自定义免费建站平台:主题模板在线生成一站式服务  建站之星×万网:智能建站系统+自助建站平台一键生成  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何在宝塔面板中创建新站点?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  建站之星北京办公室:智能建站系统与小程序生成方案解析    做企业网站制作流程,企业网站制作基本流程有哪些?  javascript中的try catch异常捕获机制用法分析  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  ,南京靠谱的征婚网站?  如何高效完成独享虚拟主机建站?  独立制作一个网站多少钱,建立网站需要花多少钱?  ,网页ppt怎么弄成自己的ppt?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何快速生成高效建站系统源代码?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  测试制作网站有哪些,测试性取向的权威测试或者网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站主机SSH密钥生成步骤及常见问题解答?  如何在建站之星网店版论坛获取技术支持?  如何选择适配移动端的WAP自助建站平台?  建站之星安装后如何自定义网站颜色与字体?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  如何通过虚拟主机快速完成网站搭建?  python的本地网站制作,如何创建本地站点?  如何将凡科建站内容保存为本地文件?  如何生成腾讯云建站专用兑换码?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何在景安云服务器上绑定域名并配置虚拟主机?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  详解jQuery停止动画——stop()方法的使用  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  建站主机与服务器功能差异如何区分?  成都网站制作报价公司,成都工业用气开户费用?  如何挑选优质建站一级代理提升网站排名?  制作网页的网站有哪些,电脑上怎么做网页?  宝塔Windows建站如何避免显示默认IIS页面?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  网站企业制作流程,用什么语言做企业网站比较好? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。