依赖注入不是Java的专利,Golang也有

解析 Golang 官方依赖注入工具 wire 所谓依赖注入就是第二种思想。不夸张的说,依赖注入是保持我们的软件系统松耦合,可维护的最重要的设计原则。为什么?因为当你的依赖通过入参传入,意味着从本对象的角度,你不用去关心它的生成,只用关心它的能力。更具体来讲,它能让我们更加倾向于定义好接口,以接口方法来进行交互。而不是依赖一个具体的实现。由此而来的另一个好处在于测试。由于依赖是传入的,你的系统只管用它的能力,那么具体这个能力如何实现,其实是由上层来控制的。我们就可以很方便地进行 mock,调整各个场景下依赖的实现,来验证我们的 SUT 的表现。 阅读详情

0?wx_fmt=jpeg

笔者在使用Golang的时候就发现构建系统依赖树非常繁琐,New了很多对象,又手工代码将它们拼接起来,写了一堆非常冗繁的代码。然后就开始想,要是Golang像Java一样有一个好用的依赖注入框架就好啦。

果不其然,Golang还真有,居然还是大厂facebook团队开源的。

0?wx_fmt=jpeg

Golang的很多用户都不是来自Java,依赖注入他们可能听过,可是从来没有玩过。为了说明依赖注入有多好用,我先用Java代码来解释一下。

先来看一下没有依赖注入的Java世界是怎样的

Golang的很多用户都不是来自Java,依赖注入他们可能听过,可是从来没有玩过。为了说明依赖注入有多好用,我先用Java代码来解释一下。

先来看一下没有依赖注入的Java世界是怎样的

0?wx_fmt=jpeg

在main方法里面,我们new出来很多对象,然后用他们构造了一颗依赖树。我们还写了很多构造器,为了能方便的构造出每个节点。

0?wx_fmt=jpeg

然后我们用依赖注入框架来改造它。

0?wx_fmt=jpeg

这里我们使用的是另一个开源大厂google的依赖注入框架Guice。我们发现main方法缩减了很多代码,所有的new操作都不见了,然后我们还发现每个对象的构造器也消失了,取而代之的是多了两个注解@Singleton和@Inject,Singleton表示类是单例的,Inject表示当前字段使用依赖注入自动设置。好处不用多说,一目了然,就是帮我们节省代码,省去了很多系统初始化时构建一系列对象的细节。另外Guice还需要定义一个Module,把依赖树的叶子节点手工实例化一下,叶子结点对象往往不是简单的依赖注入,而需要手动构造。如果把整个系统的状态比喻成现实的物理世界,那么Module里面干的事就是宇宙大爆炸,所有一切对象的输入源点。依赖注入仅仅帮我们省去了中间节点的构建工作。

在我们的例子中,这棵树还谈不上复杂,毕竟节点数很有限,节点之间的连接也很有限。在大型的复杂业务系统中,这样的对象那就是成百上千了,如果没有使用依赖注入的话,那就真是剪不断理还乱了。

好,接下来我们说说facebookgo团队开源的这个Inject框架如何使用。我们还使用上面的例子,用golang 改写一下。

首先,我们看一下没有依赖注入的Golang世界是怎样的。

0?wx_fmt=jpeg

跟Java版本一样,定义了不少构造器,然后手工组装依赖树。

然后我们把这段代码改造成facebookgo依赖注入版本的

0?wx_fmt=jpeg

这个跟Java版本也很类似,只是Module的定义直接放在了main方法里,也就是上面代码中的Provide方法调用,@Singleton不需要了,@Inject变成了`inject:""`。然后用Populate方法一次性将整个依赖树构建出来就可以使用了。

看这个开源库的源码发现,整个类库的实现才500多行代码。这是多么轻量级的一个类库,只不过代码这么短,功能也不会太多,相比Java的依赖注入而言,它的功能就单一太多了。不过没关系,相比而言这些缺失的功能不是必须的,能帮我们省掉很多代码它已经做得很好了,这就足够了。要知道非常完善的依赖注入框架80%的代码那都是为了实现那20%的特殊功能,基本功能所需要的代码量是非常少的。

