当前位置: 首页 > 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注入,不能用于构造方法注入

http://www.lryc.cn/news/92998.html

相关文章:

  • java八股文-并发篇
  • Elasticsearch8.6.0安装
  • Vue - 第五天 动态组件 插槽 自定义指令
  • 如何开展web自动化测试
  • 【博学谷学习记录】超强总结,用心分享 | 架构师 Maven学习总结
  • PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来
  • Whistle(基于 Node 实现的跨平台抓包调试工具)的使用
  • 数学模型:Python实现非线性规划
  • Docker网路模型(四)使用 bridge 网络
  • 数据结构与算法之美 | 排序(2)
  • 【外企面试系列】必备口语短语与例句 - A系列
  • Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例
  • 肠道健康从核心菌属开始:肠道菌群的关键
  • 深度学习实战37-NASNet(具有自动搜索能力的神经网络模型)的搭建与实战应用
  • 碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析
  • 人体检测技术之毫米波雷达
  • “Chain of Thought Reasoning“ 和 “Chain Prompts“ 是什么
  • signal
  • 深度研究微软的资产负债表和财务状况以及未来投资价值
  • Mac电脑删除第三方软件工具CleanMyMac X
  • leetcode174. 地下城游戏(java)
  • 信号与系统复习笔记——傅里叶变换
  • Allegor17.2版本WIN11系统CIS配置提示错误解决方案
  • Java设计模式七大原则-合成聚合复用原则
  • SOFA Weekly|可信基础设施技术分论坛、Layotto 社区会议回顾与预告、社区本周贡献...
  • Melody 监控(四十九)
  • Shell脚本管道符常用搭配命令
  • 基于html+mysql+Spring+mybatis+Springboot的Springboot宠物医院管理系统
  • 算法模板(3):搜索(5):其他
  • AWS CodeWhisperer 心得体会:安装与使用