Spring 依赖注入02

文章目录

    • 1. 核心概念
    • 2. 依赖注入的方式
    • 3. 构造函数注入
      • 3.1 构造函数注入的优点包括:
    • 4. 设值注入
      • 4.1 设值注入的特点和优点
      • 4.2 使用设值注入的注意事项
    • 5. 接口注入
      • 5.1 接口注入的基本概念:
      • 5.2 使用接口注入的注意事项:

依赖注入(Dependency Injection,DI)

1. 核心概念

是面向对象编程中的一种设计模式,它主要用于降低组件之间的耦合度,促进代码的可测试性和可维护性。在依赖注入中,对象的依赖关系不是在内部创建,而是由外部容器(比如 Spring 框架)在对象创建时将依赖对象注入进来。

  1. 依赖:一个对象依赖于另一个对象,如果它需要使用另一个对象的服务或者资源来完成自身的功能。例如,一个订单服务可能依赖于一个支付服务来完成支付功能。

  2. 注入:指的是将一个对象的依赖关系传递给另一个对象的过程。依赖注入有三种主要的实现方式:

2. 依赖注入的方式

  1. 构造函数注入(Constructor Injection):依赖通过对象的构造函数传入。
  2. 设值注入(Setter Injection):依赖通过对象的设值方法(setter 方法)传入。
  3. 接口注入(Interface Injection):依赖通过特定的接口方法传入。
  4. 控制反转(Inversion of Control,IoC):依赖注入通常与控制反转紧密相关。控制反转是一种设计原则,指的是将对象的创建、管理和关联的控制权从应用程序代码中反转到外部容器(比如 Spring 容器)中。依赖注入是实现控制反转的一种方式。

3. 构造函数注入

示例

public class UserService {private final UserRepository userRepository;// 构造函数注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 其他业务方法public void saveUser(User user) {userRepository.save(user);}// 可选的设值注入方法public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}

3.1 构造函数注入的优点包括:

  1. 明确性:通过构造函数明确地声明对象需要哪些依赖,提高了代码的可读性可理解性。、
  2. 不可变性:一旦对象被创建并注入了依赖,其依赖关系通常是不可变的,避免了在对象生命周期中的不必要变动。
  3. 线程安全:对象在创建时一次性注入所有依赖,避免了多线程环境下可能导致的并发问题。

4. 设值注入

设值注入(Setter Injection)是依赖注入(DI)的一种形式,它通过对象的公共设值方法(setter 方法)来注入依赖。在使用设值注入时,依赖关系不是通过对象的构造函数传入,而是在对象创建后,通过调用特定的设值方法来设置依赖。

public class UserService {private UserRepository userRepository;// 设值注入方法public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}// 其他业务方法public void saveUser(User user) {userRepository.save(user);}
}

4.1 设值注入的特点和优点

  1. 灵活性:与构造函数注入相比,设值注入允许在对象创建后动态地改变对象的依赖关系,因为依赖的设置是通过公共的 setter 方法完成的。
  2. 可选性:设值注入可以让某些依赖是可选的,即可以为某个依赖设置一个默认值,如果外部未提供,则使用默认值。
  3. 易于理解和维护:设值注入可以使对象的依赖关系更加明确,每个依赖可以有对应的设值方法,提高了代码的可读性和可维护性。

4.2 使用设值注入的注意事项

