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

Spring依赖注入有哪些?各有什么优缺点?

文章目录

  • 前言
  • 概述
  • 一、属性注入
    • 1.1 实例
    • 1.2 优点
    • 1.3 缺点
  • 二、Setter注入
    • 2.1 实例
    • 2.2 优点
    • 2.3 缺点
  • 三、 构造方法注入
    • 3.1 实例
    • 3.2 优点
    • 3.3 缺点
  • 四、扩展


前言

IoC和DI是Spring中重要的两个概念,其中IoC指的是控制反转,DI(依赖注入)指的是IoC的具体实现方式。那么DI实现依赖注入有哪些方式呢?这些方式又各自有什么优缺点呢?接下来,让我们一起来看一看。


概述

在Spring中实现依赖注入的常见方式有以下三种:

  1. 属性注入
  2. Setter注入
  3. 构造方法注入

它们的具体使用方式以及优缺点如下。

一、属性注入

属性注入是Spring三种常见注入方法最简单的方式,也算是开发过程中,开发者最喜爱的方式。

1.1 实例

属性注入只需要使用@Autowired修饰,就可以直接获得注入的对象,代码如下:

@Controller
public class UserController {@Autowired  private UserService userService;}

1.2 优点

属性注入的优点就是实现简单,使用简单。

1.3 缺点

  1. 不能注入不可变对象,也就是不能注入final修饰的对象
  2. 兼容性不好,只适合IoC容器
  3. 由于写法简单,也更容易违背单一设计原则

二、Setter注入

2.1 实例

Setter注入需要引入这个对象的set方法,并且用@Autowired修饰。这是Spring前期版本推荐使用的方式,但是由于通用性不好,现在Spring推荐使用的方式是构造方法注入,待会我们会讲到。

@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
}

2.2 优点

相比于属性注入,Setter注入更符合单一设计原则,因为每次都只传递了一个对象。

2.3 缺点

  1. 和属性注入一下,Setter注入不能注入不可变对象
  2. 注入的对象可能被修改(因为可能有其他人调用这个set方法)

三、 构造方法注入

3.1 实例

构造方法注入,顾名思义,需要引入对象的构造方法。除此之外,@Autowired在这里可以省略

@Controller
public class UserController {private UserService userService;// @Autowired public UserController(UserService userService) {this.userService = userService;}
}

3.2 优点

  1. 与前两者方式不同,构造方法注入可以注入不可变的对象。这是因为在JavaSE中,创建final修饰的对象时,要么直接赋值,要么在构造方法中赋值,必须满足其一。
  2. 由于构造方法只执行了一次,注入的对象不会被改变。
  3. 可以保证注入对象完全被初始化。
  4. 兼容性更好

3.3 缺点

如果有多个注入会显得比较臃肿,但是出现这种情况我们应该考虑一下当前类是否符合程序的单一设计原则。

四、扩展

除了上诉@Autowired修饰的三种依赖注入以外,还有另外一种注入关键字@Resource

那么@Resource和@Autowired有什么区别呢?

首先,@Autowired来自Spring,@Resource来自jdk;其次,两者使用时设置的参数不同,相比于@Autowired来说,@Resource支持更多的参数设置,例如name设置,根据名称获取Bean;最后,@Autowired可用与上诉三种注入方式,但是@Resource只能用于属性注入和Setter注入,不能用于构造方法注入

相关文章:

Spring依赖注入有哪些?各有什么优缺点?

文章目录 前言概述一、属性注入1.1 实例1.2 优点1.3 缺点 二、Setter注入2.1 实例2.2 优点2.3 缺点 三、 构造方法注入3.1 实例3.2 优点3.3 缺点 四、扩展 前言 IoC和DI是Spring中重要的两个概念,其中IoC指的是控制反转,DI(依赖注入)指的是IoC的具体实现…...

java八股文-并发篇

并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态此时未与操作系统底层线程关联 可运行 调用了 start …...

Elasticsearch8.6.0安装

Elasticsearch 8.5.0 安装 Elasticsearch 简介Elasticsearch 8.6.0 安装创建网络拉取镜像运行镜像设置密码修改kibana配置绑定ES代码绑定:手动绑定: 配置ik分词器扩展词词典停用词词典 Elasticsearch 简介 Elasticsearch(ES) 是一…...

Vue - 第五天 动态组件 插槽 自定义指令

