当前位置: 首页 > news >正文

今日踩坑之@Autowired与@Resource区别

案例说明

        今天算是体验到了这俩注解的区别了,真所谓不报错就记不住这两注解区别,其实之前本人也是知道这俩注解的区别的只是我们往往项目上用习惯了@Autowired就忘了,看来只有真正体会到报错才能记忆犹新o(╥﹏╥)o。

         说明一下本人的踩坑情况,原本系统已经有一个BaseServiceBCMS类了,并且要注入到spring容器,现在我要创建一个新的BaseServiceBCMS60类也要注入容器,需要把原来使用BaseServiceBCMS类的代码全改为使用新的BaseServiceBCMS60类,因为当前改的是以前的老项目,大部分用的是@Resource,所以本人也是根据原来的也用@Resource,也可能是老项目的原因好家伙给我一个摸不着头脑的报错。

    //原来注入的
    @Resource
    BaseServiceBCMS baseServiceBCMS;

本人改为下面,因为很多代码涉及用原来的baseServiceBCMS,我就把类型改为BaseServiceBCMS60 但是名字还是原来的,就能不用改关于baseServiceBCMS使用过的大量代码。

    //原bcms
    @Resource
    BaseServiceBCMS baseServiceBCMSOld;

    //新60服务器bcms
    @Resource
    BaseServiceBCMS60 baseServiceBCMS;

OK接下来这个报错真的...叫我去找问题??谁能想到是@Resource的问题。

09-Apr-2025 17:09:40.188 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件
09-Apr-2025 17:09:40.190 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/IDataFlowTomcat_war_exploded]启动失败
09-Apr-2025 17:09:40.223 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [IDataFlowTomcat_war_exploded] 注册了JDBC驱动程序 [com.alibaba.druid.proxy.DruidDriver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
09-Apr-2025 17:09:40.223 警告 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc Web应用程序 [IDataFlowTomcat_war_exploded] 注册了JDBC驱动程序 [com.mysql.cj.jdbc.Driver],但在Web应用程序停止时无法注销它。 为防止内存泄漏,JDBC驱动程序已被强制取消注册。
[2025-04-09 05:09:40,237] 工件 IDataFlowTomcat:war exploded: 部署工件时出错。请参阅服务器日志了解详细信息。
09-Apr-2025 17:09:41.434 信息 [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
    java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1435)
        at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1060)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:123)
        at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:90)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
 

本人一开始以为是数据库连接写错了,改了发现没用,然后又去看web.xml看了下监听器情况,发现没问题,最后通过代码一步步删除,才发现是 @Resource问题,可能是老项目报错不清楚的原因,真坑。最后又去温习了下@Autowired与@Resource区别,改成@Autowired成功运行。

@Autowired与@Resource区别

1.来源不同

注解所属规范
@Autowiredspring框架
@Resourcejava标准

   

2.注入方式不同

  @Autowired

    默认按照类型注入 (byType)

    如果存在相同类型的bean,需要使用@Qualifier指定对应名称   

@Autowired
@Qualifier("beanName") 
private BcmsService service;

@Resource

   默认按照名称注入(byName)

   如果未指定名称name,先按字段/方法名查找,然后按类型查找

    //原bcms
    @Resource
    BaseServiceBCMS baseServiceBCMSOld;

    //新60服务器bcms
    @Resource
    BaseServiceBCMS60 baseServiceBCMS;

        这里就是我错误的地方,因为baseServiceBCMS会先按名称查找,找到有BaseServiceBCMS 这个类但是我用的是BaseServiceBCMS60类型,导致报错。改为 @Autowired即可,因为@Autowired是先按类型查找或者改为@Resource(name="baseServiceBCMS60")指定name。

3.主要功能对比

特性@Autowired@Resource
是否必须注入依赖是(可通过required=false设置为非必须)是(不可设置)
是否支持构造器/方法注入仅支持字段/setter注入
是否支持集合注入是(注入所有匹配类型的bean)
是否支持使用@primary 是(优先使用@Primary标注的Bean)

相关文章:

  • 解锁ChatGPT-4o文生图潜力:精选提示词收集整理更新中
  • vLLM实战:单机多卡大模型推理部署指南
  • 天元证券|空仓一个月 这批新基金冲进去了!
  • Cadence学习笔记之---热风焊盘制作
  • 从ETL到ELT:大数据时代下两者的选型建议及优势
  • 指纹浏览器技术架构解析:高并发批量注册业务的工程化实践——基于分布式指纹引擎与防关联策略的深度实现
  • VSCode 常用快捷键
  • 【冗余的思想】蜕变测试(二)
  • 混合并行技术在医疗AI领域的应用分析(代码版)
  • 未来生态映像:杭州的科技自然协奏曲
  • Spark RDD相关概念
  • 巧记英语四级单词 Unit2-下【晓艳老师版】
  • 【前端笔记】CSS预处理语言 LESS
  • Mujoco xml模型
  • AI 提示词不会写?试试 PromptIDE
  • Linux管道 有名管道(FIFO)工作机制全解:从理论到实践
  • java导出postgis空间数据几何对象shapefile文件
  • Spark大数据分析与实战笔记(第四章 Spark SQL结构化数据文件处理-04)
  • Qt中的鼠标事件
  • React七案例中
  • 如何做高网站的浏览量/百度经验首页官网
  • 广告传媒公司的网站应该怎么做/seo排名查询工具
  • 如何在app上做网站/网站搜索优化
  • 搜索引擎收录入口/北京seo专员
  • 朔州市建设监理公司网站/seo优化网页
  • 番禺网站 建设信科网络/常见的搜索引擎有哪些?