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

Spring IoC的基本概念

引言

在 Java 中,出现了大量轻量级容器,这些容器有助于将来自不同项目的组件组装成一个有凝聚力的应用程序。这些容器的底层是它们如何执行布线的常见模式,它们将这一概念称为“控制反转”。


🏢 本章内容

🏭 IoC服务理念;

🏭 让别人为你服务;

🏭 IoC的附加值;


IoC服务理念

IoCInversion of Control,即_“控制反转”_,不是什么技术,而是一种设计思想。其核心理念是从传统的程序设计中将控制权逆转,通过外部容器来管理对象的创建、组装和生命周期,从而降低代码之间的耦合度,提高系统的灵活性和可维护性。

在实际应用中,IoC 的实现方式主要包括依赖注入(Dependency Injection,DI)和依赖查找(Dependency Lookup)两种方式。

🗡️ 依赖注入:

是一种常见的实现方式,通过构造函数、方法参数、或者特定的注入接口,将对象所依赖的其他对象交由外部容器负责创建和管理,而不是在对象内部通过 new 关键字主动创建。这样一来,对象的依赖关系由外部容器来维护,对象本身不需要关心依赖对象的创建和生命周期,从而实现了解耦合。

🗡️ 依赖查找:

是另一种IoC的实现方式,它通过容器提供的API,允许对象查询(或查找)所依赖的其他对象。对象在需要依赖对象时,向容器发出查询请求,容器则负责返回相应的依赖对象。这种方式相对于依赖注入来说更加灵活,但也增加了代码的复杂度和耦合度。

理解 Ioc 的要点

🥋 谁控制谁,控制什么

理解IoC的关键在于颠覆传统程序设计中对象间的关系模式。传统模式中,对象之间的依赖关系由对象自身负责管理和创建,而IoC则是将这种控制权交给外部容器,实现了对象间的松耦合。这种“谁控制谁,控制什么”的转变,使得代码更加清晰、可扩展、易维护。

🥋 为何是反转,哪些方面反转了

为什么称之为“反转”呢?因为在IoC中,传统的对象创建和管理流程被颠倒过来了。传统情况下,对象自身主动创建和管理依赖对象,而在IoC中,对象成为被动的接受者,由外部容器负责创建、管理和注入依赖对象。因此,IoC被称为一种“反转”,它颠覆了传统程序设计中对象间的控制关系。

举个栗子

🥊 **你口渴想喝水吧?**以前,你得自己找到水(依赖对象),然后自己到杯子里,然后再喝水。

而现在,你只要跟你的“另一半” 使个眼色或说一句“Honey,水拿来。” 她就会心领神会地到饮水机那里为你接杯水,然后再给喂你喝下。(此时此刻,你心里肯定窃喜,“有人照顾的感觉真好!”)对你来说,到底哪种场景比较惬意,我想已经不言自明了吧?

🥊 使用前:

请在此添加图片描述

🥊 使用后:

请在此添加图片描述

让别人为你服务

🔫 “先生,晚上好,欢迎光临XXX,拖鞋手牌拿好,楼上请,男宾一位 。” 当你开着凯迪拉克来到洗浴中心,想要洗澡的时候,通常会直接招呼服务生,让他为你送来拖鞋手牌。同样地,作为被注入对象,要想让IoC为其提供服务,并将所需要的被依赖对象送过来,也需要通过某种方式通知对方

请在此添加图片描述

🧟 如果你是洗浴中心的常客,或许你刚进门,服务生已经将你最常使衣柜,手牌放到了你面前;

🧟 如果你是初次或偶尔光顾,也许你坐下之后还要招呼服务生,“给我拿双拖鞋和手牌”;

🧟 还有一种可能,你根本就不知道的时候,这时,你只示意一下告诉服务生你到底想要什么。