动态组件& 插槽& 自定义指令 一、动态组件1.什么是动态组件2.如何实现动态组件渲染3.使用 keep-alive 保持状态4. keep-alive 对应的生命周期函数5. keep-alive 的 include 属性6.动态展示左右组件7.例子 二、插槽1.什么是插槽2.体验插槽的基础用法2.1 没有预留插槽的内…...

如何开展web自动化测试

Web 自动化是指使用测试脚本在 Web 上自动执行任务。它包括填写表单、导航网页、单击链接或按钮以及从网站中提取数据等任务。 它可用于各种目的,例如自动输入数据或测试网站的功能。有几种工具和编程语言可用于自动化网络上的任务,包括Selenium&#x…...

【博学谷学习记录】超强总结,用心分享 | 架构师 Maven学习总结

文章目录 Maven基本1.什么是Maven2.为什么用Maven?(1)jar 包的规模(2) jar 包的来源(3)jar 包之间的依赖关系 3.Maven目录结构4.maven仓库配置 Pom层次Pom文件简介Super POM 依赖管理1 依赖传递2 传递性依…...

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

简介 这是我们学PPT处于初级到中级进化阶段常做的一件事,就是拿了这种纯文字类版面来做布局。而且这种文字都是政企类的、相当苦涩难懂、无法创意。 因此我们会要求使用7种排版来优化这个版面。这和达芳奇画鸡蛋很像,这样的练习需要坚持一段时间,就是拿了纯文字来beautifu…...

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用 基于Node实现的跨平台抓包调试工具 可以劫持网络请求,并进行请求和响应的修改,来提高我们的开发调试效率 1.一键安装(装包/证书) npm i -g whistle && w2 start --init 证书的问题 安装…...

数学模型:Python实现非线性规划

上篇文章:整数规划 文章摘要:非线性规划的Python实现。 参考书籍:数学建模算法与应用(第3版)司守奎 孙玺菁。 PS:只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现:可以参考1.最优化模型与算法——基于…...

Docker网路模型(四)使用 bridge 网络

使用 bridge 网络 在计算机网络中,一个 bridge(网桥)是一个链路层设备,负责在不同的网段之间转发信息。 bridge 可以是真实的硬件设备也可以是由宿主机底层提供的软件模拟设备。 在 Docker 中,bridge 网络使用了软件…...

数据结构与算法之美 | 排序(2)

归并排序(Merge Sort) 基本思想: 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 def merge_sort…...

【外企面试系列】必备口语短语与例句 - A系列

