Google guice 惰性绑定

Google guice lazy bindings

我们被要求探索 guice 作为一个依赖注入框架,因为它是轻量级的。我 learning/experimenting 有 guice 并且有几个我无法理解的问题所以我想问一下。

1) guice 什么时候提供依赖项?在 Guice.createInjector 行的执行期间,ajf 然后读取模块并构建整个对象图?还是在第一次构造对象或调用方法时注入?

2) 提供者是在 guice 中延迟实例化 classes 的唯一方法吗?

3) 最后,假设我有一个模块 A 和模块 B 组装在一起创建一个 war。 A 的 guice 依赖项在它自己的 guice 模块中,B 的也是。 AB 有一些 class 的 Maven 依赖。

我知道 B 中的特定 class 永远不需要通过 guice 注入,因为它根本不会在 A 中被调用我不给它一个约束力。但是 guice 告诉我,我没有绑定 B 中的 class 并抛出 ProvisionException。当我知道我是 运行 的功能时,应用程序不需要注入 class 如何告诉 guice 在需要时忽略它们或不关心它们?

依次为:

guice 什么时候使依赖项可用?

一般来说,构造是惰性的(对于非单例 classes,这是直观的——直到有人告诉你在某处注入一个实例,你才知道你需要一个新实例)。 eager singletons 是例外,它们是急切构建(等待它)的。 The documentation on Scopes 有更多关于让你的单身人士渴望或不渴望的信息。

Provider 是在 guice 中延迟实例化 classes 的唯一方法吗?

不,@Inject 注释或手动调用 Injector 实例也是惰性的。单例提供程序是获得急切实例化的唯一方法。

当我知道我要 运行 应用程序的功能时,不需要注入 class 如何告诉 guice 是否忽略它们关心他们直到需要它?

我环顾四周,但找不到答案,除了我最初想到的简单答案:存根一个无用的提供者。它不干净,但如果您不能更改 B,我看不到解决此问题的干净方法。

更广泛地说,我很好奇 B 的所有者做了什么导致了这个错误,是否是 "worth it"。我喜欢只在我的 Guice 模块和静态 (main()) 方法中保留注入逻辑。这样,任何人都可以使用我的 classes,无论他们是否也使用 Guice 或其他框架。


更新:

您可以通过使用 DEVELOPMENT 阶段解决#3,这将避免预先检查是否提供了所有注入。但是,这可能 不是 一个好主意 - PRODUCTION 中的 运行 会更干净,并且编写一个无用的提供程序。

还有最后一种您可能想尝试也可能不想尝试的方法:您目前是否在注射器上安装了 B 的模块,以便从 B?如果是这样,您可以考虑不安装 B 的模块,而是将所需的提供程序添加到您自己的模块中,省去任何您不需要的(即有问题的)。不过,我不能保证这会解决你的问题,因为我没有看到你的代码:)