不管怎样,你终究会找到一种方式来向服务生表达你的需求,以便他为你提供适当的服务。那么,在IoC模式中,被注入对象又是通过哪些方式来通知IoC Service为其提供适当服务的呢?

🏹 IoC模式最权威的总结和解释,应该是Martin Fowler的那篇文章 Inversion of Control Containers and the Dependency Injection pattern ,其中提到了三种依赖注入的方式,即构造方法注入(constructor injection)、 setter方法注入(setter injection)以及接口注入(interface injection)。

🪓 构造方法注入(Constructor Injection)

这种方式通过在对象实例化时传递依赖项来完成注入。在洗浴中心中,你作为常客,通过注册时填写的偏好信息,告知洗浴中心你需要的沐浴露和洗发水。当你到达时,洗浴中心已经根据你的偏好提前准备好了相应的产品,直接为你提供服务。构造方法注入的优点在于依赖项的一致性和可靠性。

 // 构造方法注入public BathCenter(BathProduct bathProduct) {this.bathProduct = bathProduct;}

🪓 Setter方法注入(Setter Injection)

这种方式通过调用对象的setter方法来完成依赖项的注入。对于偶尔光顾的顾客而言,他们在到达洗浴中心后,需要向服务员说明他们的洗浴偏好。服务员根据顾客的需求,调用相应的setter方法设置洗浴服务,使得顾客能够享受到与常客相同的洗浴体验。Setter方法注入的灵活性允许在运行时动态地更改依赖项。

// Setter方法注入public void setBathProduct(BathProduct bathProduct) {this.bathProduct = bathProduct;}

🪓 接口注入(Interface Injection)

这种方式通过定义接口来完成依赖项的注入。对于新来的游客而言,他们可能并不清楚洗浴中心提供的服务项目,也不了解适合自己的沐浴产品。在这种情况下,游客通过与服务员的交流来表达自己的需求,服务员根据游客的需求来为其安排相应的服务。接口注入允许通过抽象的接口定义来解耦组件之间的依赖关系,提高了系统的灵活性和可维护性。

// 沐浴产品接口
interface BathProduct {void use();
}// 沐浴中心类
class BathCenter {private BathProduct bathProduct;// 构造方法注入public BathCenter(BathProduct bathProduct) {this.bathProduct = bathProduct;}// Setter方法注入public void setBathProduct(BathProduct bathProduct) {this.bathProduct = bathProduct;}// 提供洗浴服务public void provideBathService() {System.out.println("欢迎光临洗浴中心!");bathProduct.use(); // 使用沐浴产品System.out.println("感谢您的光临,祝您洗浴愉快!");}
}// 沐浴露类
class ShowerGel implements BathProduct {@Overridepublic void use() {System.out.println("使用沐浴露洗澡");}
}// 洗发水类
class Shampoo implements BathProduct {@Overridepublic void use() {System.out.println("使用洗发水洗头");}
}// 测试类
public class Main {public static void main(String[] args) {// 构造方法注入BathProduct showerGel = new ShowerGel();BathCenter bathCenter1 = new BathCenter(showerGel);bathCenter1.provideBathService();// Setter方法注入BathProduct shampoo = new Shampoo();BathCenter bathCenter2 = new BathCenter(null); // 初始化时不注入沐浴产品bathCenter2.setBathProduct(shampoo);bathCenter2.provideBathService();// 接口注入BathCenter bathCenter3 = new BathCenter(null); // 初始化时不注入沐浴产品bathCenter3.setBathProduct(new BathProduct() {@Overridepublic void use() {System.out.println("使用默认沐浴产品洗澡");}});bathCenter3.provideBathService();}
}

三种注入方式的比较

在IoC模式中,构造方法注入、Setter方法注入和接口注入是三种常见的依赖注入方式。它们在使用场景、灵活性和实现复杂度上有一些区别,以下是它们的比较:

🛡️ 构造方法注入(Constructor Injection)

