依赖注入不是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... 阅读详情

相关推荐

实测对比:DJI O3、Walksnail Avatar、HDZero三大高清图传,谁才是低延迟王者?

本文对DJI O3、Walksnail Avatar V2和HDZero三大高清图传系统进行了实测对比,重点分析其在FPV飞行中的低延迟表现。通过专业测试环境和量化数据,揭示HDZero在原生低延迟架构上的优势,DJI O3在画质与延迟间的平衡,以及Walksnail的动态码率调整特点,为不同场景下的选购提供决策依据。

weixin_30756499的博客 447

依赖注入框架Google Guice

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

weixin_30933531的博客 239

Outlook邮件备份全攻略:从导出到导入的完整流程(附常见问题解决)

本文提供了一份详尽的Outlook邮件备份全攻略,涵盖从导出到导入的完整流程。重点解析了经典桌面版Outlook的.pst文件备份方法、进阶的智能筛选备份策略,以及如何通过导入恢复和工具验证确保备份可用。同时,文章还介绍了构建自动化备份体系与异地容灾的最佳实践,并附有常见问题解决方案,帮助用户建立可靠的邮件数据安全防线。

weixin_29248611的博客 900

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

城市NOA加速落地,BEV+Transformer引领自动驾驶感知新范式

数据闭环能力的建立,不仅依赖于数据规模,还依赖于数据的筛选、回传、标注、训练、验证与再部署,数据之于自动驾驶的价值再被印证的同时,也将推动自动驾驶迈向更为高阶的智能化时代。6月份,理想汽车向早鸟用户推送了首个不依赖高精地图的城市NOA。而特斯拉推出的基于BEV+Transformer的自动驾驶感知路线,可将2D图像转化为BEV鸟瞰图视角下的3D图像,并基于更庞大、更复杂、参数更多的感知算法模块,利用Transformer的注意力机制,将各个传感器统一到同一个连续的四维(三维空间+一维时间)时空中。

manfukeji的博客 1398

【参数不确定】敏感性分析(sensitivity analysis)

【运筹学】灵敏性分析

羊肉蛋花汤的博客 14万+

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

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

weixin_39628945的博客 231

STM32F103C8T6 驱动2位共阳数码管(基于 74HC595 和 PNP 三极管)

整体设计思路是通过 STM32F103C8T6 控制 74HC595 和 PNP 三极管,实现共阳数码管的显示功能。最初的电路设计中,三极管发射极接 5V 电源,这导致了数码管两位显示相同数字的问题。数码管能够稳定显示 0-99的数字。

qq_40289410的博客 2214

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

Unity引擎开发:复杂动作系统_动作捕捉数据的应用与整合

通过以上步骤,我们可以在Unity中有效地应用和整合动作捕捉数据,以实现更加真实和流畅的动画效果。从导入文件格式的选择,到预处理和优化,再到实时应用和调试验证,每一步都至关重要。希望本文能帮助你在Unity项目中更好地利用动作捕捉数据,提升动画质量和性能。

chenlz2007的博客 959

【推荐100个unity插件】基于关节物理控制的自行车、电动车、摩托车模拟解决方案——Simple Bicycle Physics

摘要 "简易自行车物理"是Unity的自行车模拟资源包,支持Animation Rigging,实现基于关节物理的自行车控制。兼容所有平台和渲染管线,包含预制体、材质、脚本等资源。核心脚本Bicycle Controller管理自行车物理属性,支持自定义角色设置和移动端控制。安装后,用户可快速配置骑行场景,调整转向、速度、重心等参数,并支持地面贴合、兔跳等功能。适用于开发各类自行车模拟游戏和应用。 (字数:149)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1366

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

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

weixin_32009069的博客 211

30天入门 SAP BTP 开发系列之十八:保姆级教程 - 如何部署 SAP UI5 到 SAP BTP Cloud Foundry 环境

本文摘要: 本文详细介绍了如何将SAP UI5应用部署到Cloud Foundry环境。首先需完成前17篇教程学习,创建SAP BTP子账户并启用Cloud Foundry环境。在SAP Business Application Studio中创建Fiori开发空间,导入GitHub上的UI5项目代码。通过npm run build命令打包成mtar文件后,使用cf deploy命令部署到Cloud Foundry。部署成功后,可在BTP控制台查看应用或通过命令行获取访问URL。整个过程涵盖了环境准备、代码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1020

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

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

Go中国 292

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

golang依赖注入——wire

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

archer的技术故事 5784

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java Spring Boot 与 Go(Golang)

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

qq_28791753的博客 3972

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Go工程化 - 依赖注入

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

daemon365的博客 1295

go 依赖注入设计与实现

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

rubys007的博客 1260

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

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

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

QcloudCommunity的博客 1347

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

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

t949500898的博客 1222

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

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

f905699146的博客 1736

Go的依赖注入库dig

什么是dig? dig是uber的开源的实现了依赖注入的一个库。如果你熟悉Java的话,我相信你对大名鼎鼎的Spring以及SpringIoC一定会有所了解,SpringIoC就是Java的依赖注入的实现。而dig则是golang的依赖注入的实现,不过dig很小巧且简洁,只不过易用性相较于SpringIoC会差一点。 第一个dig应用 从配置文件中读取配置信息 利用读取到的配置信息初始化简单的App对象 最后对User对象进行打印 安装库 由于需要读取配置文件,所以我们需要用到godotenv库,如果你

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值