其实,一直写Java,用Spring框架的同事,一定会觉得依赖注入就像呼吸一样。但是在其他语言的开发者看来却不尽言。

我在项目的开发过程中使用过Java,也使用过Go语言。见过很多写Go语言的同事对Spring框架嗤之以鼻。也被同事讲过写的代码Java味很重,emmm,学习一个语言就要学习它的最佳范式与哲学,这我无比地认同。

首先,依赖注入 != 依赖注入框架 ,比如

1
2
3
4
5
type Client struct {
logger *slog.logger
}

client.logger = newLogger()

其实,这样显式地为 logger 赋值,本身就是一种依赖注入。 只不过,它是手动注入,而非通过框架自动完成。

如果完全不用设置,那就代表这个模块是单例的,举个例子,Java中的log4j2,绝大部分场景下都是单例的,通过配置文件来反向控制某个包下面的日志级别等等。

之前读过一本书有个很有意思的理念,就是”包变量/静态变量”是不好的,是违反物理规律的。

只是由于种种原因,在程序运行时,只存在一个实例。25年1月份,在一个Go项目中,我做的一件重构就是把原本的包变量引用替换成了成员变量,因为发现在运行中会存在多个相应的struct实例,他们对这个变量的需求是不一样的。

那么依赖注入框架呢?
其实Go语言也有很多依赖注入框架,如果有很多的strcut都要get、set,那建议还是使用依赖注入框架。我做的项目没有使用依赖注入框架,主要有两点原因

  1. Go语言依赖注入没有形成统一的标准。
  2. 其次,目前产品还没有很多的strcut都要get、set。

DI框架本身也有学习成本,这块框架我没有详细了解,如果能在工程组织,测试上大大简化的话,我还是很乐意用的