  • 使用场景: 适用于在对象创建时就确定其依赖关系的情况。常用于注入不变的依赖项,例如配置信息、常用服务等。
  • 灵活性: 由于依赖项在对象创建时确定,因此一旦对象被创建,其依赖关系就不可更改。这可能会限制一些动态变化的需求。
  • 实现复杂度: 相对简单,不需要提供额外的setter方法用于动态修改依赖。

🛡️ Setter方法注入(Setter Injection)

  • 使用场景: 适用于依赖项可能在对象的生命周期内发生变化的情况。常用于可变的依赖关系,允许在运行时动态修改。
  • 灵活性: 具有较高的灵活性,可以在任何时候通过调用setter方法来修改依赖关系。适用于需要动态切换依赖的情况。
  • 实现复杂度: 相对较复杂,需要提供额外的setter方法,并在对象创建后可能需要进行额外的检查来确保正确的依赖关系。

🛡️ 接口注入(Interface Injection)

  • 使用场景: 适用于希望通过共享接口来解耦依赖项的情况。可以用于将依赖注入抽象为接口,具体实现由外部注入。
  • 灵活性: 具有一定的灵活性,可以通过不同的接口实现来注入不同的依赖。更适合于对接口较为关心的情况。
  • 实现复杂度: 需要定义接口并提供不同的实现类。相对于构造方法注入和Setter方法注入,实现上略显繁琐。

IoC的附加值

IoC模式的附加值远不止于简单的依赖注入,它带来的好处包括更低的耦合度、更好的可测试性、可重用性和可扩展性等。让我们通过具体的示例来深入理解IoC模式的附加值。

降低耦合度

在传统的程序设计中,对象之间的依赖关系通常是硬编码的,对象直接实例化并使用其依赖对象。这种做法会导致高耦合度,当一个对象发生变化时,可能需要修改其他多个对象。而使用IoC模式,对象不再负责获取依赖对象,而是通过外部容器进行管理和注入,从而降低了对象之间的耦合度。

提高可测试性

IoC模式使得依赖对象的注入变得灵活,可以通过Mock对象等方式轻松替换真实的依赖对象,从而方便进行单元测试。单元测试可以针对对象的特定行为进行测试,而不受其依赖对象的影响,提高了测试的精度和可靠性。

增强可重用性

通过将依赖对象与实现解耦,使得依赖对象可以被多个对象共享和重用。这样一来,我们可以更轻松地将已经实现和测试过的组件应用到新的场景中,而不必重复开发和测试相同的功能。

支持可扩展性

IoC模式使得系统更容易扩展,新的功能模块可以通过依赖注入的方式加入到系统中,而不必修改现有的代码。这种松耦合的设计使得系统更具弹性,能够更好地适应未来的需求变化和业务扩展。

通过具体的示例,我们可以更直观地感受到IoC模式带来的好处。它不仅仅是一种设计模式,更是一种思想,能够帮助我们构建更灵活、可测试、可维护和可扩展的软件系统。

举个例子

忽然有一天,洗浴中心老板为了能够洗浴更多的顾客到店光顾,他茅塞顿开,想到顾客洗完澡后,可以到二楼休息,饮茶。于是提供了,乘电梯上2楼的服务。

请在此添加图片描述

☯️ 如果没有IoC,那么新增的业务是没有办法与顾客进行绑定的,客户并不知道我们提供了这样的服务。功能需要重新实现。

☯️ 如果使用IoC,我们可以主动的告知客户,我们提供了上2楼服务,这样在接口不发生变化的情况,我们可以提供更多的服务方式。

👹 原始提供的服务:

// 洗浴产品接口
interface BathProduct {void use();
}// 沐浴露实现
class ShowerGel implements BathProduct {@Overridepublic void use() {System.out.println("使用沐浴露洗澡");}
}// 洗发水实现
class Shampoo implements BathProduct {@Overridepublic void use() {System.out.println("使用洗发水洗头");}
}// 洗浴中心类
class BathCenter {private BathProduct bathProduct;// 构造方法注入public BathCenter(BathProduct bathProduct) {this.bathProduct = bathProduct;}// 提供洗浴服务public void provideBathService() {System.out.println("欢迎光临洗浴中心!");bathProduct.use(); // 使用洗浴产品System.out.println("感谢您的光临,祝您洗浴愉快!");}
}// 测试类
public class Main {public static void main(String[] args) {// 构造方法注入洗浴露BathProduct showerGel = new ShowerGel();BathCenter bathCenter1 = new BathCenter(showerGel);bathCenter1.provideBathService();// 构造方法注入洗发水BathProduct shampoo = new Shampoo();BathCenter bathCenter2 = new BathCenter(shampoo);bathCenter2.provideBathService();}
}

👻 新增搭乘电梯上2楼服务

// 上2楼服务实现:电梯服务
class ElevatorService implements BathProduct {@Overridepublic void use() {System.out.println("正在搭乘电梯前往2楼");}
}// 测试类
public class Main {public static void main(String[] args) {// 构造方法注入上2楼服务UpstairsService elevatorService = new ElevatorService();BathCenter bathCenter3 = new BathCenter(elevatorService);bathCenter3.provideBathService();}
}

结语

IoC模式不仅仅是一种设计模式,更是一种设计思想,通过它,我们能够构建出更加灵活、可测试和可维护的软件系统。在现实应用中,合理运用IoC模式能够为软件开发带来诸多益处

相关文章:

Spring IoC的基本概念

引言 在 Java 中,出现了大量轻量级容器,这些容器有助于将来自不同项目的组件组装成一个有凝聚力的应用程序。这些容器的底层是它们如何执行布线的常见模式,它们将这一概念称为“控制反转”。 🏢 本章内容 🏭 IoC服务…...

解决GitHub项目泄露API密钥问题

文章目录 所有的步骤参考gpt步骤一 使用环境变量步骤二 撤销并移除历史中的API密钥(1) 安装: pip install git-filter-repo(2) 清除特定文件 git filter-repo --path PATH_TO_YOUR_FILE --invert-paths出错解决 步骤三 处理移除的 origin 远程步骤四 强制推送到GitHub步骤五 重…...

【BUG】VMware|vmrest正在运行此虚拟机,无法配置或删除快照

VMware版本:VMware 16 文章目录 省流版问题解决方案 详细解释版问题解决方案总结 省流版 问题 只读,因为vmrest正在运行虚拟机。 解决方案 参考:虚拟机设置,只读,因为vmrest正在运行此虚拟机。有谁遇到过这种问题吗&…...

Ruby On Rails 笔记2——表的基本知识

Active Record Basics — Ruby on Rails Guides Active Record Migrations — Ruby on Rails Guides 原文链接自取 1.Active Record是什么? Active Record是MVC模式中M的一部分,是负责展示数据和业务逻辑的一层,可以帮助你创建和使用Ruby…...

VideoConvertor.java ffmpeg.exe

VideoConvertor.java ffmpeg.exe 视频剪切原理 入点 和 出点 选中时间点,导出...

java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigur

在运行代码的过程中,报出以下错误: java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.redisTemplate 或者是: Caused by: java.lang.IllegalArgu…...

C#设计模式--策略模式(Strategy Pattern)

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需…...

Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物

前言 在前端开发中,优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标,Tree Shaking 就是其中一种非常重要的优化技术,它通过在编译阶段移除未被使用的代码模块,从而显著减小最终…...

C++(十二)

前言: 本文将进一步讲解C中,条件判断语句以及它是如何运行的以及内部逻辑。 一,if-else,if-else语句。 在if语句中,只能判断两个条件的变量,若想实现判断两个以上条件的变体,就需要使用if-else,if-else语…...

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇,调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手,你需要查询相应地区的天气&#x…...

Jmeter进阶篇(30)深入探索 JMeter 监听器

前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…...

HTTP multipart/form-data 请求

序言 最近在写项目的过程中有一个需求是利用 HTTP 协议传输图片和视频,经过查询方法相应的方法发现使用 multipart/form-data 的方式,这是最常见处理二进制文件的表单编码类型。  学习了一下午,现在总结一下使用的方法和相关的知识点&#x…...

记录关于阿里云智能媒体预览pdf文件的问题

pdf仅支持预览,不支持编辑,需要将权限设置成只读。 readonly参数一定要传,不能不传!!!! readonly的设置一定要用示例提供的方法!!!! 用WebofficeP…...

Milvus向量数据库01-基础概念

Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …...

字节高频算法面试题:小于 n 的最大数

问题描述(感觉n的位数需要大于等于2,因为n的位数1的话会有点问题,“且无重复”是指nums中存在重复,但是最后返回的小于n最大数是可以重复使用nums中的元素的): 思路: 先对nums倒序排序 暴力回…...

PowerShell 脚本实战:解决 GitLab 仓库文件批量重命名难题

使用PowerShell脚本解决文件重命名问题:一次实践经验分享 在软件开发过程中,我们经常会遇到需要批量处理文件的情况。最近,我在一个项目中就遇到了这样一个需求:将GitLab仓库中所有的.ts和.py文件的扩展名修改为原扩展名加上&quo…...

爬取的数据能实时更新吗?

在当今数字化时代,实时数据更新对于企业和个人都至关重要。无论是市场分析、商品类目监控还是其他需要实时数据的应用场景,爬虫技术都能提供有效的解决方案。本文将探讨如何利用PHP爬虫实现数据的实时更新,并提供相应的代码示例。 1. 实时数…...

【SKFramework框架核心模块】3-6、FSM有限状态机模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...

Python之爬虫入门(1)

目录 一、简介 二、爬虫的功能 1、爬虫的用处 2、爬虫的应用场景 三、爬虫的实现步骤 四、GET和POST方法 1、GET方法 (1)、简介 (2)、适用场景 2、POST方法 (1)、简介 (2)…...

《MySQL 表结构设计基础》

一、引言 MySQL 表结构设计是数据库开发中的重要环节,合理的设计不仅能提高数据库性能,还能使数据更易于维护和管理。本文将详细介绍 MySQL 表结构设计的基础要点。 在数据库开发中,MySQL 表结构设计的重要性不言而喻。一个良好的表结构设计…...

微信小程序 - 解决报错{“errno“:600001,“errMsg“:“request:fail errcode:-202cronet_error_code:-202error_msg:net::

前言 关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。 在微信小程序开发中,详细解决小程序请求接口报错:{“errno”:600001,“errMsg”:“request:fail errcode:-202cronet_error_code:-202error_msg:net::ERR_CERT_AUTH ORITY_INVALID”},微…...

k8s 为什么需要Pod?

Pod,是 Kubernetes 项目中最小的 API 对象,更加专业的说,Pod,是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资…...

react 使用状态管理调用列表接口渲染列表(包含条件查询,统一使用查询按钮,重置功能),避免重复多次调用接口的方法

react开发调用api接口一般使用useEffect来监听值的变化,通过值的变化与否来进行接口调用。 比如我们要进行一个查询接口 const [pageParams, setPage] useState({name: ,id: ,});const [dataList, setDataList] useState([]);const getList async () > {const…...

常见限流算法详细解析

常见限流算法详细解析 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低、超时、乃至宕机,甚至引发雪崩造成整个系统不可用。 限流,…...

第四十一天 ASP应用 HTTP.sys 漏洞 iis6文件解析漏洞和短文件漏洞 access数据库泄露漏洞

前言 随着时代的发展现在呀,这个ASp已经淡出大众的视线了 ,ASP之前的火爆程度无异于现在的PHP 大家的童年 4399 什么的网站都是这个搭建的ASP 简介 | 菜鸟教程 那大家想问为什么你妹的 这个这么火的网站搭建语言被淘汰了呢 其实多半是以为它的不开…...

LLM输出评估标准

LLM输出评估标准 LLM评估方法 响应的完整性和简洁性:确定大模型的响应是否完全解决用户查询,简洁性则评估生成响应的相关性。文本相似性指标:将生成的文本与参考文本进行比较,评估它们的相似度,并给出得分以理解大模…...

ansible学习笔记之02command模块与shell模块

目录 1、概述 2、模块介绍 2.1 command模块 2.2 shell模块 2.3 小结 3、实验 3.1 测试ls命令 3.2 测试环境变量 3.3 测试操作符">" 1、概述 本文介绍ansible的command模块与shell模块,并通过实验比对两个模块的异同。 2、模块介绍 2.1…...

Python 在同一/或不同PPT文档之间复制幻灯片

复制幻灯片可以帮助我们更高效地完成工作,节省大量的制作时间。通过复制现有的幻灯片,可以快速创建新的演示文稿,而无需重新设计板式样式等。此外,复制幻灯片还可以帮助我们保持内容的一致性,使整个PPT演示文稿看起来更…...

4. React 性能优化技巧:如何让你的应用更快

在构建大型应用时,性能优化是一个非常重要的话题。React 提供了许多优化工具,帮助我们提高应用的渲染速度和响应能力。本文将分享一些常见的 React 性能优化技巧。 4.1. 使用 React.memo 缓存组件 当组件的 props 没有变化时,React 默认不会…...

云标准:云计算标准

目录 云计算标准的定义和分类 云计算标准的内容 云计算标准的重要性 云计算标准化组织 5.云计算标准的具体实例 云计算标准是确保云计算技术、服务和应用发展的重要规范,它们对于提高云计算系统的互操作性、可靠性和安全性至关重要。以下是对云计算标准的详细解…...

Redis【2】- SDS源码分析

1 简介&基础用法 Redis 中用得最多的就是字符串,在 C 语言中其实可以直接使用 char* 字符数组来实现字符串,也有很多可以直接使用得函数。但是 Redis 并没有使用 C 语言原生的字符串,而是自己实现了一个 SDS(简单动态字符串&…...

力扣打卡8:最长上升子序列

链接:300. 最长递增子序列 - 力扣(LeetCode) 本题我开始想到的是dp,复杂度为O(n^2),这也是很经典的解法。 看到进阶解法可以O(nlogn),想到可能是要用到二分,但是,我想到的是和map排…...

记录一次老平台改造通知用户刷新页面,纯前端实现

记录一次老平台改造通知用户刷新页面,纯前端实现 方案概述背景现状问题本质 方案设计前提设计实现 其他补充写在最后的话抛出一个问题 方案概述 背景 前端构建完上线,用户还停留还在老页面,用户不知道网页重新部署了,跳转页面的时…...

ubuntu22.04 使用可以用的镜像源获取你要的镜像

默认的是不行的 不管pull啥镜像 仍然会出现这个错误 Error response form daemon:Get "https://registry-1.docker.io/v2": net/http: request canceled while waiting for connection (Client.Timeout exceeded while await) 操作方法是 如果在目录没有/etc/docker…...

Chrome扩展程序开发示例

项目文件夹内文件如下: manifest.json文件内容: {"manifest_version": 3,"name": "我的法宝","description": "我的有魔法的宝贝","version": "1.0","icons": {"…...

Linux 下使用飞鸽传书实现与Windows飞秋的通信

最近把单位的办公电脑换成Linux系统,但是其他同事们都使用飞秋2013进行局域网通信和文件传输,经过一番尝试,发现飞鸽传书For Linux 2014能够实现两者的互相通信。 飞鸽传书ForLINUXLinux版下载_飞鸽传书ForLINUX免费下载_飞鸽传书ForLINUX1.2…...

docker批量创建cloudstack虚拟主机脚本

批量创建cloudstack脚本 #!/bin/bash # 配置变量 container_prefix"cloudworker-" base_ip"192.168.1." start_ip2 #开始ip start_container2 #上同 end_container4 #结束ip 包括 network_name"my_macvlan_network" image_name"dockedahi:…...

SpringBoot项目集成MinIO

最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址:https://d…...

【Flutter】常用样式、方法、组件(长期更新中)

一、样式设置 设置颜色透明度:color: Color(0xff4B9E32).withOpacity(0.08) 二、常用方法 数组排序:list.sort(); **升序**:(obj1, obj2) > obj1.compareTo(obj2) **降序**:(obj1, obj2) > obj2.compareTo(obj1)obj1.co…...

dbus接口方法的variant类型传参详解

python实现c++中so库调用及dbus服务开发-CSDN博客 之前写的这篇博文介绍了如何创建一个dbus服务,但是注册的接口方法的入参还是比较简单的,实际上dbus的参数类型有很多种,调用方式也有多种,我们来逐一介绍下。 其实基础数据类型,如字符串、整型、浮点型、布尔型等大多数…...

【时时三省】(NIT计算机考试)Word的使用方法

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 一、软件简介 Microsoft Word,简称Word,是微软公司开发的一款文字处理软件,广泛应用于文档编辑、排版、打印等领域。无论是撰写论文、报告、简历&#xf…...

spring技术点

引入对象 Autowired 和 Resource的区别 Autowired 和 Resource的区别 valid 参数校验 jarkata进行SpringMVC校验 常规当前进行校验的配置操作,参考文档如下进行操作。 SpringMVC校验注解不生效 List类型参数校验 由于list类型默认不能进行标注校验实现&#x…...

工业—使用Flink处理Kafka中的数据_ChangeRecord1

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,当某设备 30 秒状态连续为 “ 预警 ” ,输出预警 信息。当前预警信息输出后,最近30...

实验日志——DETR

DETR训练日志 1. 代码来源 代码源自作者的Github: https://github.com/facebookresearch/detr?tabreadme-ov-file 2. 数据来源 在DETR中只使用了COCO2017数据集,其中训练集有118288张图像,验证集有5001张数据,测试集有40671张数据&#…...

前端常用缓存技术深度剖析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

汽车IVI中控开发入门及进阶(三十七):基于HFP协议的蓝牙电话

概述: HFP全称Hands-free Profile,是一款让蓝牙设备控制电话的软件,多用于汽车上。此类设备最常见的例子是车载免提装置与蜂窝电话或可穿戴无线耳机一起使用。该配置文件定义了支持免提配置文件的两个设备如何在点对点的基础上相互交互。免提模式的实现通常使耳机或嵌入式免…...

分布式系统架构1:共识算法Paxos

1.背景 今天开始更新分布式的文章,工作几年后还没系统的学习分布式的内容,趁着还有时间学习沉淀的时候多输出些文章 2.为什么需要分布式共识算法 思考:现在你有一份随时变动的数据,需要确保它正确存储在网络的几台不同机器上&a…...

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后,大模型(Large Language Model,简称LLM)相关技术在国内外可谓百家争鸣,遍地开花,在传统数据挖掘、机器学习和深度学习的基础上,正式宣告进入快速发展的人工智能(Artificial Intellig…...

C# WPF抽奖程序

C# WPF抽奖程序 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.…...

linux运维命令

防火墙相关命令 防火墙规则查看 firewall-cmd --list-all 禁ping firewall-cmd --permanent --add-rich-rulerule protocol valueicmp drop firewall-cmd --reload 执行完以上命令后,通过firewall-cmd --list-all查看规则生效情况 firewall-cmd --list-all 其…...