0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring常见的DI方式

倩倩 来源:juejin.cn 作者:juejin.cn 2022-09-07 11:01 次阅读


大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现如下警告

Field injection is not recommended (字段注入是不被推荐的)

但是使用@Resource却不会出现此提示

网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一下

Spring常见的DI方式

  • 构造器注入 :利用构造方法的参数注入依赖
  • Setter注入 :调用Setter的方法注入依赖
  • 字段注入 :在字段上使用@Autowired/Resource注解

@Autowired VS @Resource

事实上,他们的基本功能都是通过注解实现依赖注入 ,只不过@AutowiredSpring定义的,而@ResourceJSR-250定义的。大致功能基本相同,但是还有一些细节不同:

  • 依赖识别方式@Autowired默认是byType 可以使用@Qualifier指定Name,@Resource默认ByName 如果找不到则ByType
  • 适用对象@Autowired可以对构造器、方法、参数、字段 使用,@Resource只能对方法、字段 使用
  • 提供方@AutowiredSpring 提供的,@ResourceJSR-250 提供的

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

各种DI方式的优缺点

参考Spring官方文档,建议了如下的使用场景:

  • 构造器注入强依赖性 (即必须使用此依赖),不变性 (各依赖不会经常变动)
  • Setter注入可选 (没有此依赖也可以工作),可变 (依赖会经常变动)
  • Field注入 :大多数情况下尽量少使用 字段注入,一定要使用的话, @Resource相对@Autowired 对IoC容器的耦合更低

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

Field注入的缺点

  • 不能像构造器那样注入不可变的对象
  • 依赖对外部不可见 ,外界可以看到构造器和setter,但无法看到私有字段,自然无法了解所需依赖
  • 会导致组件与IoC容器紧耦合 (这是最重要的原因,离开了IoC容器去使用组件,在注入依赖时就会十分困难)
  • 导致单元测试也必须使用IoC容器 ,原因同上
  • 依赖过多时不够明显 ,比如我需要10个依赖,用构造器注入就会显得庞大,这时候应该考虑一下此组件是不是违反了单一职责原则

为什么IDEA只对@Autowired警告

Field注入虽然有很多缺点,但它的好处也不可忽略:那就是太方便了 。使用构造器或者setter注入需要写更多业务无关的代码,十分麻烦,而字段注入大幅简化了它们。并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是一件理想上的事,牺牲了敏捷度去过度追求松耦合反而得不偿失。

那么问题来了,为什么IDEA只对@Autowired警告,却对@Resource视而不见呢?

个人认为 ,就像我们前面提到过的:@AutowiredSpring 提供的,它是特定IoC提供的特定注解 ,这就导致了应用与框架的强绑定 ,一旦换用了其他的IoC框架,是不能够支持注入 的。

