前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >@AutoWired和@Resource的区别

@AutoWired和@Resource的区别

原创
作者头像
用户10143704
发布2024-04-23 20:06:52
1220
发布2024-04-23 20:06:52

@AutoWired和@Resource的区别

这两个我们在项目中,经常去使用。很少有人知道他们有什么区别。下面我们将从

  • 来源
  • 依赖查找顺序
  • 支持的参数
  • 依赖注入的用法支持

这四个方面来说明他们俩个的区别

来源

  • @Autowired: 这是Spring框架自带的注解,用于实现自动依赖注入。
  • @Resource: 这是Java EE 5的注解,由JSR-250规范定义,也被Spring框架支持,用于实现JNDI查找和自动装配。

依赖查找顺序

  • @Autowired: Spring容器在解析@Autowired注解时,首先会按照类型进行匹配,如果存在多个相同类型的Bean,则会进一步根据名称进行匹配。如果没有明确指定名称,Spring将抛出异常。

指定名字用的注解就是@Qualifier

  • @Resource: 默认的注入顺序是按照Bean的名称进行匹配,如果找不到,则会按照类型进行匹配。如果仍然找不到,将不会抛出异常,而是返回null

支持的参数

  • @Autowired: 支持多种参数,包括required(是否必须)和primary(是否首选)等。
  • @Resource: 支持name属性,可以通过它指定要注入的Bean的名称。也支持type属性。可以根据类型查找对应的bean。

依赖注入的用法支持

  • @Autowired: 支持属性注入、构造方法注入和Setter注入
  • @Resource: 只支持属性注入和Setter注入

额外补充

  • 覆盖性: @Autowired提供了更丰富的配置选项,如通过@Qualifier注解来指定注入的具体Bean。
  • 兼容性: @Autowired是Spring特有的,而@Resource是Java EE的一部分,因此@Resource在非Spring环境中也可能被使用。
  • 使用场景: @Autowired通常用于Spring管理的Bean之间的依赖关系,而@Resource可能用于那些同时需要兼容Java EE环境的场景。
  • 性能考虑: 在某些情况下,@Autowired可能需要更多的解析工作,特别是在没有明确指定Bean名称时,而@Resource则直接依赖于JNDI查找,可能在查找顺序上更直接。
  • 搜索范围
    • @Autowired在Spring的组件扫描中搜索Bean。
    • @Resource在JVM范围内搜索资源,不限于Spring容器。

为什么idea推荐我们使用@Resource

当我们用@autowired的时候会有这样的提示

代码语言:javascript
复制
@Autowired
private IFileService fileService;
image-20240423195603981
image-20240423195603981

他给出的原因是这样的

image-20240423195708218
image-20240423195708218

下面给出一点我的见解。

  • 使用@Resource可以提高代码的兼容性,特别是在需要与Java EE环境交互时。
  • @Autowired如果找不到匹配的Bean,会抛出一个异常,除非它使用了optional=true参数。
  • @Resource如果找不到匹配的资源,不会抛出异常,而是将变量设置为null

所以说我认为推荐使用@Resource而不是@Autowired的情况:

  • 兼容性:如果你的应用程序需要在Java EE环境中运行,或者需要与Java EE资源进行交互,使用@Resource可以提高代码的兼容性。
  • 默认行为:如果你更倾向于根据名称进行资源的自动装配,而不是类型,@Resource可能更符合你的需求。
  • 避免异常:如果你希望在找不到匹配的资源时不抛出异常,而是将变量设置为null@Resource提供了这样的行为。

不管是使用@autowired还是@resource 都是可以实现功能的,更多的还是看我们的编程习惯。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @AutoWired和@Resource的区别
    • 来源
      • 依赖查找顺序
        • 支持的参数
          • 依赖注入的用法支持
            • 额外补充
              • 为什么idea推荐我们使用@Resource
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档