【发布时间】:2025-12-18 15:55:01
【问题描述】:
我们的项目设置如下:
1) 主模块:包含启动 Spark 流服务器的驱动程序。它有自己的 Guice 注射器。
2) 当消息进入时,它会转到另一个模块,该模块创建它自己的 Guice 注入器。
3) 该模块使用其他模块中的类,这些模块本身使用依赖模块。这些模块中的每一个都创建了自己的 Guice 注入器,以便它可以独立工作、单独测试等。
这里有一个问题:现在我们需要一个单例,但是作为@Singleton 创建的对象绑定到一个注入器(而不是一个类加载器),所以当注入器消失时,对象消失了。
问题:
1) 我们的架构不好吗?我们不应该在每个模块中都创建一个注入器吗?
2) 我们如何创建一个即使在注入器消失时仍保留在 ClassLoader 中的 Singleton?
顺便说一句,我们在 Guice 上使用 Netflix Governator。
注意:对据称与此问题重复的问题的答案并未回答如何将在*模块上创建的“单一”注入器传递给子模块。另外,如果子模块本身没有注入器,我们可以为它们编写独立的单元测试吗?
【问题讨论】:
-
Singletons是 Java 中的反模式,因为它们不像您想象的那样与JVM绑定,它们与ClassLoader绑定,JVM实例可以有许多实例并且是一个根本不同的范围。如果您阅读了 Guice 文档,则有一个模块类型的概念 inheritance 允许 sub-Modules 具有父模块的范围。这是你需要使用的。 -
这个问题让我有些困惑,因为我不知道你的意思是“架构模块”还是“Guice
Module” -
Tavin - “模块”是指 Maven 下的模块。每个都有自己的 pom.xml,每个都有自己的 Guice 模块。
标签: java scala dependency-injection guice