@ResourceJSR-250 提供的,它是Java标准 ,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    499

    浏览量

    22092
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14368

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

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SSM开发中的常见问题及解决方案

    在SSM(Spring + Spring MVC + MyBatis)框架的开发过程中,开发者可能会遇到一些常见问题。以下是对这些问题的详细分析以及相应的解决方案: 一、配置文件问题 问题描述
    的头像 发表于 12-17 09:16 522次阅读

    Spring 应用合并之路(二):峰回路转,柳暗花明

    作者:京东科技 李君 书接上文,前面在 Spring 应用合并之路(一):摸石头过河 介绍了几种不成功的经验,下面继续折腾… 四、仓库合并,独立容器 在经历了上面的尝试,在同事为啥不搞两个独立的容器
    的头像 发表于 12-12 11:22 798次阅读

    示波器接口和连接方式 示波器的常见故障及解决方法

    示波器接口和连接方式 示波器是一种用于观察和分析电信号波形的电子测量仪器。它通过接口和连接方式与被测设备相连,以获取信号并显示在屏幕上。以下是一些常见的示波器接口和连接方式: 1. B
    的头像 发表于 11-28 09:38 968次阅读

    常见人体姿态评估显示方式的两种方式

    人体姿态评估中有两种常见的显示方式,分别是火柴人效果与BodyPix效果。其中火柴人效果本质就是基于关键点的深度学习模型推理以后的显示效果;Bodypix本质就就是语义分割模型
    的头像 发表于 11-11 11:21 272次阅读
    <b class='flag-5'>常见</b>人体姿态评估显示<b class='flag-5'>方式</b>的两种<b class='flag-5'>方式</b>

    Spring事务实现原理

    这些操作。 spring事务有编程式事务和声明式事务两种实现方式。编程式事务是通过编写代码来管理事务的提交、回滚、以及事务的边界。这意味着开发者需要在代码中显式地调用事务的开始、提交和回滚。声明式事务是通过配置来管理事务,您可以使用注解或XML配置来
    的头像 发表于 11-08 10:10 856次阅读
    <b class='flag-5'>Spring</b>事务实现原理

    Spring Cloud Gateway网关框架

    Spring Cloud Gateway网关框架 本软件微服务架构中采用Spring Cloud Gateway网关控制框架,Spring Cloud Gateway是Spring C
    的头像 发表于 08-22 09:58 525次阅读
    <b class='flag-5'>Spring</b> Cloud Gateway网关框架

    嵌入式QT常见开发方式有哪些?

    嵌入式QT常见开发方式有哪些? 嵌入式工程师在学习和使用Qt进行开发时,常见的几种开发方式包括: 1.Qt Widgets编程: 通过C++代码直接编写GUI应用程序,利用QtWi
    发表于 08-12 10:05

    多级放大电路常见的耦合方式有哪些

    多级放大电路是电子电路中常见的一种电路结构,它由多个放大器级联而成,以实现对信号的多级放大。耦合方式是多级放大电路中的关键技术之一,它决定了信号在各个放大器之间如何传递。本文将介绍多级放大电路常见
    的头像 发表于 08-07 10:10 1026次阅读

    常见的传感器接线方式有哪些

    信息的传输、处理、存储、显示、记录和控制等要求。常见的传感器接线方式主要包括两线制、三线制和四线制,每种方式都有其特定的应用场景和接线规则。
    的头像 发表于 07-30 11:50 1608次阅读

    玩转Spring状态机

    说起Spring状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring状态机就是状态模式的一种实现,在介绍Spring状态机之前,让我们来看看设计模式中的状态模式
    的头像 发表于 06-25 14:21 999次阅读
    玩转<b class='flag-5'>Spring</b>状态机

    PCBA加工中常见的两种焊接方式详解

    一站式PCBA智造厂家今天为大家讲讲PCBA加工手工焊接有哪几种方式?PCBA加工过程中常用焊接方式。在PCBA(印刷电路板组装)加工过程中,焊接是一个关键的步骤。而手工焊接作为一种常见的焊接
    的头像 发表于 06-14 09:18 601次阅读

    感应电机的常见启动方式

    感应电机,作为现代工业领域中广泛应用的电力驱动设备,其启动方式的选择直接影响到电机的运行性能、使用寿命以及整个系统的稳定性和效率。因此,了解和掌握感应电机的常见启动方式对于工程师和技术人员来说
    的头像 发表于 06-05 15:19 1305次阅读

    综合网线常见接线方式和步骤

    综合网线的接线方式主要根据具体的应用场景和网络设备类型来确定。以下是一些常见的接线方式和步骤: 直通网线接线: 直通网线是最常见的网线类型,用于连接不同类型的设备,如PC到交换机或路由
    的头像 发表于 05-10 10:52 1073次阅读

    钡铼技术BL192 EtherCAT支持8路DI模块NPN输入

    BL190是一款钡铼技术IOy系列高度灵活的Modbus TCP远程IO系统,专为工业自动化设计。用户可以根据自己的需求自由组合1-3块Y系列IO板。例如,BL190可以搭配3块Y11(8DI)组成
    的头像 发表于 03-08 15:07 444次阅读
    钡铼技术BL192  EtherCAT支持8路<b class='flag-5'>DI</b>模块NPN输入

    功放分几种类型,功放常见分类方式

    功放(Power Amplifier)作为音频设备中不可或缺的重要组成部分,广泛应用于音响系统、电视机、电子设备等多个领域。功放按照不同的分类方式可以分成多种类型,本文将细致地介绍功放的常见分类方式
    的头像 发表于 02-23 10:58 5366次阅读