Spring IoCDI—DI详解

news/2024/5/20 2:39:12

在Spring框架中,依赖注入(Dependency Injection,DI)是一种重要的设计模式,它通过将对象的依赖关系从代码中硬编码移动到配置文件中,从而实现了松耦合、易于维护和测试的代码。下面我将详细介绍Spring中的依赖注入(DI)及其相关概念,并提供一些Java代码示例。

1. 依赖注入(DI)的概念

依赖注入是指将一个对象所依赖的其他对象(依赖)通过构造函数、Setter方法或接口注入的方式来完成。Spring容器负责管理这些对象之间的依赖关系,将依赖的对象注入到需要它们的对象中。

2. Spring IoC容器

Spring IoC(Inversion of Control,控制反转)容器是Spring框架的核心,它负责创建、管理和组织应用程序中的对象。在Spring中,应用程序通过IoC容器来获取所需的对象,而不是由应用程序自己创建对象。

3. 依赖注入(DI)的方式

在Spring中,依赖注入有三种方式:构造函数注入、Setter方法注入和接口注入。

3.1 构造函数注入

构造函数注入是通过在类的构造函数中接受依赖对象作为参数来完成的。在Spring中,可以使用<constructor-arg>标签或@Autowired注解来实现构造函数注入。

public class UserService {private UserRepository userRepository;// 构造函数注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
3.2 Setter方法注入

Setter方法注入是通过类的Setter方法接受依赖对象作为参数来完成的。在Spring中,可以使用<property>标签或@Autowired注解来实现Setter方法注入。

public class UserService {private UserRepository userRepository;// Setter方法注入public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
3.3 接口注入

接口注入是通过实现接口来接受依赖对象的方式。在Spring中,可以使用@Autowired注解来实现接口注入。

public interface UserRepository {// 接口方法
}public class UserRepositoryImpl implements UserRepository {// 实现接口方法
}public class UserService {private UserRepository userRepository;// 接口注入@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}

示例代码说明

下面是一个使用构造函数注入的示例代码:

public class UserController {private final UserService userService;// 构造函数注入public UserController(UserService userService) {this.userService = userService;}
}
public class UserService {private final UserRepository userRepository;// 构造函数注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
public class UserRepositoryImpl implements UserRepository {// 实现接口方法
}

在这个示例中,UserController依赖于UserService,而UserService又依赖于UserRepository。通过构造函数注入的方式,将UserRepository注入到UserService中,然后将UserService注入到UserController中,完成了依赖注入的过程。

这就是依赖注入(DI)在Spring框架中的详细介绍及示例代码。通过依赖注入,可以实现代码的解耦合,提高了代码的灵活性和可维护性。


http://www.mrgr.cn/p/86508437

相关文章

Cannot resolve method and(java.util.function.Predicatejava.lang.String)

springboot整合knife4j报错,提示找不到该方法,用的knife4j依赖是最新版本解决方法:将knife4j版本进行降级处理,这里采用2.0.4

Elasticsearch中对文章进行索引和查重

解决思路 要在Elasticsearch中对文章进行索引和查重&#xff0c;可以按照以下步骤操作&#xff1a; 安装Elasticsearch并启动服务。 安装Python的Elasticsearch客户端库&#xff0c;可以使用pip install elasticsearch命令进行安装。 编写Python代码&#xff0c;使用Elastic…

单体到微服务架构的涅槃重生之路?

在技术演进的历史长河中,单体架构曾是众多项目的起点,但随着业务需求日益复杂,微服务架构凭借其灵活性和可扩展性逐渐成为新宠。行业内对此有着激烈的讨论,尤其是互联网大厂和行业技术大佬们对微服务架构的看法颇具影响力。在技术演进的历史长河中,单体架构曾是众多项目的…

Django Admin后台管理:高效开发与实践

title: Django Admin后台管理:高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories:后端开发tags:DjangoAdmin 模型管理 用户认证 数据优化 自定义扩展 实战案例 性能安全第1章:Django Admin基础 1.1 Django Admin简介 Django Admin是Django框架自…

[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)

文章涉及具体代码gitee&#xff1a; 登录 - Gitee.com 目录 1.插入排序 1.直接插入排序 总结 2.希尔排序 总结 2.选择排序 1.选择排序 ​编辑 总结 2.堆排序 总结 3.交换排序 1.冒泡排序 总结 2.快速排序 总结 4.归并排序 总结 5.总的分析总结 1.插入排…

二进制转为HEX数组小工具

在使用RA8889时&#xff0c;JPG的解码只能从FLASH的DMA通道获取&#xff0c;那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办&#xff1f; RA8889支持JPG图片硬解码&#xff0c;但数据流是从FLASH进行DMA读取的&#xff0c;然后再进行解码。因此这种情况下&#xff…

redis自学(42)Lua语法

接下来要实现Nginx的本地缓存,而Nginx是用Lua语言来开发,下面简单理解一下Lua初始Lua Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 安装,centOS自带Lua语言了,不需要安装…

Stable-Diffusion ControlNet插件 DWPose模型下载及使用

webui Version: v1.9.3 DWPose项目地址: https://huggingface.co/yzd-v/DWPose 国内镜像: https://gitee.com/hf-models/DWPose 先安装 git-lfs,下载git仓库大文件会用到 文档: https://help.gitee.com/enterprise/code-manage/code-hosting/large-file-manage/git-lfs 然后确保…

力扣437. 路径总和 III

Problem: 437. 路径总和 III 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义int类型函数rootSum(root, targetSum)&#xff0c;用于求取每一个节点等于目标函数的路径数&#xff1a; 1.1.易知rootSum(root, targetSum)求出的数量等于rootSum(root.left, targetSum - va…

ISCC线上赛2023

ISCC线上赛2023 web web1双重base解码得到flag web3 F12控制台查看可找到loveStory.php Enc.php download.php,loveStory.php为反序列源码 boy::__destruct() -->girl()::__call()-->helper()::__isset()-->boy()::__toString()-->helper()::__get()-->love_st…

python教程6.4-excel处理模块

第三方开源模块安装 创建文件打开已有文件写数据选择表保存表遍历表 按行遍历按列遍历遍历指定行列遍历指定第几列数据删除表设置单元格样式字体对齐设置行高列宽

无处不在的AI:被科技巨头盯上的Agent智能体的崭新时代

&#x1f97d;一.Agent AI智能体 Agent AI 智能体是一种基于人工智能技术的智能代理&#xff0c;它可以自主地执行任务、与环境进行交互&#xff0c;并根据环境的变化做出决策。 OpenAI将AI Agent定义为以大语言模型&#xff08;LLM&#xff09;为大脑驱动具有自主理解、感知、…

24/05/08 图论

能做的仍然只有 stO Liuhl_weifang Orz。\(\color{purple}(1)\) CF746G New Roads构造一棵 \(n\) 个点的深度为 \(t\) 的树,以 \(1\) 为根,使其中深度为 \(i\) 的点有 \(a_i\) 个且叶节点有 \(k\) 个。或报告无解。 \(t, k \le n \le 2 \times 10^5\)。为了方便,我们令根节点…

Rust开发工具有哪些?

目录 一、JetBrains公司的RustRover​编辑 二、微软公司的Visual Studio Code 三、Rust编译工具 一、JetBrains公司的RustRover RustRover是由JetBrains开发的一款专为Rust开发量身定制的新兴IDE&#xff0c;目前还处于早期访问阶段。它支持Rust、Cargo、TOML、Web和数据库等…

2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后计算该元素在数组中出现的总次数。 输入:nums = [1,2,2,3,1,4]。 输出:4。

2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后计算该元素在数组中出现的总次数。 输入:nums = [1,2,2,3,1,4]。 输出:4。 答案2024-05-08: chatgpt 题目来自leetcode3005。 大体步骤如下: 1.创建一个空的字典 cnt 用于存储每个…

报错:Error: Cannot find module

报错详情: 解决方法: 1、正确安装版本号的nodejs 2、删除项目根文件夹下的node_modules和“package-lock.json”, 3、重新执行npm install

上课学习(无线网络)

考红色部分:如什么协议采用集中式架构

UG NX二次开发(C#)-获取Part中对象创建时的序号(*)

文章目录 1、前言2、UG NX的对象序号讲解3、采用UG NX二次开发或者建模序号4、注意事项1、前言 在UG NX中,我们创建任意一个对象,都会在模型历史中添加一个创建对象的编号,即是对象序号,这个是递增的,当删除中间产生的对象时,其序号会重新按照建模顺序重新排布。今天一个…

2024CVPR_Low-light Image Enhancement via CLIP-Fourier Guided Wavelet Diffusion(CFWD)

一、Motivation 1、单模态监督问题:大多数方法往往只考虑从图像层面监督增强过程,而忽略了图像的详细重建和多模态语义对特征空间的指导作用。这种单模态监督导致不确定区域的次优重建和较差的局部结构,导致视觉结果不理想的出现。------》扩散模型缺乏有效性约束,容易出现…

PDF批量编辑技巧:高效PDF转txt批量处理,轻松管理大量文档

随着信息技术的飞速发展&#xff0c;文档管理已成为日常工作中不可或缺的一部分。特别是当我们需要处理大量的PDF文件时&#xff0c;如何高效地进行编辑、转换和管理成为了一个重要的问题。本文将介绍一些PDF批量编辑的技巧&#xff0c;特别是如何将PDF批量转换为txt格式&#…