0?wx_fmt=jpeg

阅读更多相关文章,请关注公众号【码洞】

golang实现依赖注入 golang实现依赖注入 依赖注入是软件工程中经常使用到的一种技术,它提供了一种控制反转的机制,把控制权利交给了调用方。调用方来决定使用哪些参数,哪些对象来进行具体的业务逻辑。 它有几个好处: 1 它让调用方更灵活。 2 大量减少定义类型的代码量 3 增加代码的可用性,因为调用方只需要关注它需要的参数,不需要顾及它不需要的参数了。 什么是依赖注入 依赖注入使用最多的应该是java中的spr... 阅读详情

相关推荐

【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程

以下是基于团结引擎开发鸿蒙Unity应用的详细案例教程,整合环境配置、工程适配、跨语言通信等核心环节。

2201_75709314的博客 2485

依赖注入框架Google Guice

Spring框架的依赖注入是家喻户晓的,但是在实际的开发中我们想使用便捷的依赖注入功能,但是又不想引入Spring框架的复杂性,该怎么办呢? 有了Google Guice,这个问题便简单了,首先在你的maven项目里引入 官方文档里给出的例子又臭又长,我不使用官方的例子,下面我们来写个最简单的HelloWorld 我们使用Guice创建了一个注射器Injector,然后从Inject...

weixin_30933531的博客 239

5G移动网络运维(优化)

5G 网络优化现状 移动通信行业属于技术密集型行业,是国民经济的重要支柱以及整个社会经济运转体系中不可或缺的基础。2019 年年底 5G 开始商用,截止到 2020 年3月,我国三大运营商建设了 16.1 万个 5G 基站,我国成为目前全球 5G 基站最多的国家。预计到 2020 年年底,我国运营商会建设大概 70 万个 5G 基站。基于 5G高频段的特性,信号覆盖距离会低于ins 基站,再加上 5G 万物互联的巨大经济潜力价值需求,后续三大运营商在 5G 基站建设数量上势必会超过当前 LTE 基站数量的

2301_78171382的博客 1327

Quarkus框架二 常用注解

Quarkus常用注解一、@Singleton二、@Inject三、@Path四、@GET五、@POST六、@ConfigProperty七、@Default八、结束语 一、@Singleton @Singleton注解就是用于Bean注入的,类似于Spring中的单例Bean下的@Compone, 跟它搭配使用的就是@Inject 二、@Inject @Inject注解用于依赖注入, 类似于Spring中的@Autowired注解, 跟它搭配使用的有@Singleton、@ApplicationScop

qq_41874088的博客 2512

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2161

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 433

singleton 注入 java_java – Guice Singleton静态注入模式

你错误地考虑了依赖注入.依赖注入和服务定位器是彼此的镜像:使用服务定位器,您可以询问它是否为对象.使用依赖注入,你不会去寻找依赖,它们只是交给你.基本上,“它一直是乌龟”!应该注入你班级的每一个依赖.如果MyApplication需要MyConfiguration对象,它应该只接受MyConfiguration对象作为构造函数参数,而不用担心它是如何构造的.现在,这并不是说您永远不能手动使用new...

weixin_39628945的博客 231

