前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么 Spring和IDEA 都不推荐使用 @Autowired 注解

为什么 Spring和IDEA 都不推荐使用 @Autowired 注解

作者头像
时间静止不是简史
发布2022-04-02 08:17:20
1.5K0
发布2022-04-02 08:17:20
举报
文章被收录于专栏:Java探索之路Java探索之路

为什么都不推荐使用 @Autowired 注解


前言

请看下面几个问题

  1. Spring为什么不推荐使用@Autowired 注解?
  2. 为什么推荐使用@Resource 代替 @Autowired 注解?
  3. 如何快速使用构造注入代替 @Autowired ?
  4. @Autowired, @Qualifier, @Resource, 三者有何区别?

下面, 我们带着以上问题去梳理和学习, 体会知识之间的关联性


Spring为什么不推荐使用@Autowired 注解

背景

  1. 做开发的同学可能都会发现, idea 在我们经常使用的@Autowired 注解上添加了警告 警告内容是: Field injection is not recommended, 译为: 不推荐使用属性注入
在这里插入图片描述
在这里插入图片描述
  1. 我们点击右侧三个小点查看描述, 可以看到信息如下图
在这里插入图片描述
在这里插入图片描述

原因详情描述: Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies". 译为: Spring 团队建议: 始终在您的 bean 中使用基于构造函数的依赖注入。始终对强制依赖项使用断言

在这里插入图片描述
在这里插入图片描述

原因

为什么 Spring 建议我们在Bean中使用构造注入呢? 想要回答这个问题, 我们需要了解 Spring的依赖注入(DI)方式 Spring常用的注入方式有: 简单类型注入, 集合类型注入, 域属性自动注入, 自动注入的类别, 空值注入, 构造注入 可以简化为: 属性注入, 构造方法注入, set 方法注入

下面, 来用代码展示下三种方式注入

解决

思考

为什么推荐使用@Resource,不推荐使用@Autowired

  • 通过对问题1 的梳理, 我们可以知道. 因为@Autowired 注解在Bean 注入的时候是基于ByType, 因此会由于注入两个相同类型的Bean导致装配失败
  • @Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。 如果我们想使用按照名称byName来装配,可以结合@Qualifier注解一起使用。
  • @Resource装配顺序: ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。 ②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。 ③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。 ④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

因此, 如果一定要使用属性注入, 可以使用 @Resource 代替 @Autowired 注解

@Autowired, @Qualifier, @Resource, 三者有何区别

  • @Autowired: 通过byType 方式进行装配, 找不到或是找到多个,都会抛出异常。
  • @Qualifier: 如果想让@Autowired 注入的Bean进行 byName装配, 可以使用 @Qualifier 进行指定
  • @Resource :作用相当于@Autowired,只不过 @Resource 默认按照byName方式装配, 如果没有匹配, 则退回到 byType 方式进行装配

参考文档 为什么IDEA不推荐你使用@Autowired? @Autowired和@Resource的区别是什么?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么都不推荐使用 @Autowired 注解
  • 前言
  • Spring为什么不推荐使用@Autowired 注解
    • 背景
      • 原因
        • 解决
        • 思考
          • 为什么推荐使用@Resource,不推荐使用@Autowired
            • @Autowired, @Qualifier, @Resource, 三者有何区别
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档