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

发布时间 - 2026-01-11 02:16:01    点击率:

发现问题:

之前用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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel storage目录权限问题_Laravel文件写入权限设置  企业网站制作这些问题要关注  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何在IIS中新建站点并配置端口与IP地址?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Swift中switch语句区间和元组模式匹配  如何在景安服务器上快速搭建个人网站?  Laravel怎么在Controller之外的地方验证数据  Python函数文档自动校验_规范解析【教程】  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何挑选高效建站主机与优质域名?  详解CentOS6.5 安装 MySQL5.1.71的方法  Swift中swift中的switch 语句  个人摄影网站制作流程,摄影爱好者都去什么网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  常州企业网站制作公司,全国继续教育网怎么登录?  实例解析Array和String方法  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  重庆市网站制作公司,重庆招聘网站哪个好?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何用西部建站助手快速创建专业网站?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  JavaScript模板引擎Template.js使用详解  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  做企业网站制作流程,企业网站制作基本流程有哪些?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  浅谈redis在项目中的应用  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何挑选最适合建站的高性能VPS主机?  手机网站制作与建设方案,手机网站如何建设?  如何确保FTP站点访问权限与数据传输安全?  Laravel怎么实现模型属性的自动加密  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  香港网站服务器数量如何影响SEO优化效果?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  iOS中将个别页面强制横屏其他页面竖屏  原生JS实现图片轮播切换效果  PythonWeb开发入门教程_Flask快速构建Web应用  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】