  1. 可选性和默认值:设值注入可以为某些依赖设置默认值,当外部未提供依赖时可以使用这些默认值。
  2. 顺序依赖:如果对象的某些依赖需要按顺序设置,设值注入可以更灵活地处理这种情况,因为可以根据具体的业务需求在合适的时间设置依赖。
  3. 不变性:设值注入使得对象在创建后可以动态地改变依赖关系,这在某些场景下可能带来不必要的复杂性和隐患,因此需要谨慎设计和使用。

5. 接口注入

接口注入(Interface Injection)是依赖注入(DI)的一种形式,它通过实现特定接口来实现依赖的注入。相较于常见的构造函数注入和设值注入,接口注入在现代框架和实践中较少使用,因为它具有一些局限性和复杂性,不如其他方式那样直观和灵活。

public interface DependencyInjector {void injectDependency(Object dependentObject);
}
public class MyDependencyInjector implements DependencyInjector {private MyDependency dependency;// 实现接口的注入方法@Overridepublic void injectDependency(Object dependentObject) {if (dependentObject instanceof DependentClass) {((DependentClass) dependentObject).setDependency(dependency);}}// 设置依赖对象的方法public void setDependency(MyDependency dependency) {this.dependency = dependency;}
}

5.1 接口注入的基本概念:

  1. 依赖注入方式:接口注入是通过实现特定接口的方式来注入依赖,该接口通常定义一个方法用于接收依赖对象。
  2. 接口定义:依赖注入的接口通常包括一个或多个方法,用于在对象创建后将依赖对象传递给实现类。
  3. 实现类:实现该接口的类需要提供方法的具体实现,以便接收依赖对象,并在适当的时机将其注入到对象中。

5.2 使用接口注入的注意事项:

  1. 复杂性和局限性:相较于构造函数注入和设值注入,接口注入需要定义接口和实现类,并且实现类需要显式地调用注入方法。这增加了代码的复杂性和依赖的耦合度。
  2. 可测试性:接口注入可能会影响代码的可测试性,因为依赖关系的设置通常需要在对象创建后进行,这可能会导致测试代码的编写和管理变得更加复杂。
  3. 现代框架实践:现代的依赖注入框架(如 Spring、Guice 等)通常更倾向于使用构造函数注入和设值注入,因为它们提供了更好的灵活性和清晰度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录day23 ||39组合总和1 40组合总和2 131分割回文串

39组合总和1 力扣题目链接 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…

【C语言】两个数组比较详解

目录 C语言中两个数组比较详解1. 逐元素比较1.1 示例代码1.2 输出结果1.3 分析 2. 内置函数的使用2.1 示例代码2.2 输出结果2.3 分析 3. 在嵌入式系统中的应用3.1 示例代码3.2 输出结果3.3 分析 4. 拓展技巧4.1 使用指针优化比较4.2 输出结果4.3 分析 5. 表格总结6. 结论7. 结束…

高级及架构师高频应用型面试题

一、微服务多节点批量应该怎么设计? 1、异步任务分类: 周期性定时任务调度任务批量任务 2、需要考虑并解决的问题: 2.1、避免同一任务同时被多个节点捞取。 1)数据库的行级锁 2)redis分布式锁 3)quartz…

后端面试题日常练-day06 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备,答案在文末 在Java中,以下哪个关键字用于表示类之间的关联性,表明一个类包含另一个类的对象? a) include b) contain c) reference d) composition Java中的方法重写&#xff…

Python写UI自动化--playwright(通过UI文本匹配实现定位)

本篇简单拓展一下元素定位技巧,通过UI界面的文本去实现定位 目录 匹配XPath 匹配文本元素 .count()统计匹配数量 处理匹配文本返回多个元素 1、使用.nth(index)选择特定元素: 2、获取所有匹配的元素并遍历: 3、错误处理: 匹配XPath 比如我们要定位到下图的…

C++笔试强训8

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 根据下面的定义故选A。 函数重载:在相同作用域中,函数名字相同,参数列表不同的一系列函数称为函数重载参数列表不同具体的体现:参数个数不同参数类型不同类型的次序不同注意:…

单元测试--Junit

Junit是Java的单元测试框架提供了一些注解方便我们进行单元测试 1. 常用注解 常用注解&#xff1a; TestBeforeAll&#xff0c;AfterAllBeforeEach&#xff0c;AfterEach 使用这些注解需要先引入依赖&#xff1a; <dependency><groupId>org.junit.jupiter<…

6 C 语言指针的奥秘:理论与实践详解