odoo19/18集成reportbro 打印插件 完美支持静默打印

ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。ReportBro Designer可以轻松集成到您的Web应用程序中。每个人都可以设计和编辑文档模板,并直接在浏览器中预览它们。可以使用服务器上的 (有关完整的文档和演示,请参阅上的ReportBro项目网站。reportBro官方没有提供。测试环境:odoo17社区版。2.产品标签打印设计。

zxltwins的博客 2774

Google Guice依赖注入框架使用

Google Guice是一个轻量级依赖注入框架,和Spring类似。下面结合一些示例来讲解其使用方式。 首先引入maven依赖: <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.1.0</version> </dependency> 示例1: p...

happyzwh的专栏 2712

手把手教你用UC3844设计多路输出反激电源(附PCB布局避坑指南)

本文详细介绍了使用UC3844设计多路输出反激电源的实战技巧,包括核心电路设计、变压器参数计算、PCB布局优化及EMI抑制方法。通过实验室实测数据和项目经验,帮助工程师避开常见设计陷阱,提升电源性能和可靠性。特别附赠PCB布局避坑指南,助力高效完成开关电源设计。

weixin_30300225的博客 570

深入浅出:大型语言模型(LLM)的全面解读

在当今的数字化时代,人工智能技术已经成为各行各业的核心驱动力之一。而在人工智能的领域中,大型语言模型(LLM)作为一种引人瞩目的技术,正在以其强大的语言理解和生成能力引领着一场革命。本文旨在深入浅出地解读大型语言模型,探讨其背后的原理、技术突破、应用场景以及未来发展趋势。

fudaihb的博客 10万+

Blazor University (47)依赖注入 —— Singleton 依赖

原文链接:https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/singleton-dependencies/Singleton 依赖Singleton 依赖是一个由依赖它的每个对象共享的单个对象实例。在 WebAssembly 应用程序中,这是在浏览器的当前选项卡中运行的当前应用程序的...

dotNET跨平台 421

农业生产AI决策系统架构设计解密:数据层-模型层-应用层核心逻辑

想象一下,在一个炎热的夏日,传统农田里的农民伯伯正满头大汗地检查每一株玉米是否缺水;而几公里外的智慧农场里,一位年轻农民正在空调房里滑动手机屏幕,看着AI系统自动生成的灌溉计划——这就是农业生产AI决策系统带来的改变。本文的目的,就是要揭开这个"智能农业大脑"的面纱,详细讲解它的"身体构造"(架构设计)和"工作原理"(核心逻辑)。我们将聚焦系统最核心的三个部分:数据层(收集农田信息)、模型层(分析信息并思考决策)和应用层(将决策告诉农民)。

AI智能探索者的博客 1327

singleton 注入 java_依赖注入不是Java的专利,Golang也有

笔者在使用Golang的时候就发现构建系统依赖树非常繁琐,New了很多对象,又手工代码将它们拼接起来,写了一堆非常冗繁的代码。然后就开始想,要是Golang像Java一样有一个好用的依赖注入框架就好啦。果不其然,Golang还真有,居然还是大厂facebook团队开源的。Golang的很多用户都不是来自Java,依赖注入他们可能听过,可是从来没有玩过。为了说明依赖注入有多好用,我先用Java代码来...

weixin_32009069的博客 211

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一周 Go World 新鲜事[Asta 优选]

01golang实现微信聊天机器人主要模块获取UUID根据UUID获取二维码显示二维码扫码登陆初始化微信信息打开状态同步通知获取通讯录发送信息同步信息获取自动回复内容在公众号中回复(非评论)关键词“ 2018weekly06 ”即可阅读全文02依赖注入不是Java的专利,Golang也有笔者在使用Golang的时候就发现构建系统依赖树非常繁琐,New了很多对象,又手工代码将它们拼接起来,写了一堆非

Go中国 292

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

golang依赖注入——wire

最近在做golang的框架,发现golang同样需要类似java中spring一样的ioc依赖注入框架。 如果项目规模小的情况下,是否有依赖注入框架问题不大,但是当项目变大之后,有一个合适的依赖注入框架是十分必要的。 通过调研,了解到的golang中常用的依赖注入框架主要有 inject dig等等。但是今天要介绍的是wire,一个编译期实现依赖注入的框架。 好,下面上货。 首先添加依赖...

archer的技术故事 5784

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

go 依赖注入设计与实现

在现代的 web 框架里面,基本都有实现了依赖注入的功能,可以让我们很方便地对应用的依赖进行管理,同时免去在各个地方 new 对象的麻烦。比如Laravel里面的,又或者 Java 的Spring框架也自带依赖注入功能。今天我们来看看 go 里面实现依赖注入的一种方式,以inject库为例子(我们要了解一个软件的设计,先要看它定义了一个什么样的模型,但是在了解模型之前,我们更应该清楚了解,为什么会出现这个模型,也就是我们构建出了这个模型到底是为了解决什么问题。

rubys007的博客 1261

Java Spring Boot 与 Go(Golang)

随着后端框架的不断发展,开发人员面临着在项目中选择还是**Go (Golang)**的关键问题。这两个框架都功能强大,但适用于不同的用例。本文提供了详细的比较,并提供了技术基准、实际示例和用例场景,帮助开发人员做出明智的选择。

qq_28791753的博客 3972

Go工程化 - 依赖注入

让我们从金拱门回来,重新总结一下用 wire 做依赖注入的过程。创建wire.go文件,定义下你最终想用的实例初始化函数例如initApp(即 Injector),定好它返回的东西*App,在方法里用罗列出它依赖哪些实例的初始化方法(即 Provider)/或者哪些组初始化方法(ProviderSet)ProviderSet 就是一组初始化函数,是为了少写一些代码,能够更清晰的组织各个模块的依赖才出现的。也可以不用,但 Injector 里面的东西就需要写一堆。像这样。

daemon365的博客 1295

go的依赖注入究竟是毒药还是解药

go的依赖注入究竟是毒药还是解药?有人说go使用依赖注入属于是被JAVA洗脑无法自拔。它和java的Spring注解机制非常相像。依赖注入是一种设计模式,它允许将一个对象的依赖项(例如服务或组件)从外部注入,而不是在对象内部创建。这可以通过构造函数、方法或属性进行。

m0_70208894的博客 1094

【go】依赖注入

依赖注入是一种设计模式,可帮助您解耦实现的外部逻辑。实现需要外部 API 或数据库等是很常见的。知道这些东西不是实现的责任,它应该接收其依赖项并根据需要使用它们。假设您有一个具有以下依赖项的实现。你可以创建依赖项并将它们设置到您的服务/用例中。但这对于测试尤其不利,如果想更改依赖服务的实现比如数据库,比如如果您唯一的选择是编写集成测试而不是单元测试。实现方式如下依赖倒置原则。它允许您轻松切换某些依赖项的实现,并且您可以更改模拟实现的真实实现。它是单元测试的基础。...

qfzhangwei的专栏 1581

golang常用库包:Go依赖注入(DI)工具-wire使用

Python微信订餐小程序课程视频 https://blog.youkuaiyun.com/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.youkuaiyun.com/m0_56069948/article/details/122285941 google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI。

「 虚幻私塾」 2762

依赖注入(DI):对比Java,Go实现方式

熟悉Java语言的同学一定不陌生,依赖注入(Dependency Injection)是Spring框架中的设计基石,有开发经验的同学一定会熟知它的概念(当然也是面试常考问题)。 然而在Golang中,我发现很多项目的代码缺少了这一部分,这也是由于Golang并不是严格意义上的面向对象的编程语言。本文将从Java与Go常用框架的DI实现方式分析,详细介绍他们之间的区别。

t949500898的博客 1222

Golang 深度剖析 -- 理解Golang依赖注入

用过Java的都知道Spring框架,Spring核心是一个Ioc容器,各个模块都会注入到容器中,带来的优势是解耦,这样使得修改各个模块时不用管模块之间的依赖关系。 举个例子,一个服务里面有日志模块,配置模块,DB模块,业务模块等,其中日志模块依赖配置模块,DB模块依赖日志模块,配置模块,业务模块依赖所有基础模块。这样带来的一个问题是,如果有模块要修改,势必会影响其他模块,如果模块很多,还需要人为的规定初始化顺序,这对大型项目的维护来说是一件很恐怖的事,因此依赖注入的引入可以减少维护依赖关系的精力,专心使开

f905699146的博客 1736

Golang依赖注入提升开发效率!

导语|依赖注入并不是java独有的,也不是web框架独有的,本文用通俗易懂的语言讲解什么是依赖注入,为什么需要依赖注入,以及go语言如何使用依赖注入来提升开发效率。一、什么依赖注入依赖注入(Dependency Injection)也叫DI是软件工程的一种设计模式。二、为什么需要依赖注入比如我们使用go要开发一个http api服务,这个服务启动需要读取命令行读取配置连接数据库连接redis设...

QcloudCommunity的博客 1347
上一篇: 深度学习Java之内存模型【译】
下一篇: 有趣的Python开源库之Hashids
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值