返回顶部
首页 > 资讯 > 后端开发 > Python >为什么Spring和IDEA都不推荐使用@Autowired注解
  • 792
分享到

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

2024-04-02 19:04:59 792人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言spring为什么不推荐使用@Autowired 注解背景原因解决思考@Autowired, @Qualifier, @Resource, 三者有何区别参考文档前言 请看下面

前言

请看下面几个问题

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

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

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

背景

开发的同学可能都会发现, idea 在我们经常使用的@Autowired 注解上添加了警告
警告内容是: Field injection is not recommended, 译为: 不推荐使用属性注入

在这里插入图片描述

我们点击右侧三个小点查看描述, 可以看到信息如下图

在这里插入图片描述

原因详情描述: 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 方法注入

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

属性注入
可以看到, 我们开发最常用的就是属性注入

@RestController
public class AppointmentNumberConfigurationController {

    @Autowired
    private AppointmentNumberConfigurationService numberConfigurationService;
}

set 方法注入
set 方法注入也会用到@Autowired注解,但使用方式与属性注入有所不同,
属性注入是用在成员变量上,而set 方法的时候,是用在成员变量的Setter函数上。

@RestController
public class AppointmentNumberConfigurationController {


    private AppointmentNumberConfigurationService numberConfigurationService;

    @Autowired
    public void setNumberConfigurationService(AppointmentNumberConfigurationService numberConfigurationService) {
        this.numberConfigurationService = numberConfigurationService;
}

构造方法注入
Constructor Injection是构造器注入,是我们最为推荐的一种使用方式。
但是, 每次注入都按照这样的流程去构造注入的话, 会显得比较麻烦.
至于如何去简化这一步骤, 我们可以继续往下看.

@RestController
public class AppointmentNumberConfigurationController {

    final AppointmentNumberConfigurationService numberConfigurationService;
    
    public AppointmentNumberConfigurationController(AppointmentNumberConfigurationService numberConfigurationService) {
        this.numberConfigurationService = numberConfigurationService;
    }
    }

三种方式对比如下

在这里插入图片描述

使用属性注入可能会出现的问题

基于属性注入的方式, 违背单一职责原则
因为现在的业务一般都会使用很多依赖, 但拥有太多的依赖通常意味着承担更多的责任,而这显然违背了单一职责原则.
并且类和依赖容器强耦合,不能在容器外使用。
基于属性注入的方式, 容易导致Spring 初始化失败
因为现在在Spring特别是Spring Boot使用中, 经常会因为初始化的时候, 由于属性在被注入前就引用而导致npe(空指针错误),
进而导致容器初始化失败(类似下面代码块). Java 在初始化一个类时,
是按照 静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> @Autowired 的顺序。
所以在执行这个类的构造方法时,person 对象尚未被注入,它的值还是 null。
通过@Autowired 注入, 又因为是 ByType 注入, 因此有可能会出现两个相同的类型bean
如下代码快, 就会产生两个相同的Bean, 进而导致Spring 装配失败
//2. 基于属性注入的方式, 容易导致Spring 初始化失败
@Autowired
private Person person;

private String company;

public UserServiceImpl(){
    this.company = person.getCompany();
}


//3. 通过@Autowired 注入, 又因为是 ByType 注入, 因此有可能会出现两个相同的类型bean
public interface IUser {
    void say();
}

@Service
public class User1 implements IUser{
    @Override
    public void say() {
    }
}

@Service
public class User2 implements IUser{
    @Override
    public void say() {
    }
}

@Service
public class UserService {

    @Autowired
    private IUser user;
} 

解决

如果一定要使用属性注入, 可以使用 @Resource 代替 @Autowired 注解
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
如果我们想使用按照名称byName来装配,可以结合@Qualifier注解一起使用。

如果可能的话, 尽量使用构造注入
Lombok提供了一个注解@RequiredArgsConstructor, 可以方便我们快速进行构造注入, 例如:

@RestController
@RequiredArgsConstructor
public class AppointmentNumberConfigurationController {
    
    final AppointmentNumberConfigurationService numberConfigurationService;
    }

同时需要注意:

使用@RequiredArgsConstructor注解需要导入Lombok 包 或者安装lombok 插件