a big headache令人头痛的事情 I have a big headache from all the noise. (我因为噪音而头痛。)The paperwork is a big headache for me. (对我来说,文书工作是件头痛的事情。) a fraction of 一部分 She ate only a fraction of her meal. (她只吃了一部分饭…...

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五:案例下载bilibili视…...

肠道健康从核心菌属开始:肠道菌群的关键

谷禾健康 5月29日,是世界肠道健康日。肠道是人体最重要的消化系统之一,与人体健康紧密相关。而肠道菌群作为肠道重要组成部分,在肠道健康中发挥着重要的作用。 编辑​ 由于基因、环境、饮食、药物等因素的影响,每个人的肠道菌群都…...

深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用,NASNet是由Google Brain团队开发的一种具有自动搜索能力的神经网络模型,利用强化学习和进化算法等技术来自动地搜索最优的神经网络架构。NASNet模型的设计灵感…...

碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析

文章目录 效果一览文章概述研究内容环境准备源码设计KNNRandom ForestDecision TreeMLPModel Evaluation学习总结参考资料效果一览...

人体检测技术之毫米波雷达

人体检测技术之毫米波雷达 1.概述 智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。 选型主要是几个维度: 1.支持检测的距离范围,能否准确输出距离信息 2.支持…...

“Chain of Thought Reasoning“ 和 “Chain Prompts“ 是什么

"Chain of Thought Reasoning" 和 "Chain Prompts" 是什么 1. "Chain Prompts" 是什么2. “Chain of Thought Reasoning” 是什么 1. “Chain Prompts” 是什么 “Chain Prompts” 是指一系列相关的提示,它们之间有逻辑上的联系和依赖关系。用户…...

signal

读信号,dqs 是对齐到dq的边沿, 写信号,dqs 的边沿是对到中间的。 spec 就是这样规定的。我们在dq的最中间的采样,肯定是最安全的。 dqs 是对齐到dq的边沿 , 在silicon 内部,还是通过移位完成的。 rl: re…...

深度研究微软的资产负债表和财务状况以及未来投资价值

来源:猛兽财经 作者:猛兽财经 微软股票的关键指标 猛兽财经认为,微软公布的2023财年第三季度财务业绩,有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%,从2022财年第…...

iPhone 抓包失败 4 种具体情况逐个解决方法

抓不到包这个描述太模糊了,在实际调试中,这句话至少对应四种完全不同的情况: 完全没有请求只有浏览器能抓到能抓到但 HTTPS 解不开能抓到但数据不完整 如果不先分清楚是哪一种,就会一直重复安装证书或改代理配置。一、先做一个验证…...

避坑指南:JRTPLIB交叉编译时容易忽略的3个CMAKE参数(附实测解决方案)

避坑指南:JRTPLIB交叉编译时容易忽略的3个CMAKE参数(附实测解决方案) 在嵌入式开发领域,跨平台编译开源库是每个工程师的必修课。JRTPLIB作为实时传输协议(RTP)的经典实现,其ARM架构下的编译问题却常让开发者陷入"…...

像素幻梦·创意工坊应用场景:复古风APP启动页加载动画AI生成方案

像素幻梦创意工坊应用场景:复古风APP启动页&加载动画AI生成方案 1. 引言:像素艺术的复兴与AI赋能 在移动应用设计领域,复古像素风格正经历一场文艺复兴。从独立游戏到主流应用,越来越多的产品选择用像素艺术打造独特的品牌识…...

全新K4A4G165WG-BCWE000 4Gb DDR4 SDRAM 内存芯片 三星Samsung 进口芯片IC

K4A4G165WG-BCWE000 是三星半导体(Samsung)推出的一款4Gb DDR4 SDRAM 内存芯片,采用 96-ball FBGA 封装,组织为 256M 16 结构。它凭借 3200Mbps 的高数据速率、1.2V 低功耗设计以及 -40C 至 95C 的宽温工作能力,广泛应…...

DeepSeek LintCode 3867 · 范围内的数字计数 public int digitsCount(int d, int low, int high)

LintCode 3867 范围内的数字计数 问题分析 计算在区间 [low, high] 中,数字 d 出现的次数。 核心思想:使用数位DP或前缀和思想 • count(low, high) count(0, high) - count(0, low-1) 方法一:逐位统计法(推荐)AC pu…...

服务器频繁报soft lockup?手把手教你排查高负载进程与内核死锁问题

服务器频繁报soft lockup?手把手教你排查高负载进程与内核死锁问题 最近在运维工作中,你是否遇到过服务器突然弹出"kernel:NMI watchdog: BUG: soft lockup - CPU#X stuck for XXs!"这样的警告信息?这种内核软死锁问题看似不会立即…...

树莓派4b(armv8) 64位系统源码编译onnx实战指南

1. 环境准备:从零搭建树莓派4B开发环境 在树莓派4B上编译ONNX源码之前,我们需要先确保系统环境配置正确。我用的是一台4GB内存版本的树莓派4B,系统是最新的Raspberry Pi OS 64位版本。这里有个小细节要注意:很多教程还在用32位系统…...

5大核心功能提升英雄联盟体验:League-Toolkit全场景应用指南

5大核心功能提升英雄联盟体验:League-Toolkit全场景应用指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-T…...

Python服务内存持续增长?5个被忽略的__del__陷阱+3种RAII式资源封装模板,今天必须修复!

第一章:Python服务内存持续增长的智能体诊断全景图Python服务在长期运行中出现内存持续增长,是生产环境中高频且隐蔽的稳定性风险。传统人工排查依赖经验与断点调试,难以覆盖异步任务、闭包引用、第三方库缓存等复杂场景。本章构建一个面向可…...

【windows】VirtualBox网络配置及实战-Host Only 仅主机模式

1.概述 仅 主 机 网 络 : 用 来 创 建 一 个 包 含 主 日 一 组 虚拟机的 网 络 , 而 不 需 要 主 机 的 物 理 网 络 接 口 .相反 ,在虚拟机上创建了一个类似于环回接口的虚拟网络接口。提 供 虚 似 机 和 主 机 之 间 的 连 接 …...