目录 1 变量访问机制 1.1 内存地址 1.2 变量的直接访问 1.3 变量的间接访问 2 指针变量及其内存大小 2.1 指针与指针变量 2.2 指针变量的定义格式 2.3 指针变量的内存大小 3 取地址操作符与取值操作符 3.1 取地址操作符 & 3.2 取值操作符 * 3.3 解引用与数据类…

Xcode是什么?它在iOS开发中的作用和功能有哪些?

Xcode是苹果公司为macOS平台开发的一款集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;&#xff0c;它主要用于开发iOS、iPadOS、macOS、watchOS和tvOS的应用程序。Xcode集成了从编写代码、界面设计、调试程序、版本控制到应用发布…

【数据结构】顺序表(杨辉三角、简单的洗牌算法)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 欢迎志同道合的朋友一起加油喔 &#x1f4aa;&#x1f4aa;&#x1f4aa; 谢谢你这么帅…

pandas.core.series.Series 转json

在Python中&#xff0c;可以使用Pandas库中的Series.to_json()方法将Series对象转换为JSON格式的字符串。以下是一个简单的例子&#xff1a; import pandas as pd# 创建一个Pandas Seriess pd.Series({a: 1, b: 2, c: 3})# 转换为JSON字符串json_str s.to_json(orientrecords…

Android SurfaceFlinger——通知消费流程(三十五)

上一篇文章介绍了 onFrameAvailable() 函数的流程&#xff0c;最终回调到了 BLASTBufferQueue 中&#xff0c;这里测处理跟 Android 老版本还是有区别的&#xff0c;在 BLASTBufferQueue 中通过提交事务的方式通知 SurfaceFlinger 进行更新&#xff0c;而不是老版本中的直接调用…

学习React(描述 UI)

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件。在本章…

netty应用-手写RPC

文章目录 手写RPC之案例定位与通信过程介绍RPC框架案例定位服务端与客户端架构通信过程1. 服务注册与发现2. 请求序列化与传输3. 请求处理与响应4. 响应反序列化与结果处理实现细节1. 服务端2. 客户端技术选型关键挑战总结手写RPC之请求响应通信协议定制协议结构示例消息头格式…

GO集成方式、Java文字识别接口集成方法

我们现在经常使用到的那些软件、APP、微信小程序产品来说&#xff0c;在注册的时候需要手动填写一些证件信息的时候已经可以通过上传证件照片自动填写信息了&#xff0c;这就是OCR API的功劳&#xff0c;接入翔云OCR API的系统可以自动识别用户上传的证件信息并填写到相应的栏目…

优化医疗数据管理:Kettle ETL 数据采集方案详解

在现代医疗保健领域&#xff0c;数据的准确性、完整性和及时性对于提高医疗服务质量和患者护理至关重要。为了有效管理和利用医疗数据&#xff0c;Kettle ETL&#xff08;Extract, Transform, Load&#xff09;数据采集方案成为了许多医疗机构的首选工具之一。本文将深入探讨Ke…

【基础算法总结】队列 + 宽搜(BFS)

队列 宽搜BFS 1.N 叉树的层序遍历2.二叉树的锯齿形层序遍历3.二叉树最大宽度4.在每个树行中找最大值 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#…

MySQL作业五

1. 创建表goods&#xff0c;orders 2. 向商品表中插入商品记录 3. 触发器操作 3.1 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 3.2 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应…

C语言文件锁Linux

在C语言中&#xff0c;flock 是一个用于文件锁定的函数&#xff0c;定义在 sys/file.h 头文件中。它的主要目的是在对文件进行读写操作时&#xff0c;避免其他进程同时访问文件&#xff0c;以实现文件的并发控制。 flock 函数的原型 #include <sys/file.h>int flock(in…

java数据结构之排序

前言&#xff1a; 排序在我们日常生活中随处可见&#xff0c;这里将介绍java数据结构里面常见的几种排序。 ps: swap函数的实现&#xff1a; public void swap(int[] arr, int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; } 1.直接插入排序 &#xff08;1&a…