  <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.16</version>
  </dependency>

必须声明的变量为final

根据构造器注入的,相当于当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,
其中每个参数代表一个对其他类的依赖。基于构造方法为属性赋值,容器通过调用类的构造方法将其进行依赖注入

思考

为什么推荐使用@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的区别是什么?

到此这篇关于为什么Spring和IDEA都不推荐使用 @Autowired 注解的文章就介绍到这了,更多相关Spring IDEA @Autowired 注解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 为什么Spring和IDEA都不推荐使用@Autowired注解

本文链接: https://lsjlt.com/news/144930.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 为什么Spring和IDEA都不推荐使用@Autowired注解
    目录前言Spring为什么不推荐使用@Autowired 注解背景原因解决思考@Autowired, @Qualifier, @Resource, 三者有何区别参考文档前言 请看下面...
    99+
    2024-04-02
  • Spring和IDEA为什么都不推荐使用@Autowired注解
    今天小编给大家分享一下Spring和IDEA为什么都不推荐使用@Autowired注解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • Spring为什么不推荐使用@Autowired注解详析
    目录引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议使用@Resource代替@...
    99+
    2024-04-02
  • 解析Idea为什么不推荐使用@Autowired进行Field注入
    目录Spring常见的DI方式@Autowired VS @Resource各种DI方式的优缺点Field注入的缺点为什么IDEA只对@Autowired警告大家在使用IDEA开发的...
    99+
    2024-04-02
  • 为什么不推荐使用C++
    这篇文章主要讲解了“为什么不推荐使用C++”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不推荐使用C++”吧!(1) C++语法很复杂,好的C++程序员难求。语法上 C++14 开始的...
    99+
    2023-06-16
  • 为什么java不推荐使用vector
    从网上各处搜集的知识整理出来1.因为vector是线程安全的,所以效率低,这容易理解,类似StringBuffer2.Vector空间满了之后,扩容是一倍,而ArrayList仅仅是一半3.Vector分配内存的时候需要连续的存储空间,如果...
    99+
    2023-06-03
  • react为什么不推荐使用index作为key
    1.旧的虚拟dom和新的虚拟dom对比,首先看他们的key是否相同 2.相同继续对比他们的内容,不同生成新的真实dom进行替换 3.如果内容和key都相同,复用旧的真实dom 不做改...
    99+
    2024-04-02
  • Spring中Transactional注解使用的心得(推荐)
    事务特性 @Transactional注解是用于事务控制的,需要知道事务的ACID特征:即原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Is...
    99+
    2022-11-13
    Spring Transactional注解 Spring Transactional使用
  • 如何在Spring中使用@Override和@Autowired注解
    如何在Spring中使用@Override和@Autowired注解?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、Override首先,@Override 注解是伪代码...
    99+
    2023-06-15
  • 浅谈为什么MySQL不推荐使用子查询和join
    做分页查询: 对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据。 2.子查询就更别用...
    99+
    2022-05-29
    MySQL 子查询和join MySQL 子查询 MySQL join
  • Spring中@Autowired、@Resource和@Inject注解的区别是什么
    这篇文章主要介绍了Spring中@Autowired、@Resource和@Inject注解的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中@Autowired、@Resource和@I...
    99+
    2023-07-05
  • Vue中为什么不推荐用index做key详解
    目录前言diff算法key的作用通过 key 管理状态效率 & Bug总结前言 尤大在vue 2.x的文档中明确指出:建议尽可能在使用 v-for 时提供...
    99+
    2024-04-02
  • 使用Autowired为什么会被IDEA警告最佳修改方法
    目录问题原因其他使用方式总结问题原因 关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序:父类的静态字段 > 父类...
    99+
    2023-02-17
    Autowired IDEA警告 Autowired IDEA
  • Vue 中为什么不推荐用index 做 key属性值
    目录前言key 的作用key 在 diff 算法中的角色同步头部节点同步尾部节点添加新的节点删除多余节点最长递增子序列为什么不要用 index性能消耗数据错位解决方案总结前言 前端开...
    99+
    2024-04-02
  • 为什么无法在IDEA中使用Spring-boot-devTools
    本篇文章为大家展示了为什么无法在IDEA中使用Spring-boot-devTools,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。相信大部分使用Intellij的同学都会遇到这个问题,即使项目使用...
    99+
    2023-05-31
    idea spring-boot-devtools
  • 深入分析mysql为什么不推荐使用uuid或者雪花id作为主键
    前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,...
    99+
    2022-05-25
    mysql uuid 主键 mysql 雪花id主键
  • 游戏行业为什么推荐使用高防服务器
    游戏行业推荐使用高防服务器的原因有:1.攻击频繁,高防服务器可以抵御恶意的DDoS和CC攻击;2.缺乏服务能力,高防服务器稳定性好,可以应付大流量攻击;3.竞争激烈,高防服务器可以提供安全的网络运行环境,避免黑客入侵;具体分析如下:攻击频繁...
    99+
    2024-04-02
  • MySql主键id不推荐使用UUID的原因是什么
    本文小编为大家详细介绍“MySql主键id不推荐使用UUID的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql主键id不推荐使用UUID的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • Spring @Bean注解的使用场景是什么
    本篇内容介绍了“Spring @Bean注解的使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍翻看Spri...
    99+
    2023-07-05
  • Google和Facebook中为什么不使用Docker
    这期内容当中小编将会给大家带来有关Google和Facebook中为什么不使用Docker,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Google 和 Facebook 都使用 monolithic r...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作