首页 > 解决方案 > Google guice 惰性绑定

问题描述

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

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

2) Providers 是在 guice 中延迟实例化类的唯一方法吗?

3)最后,假设我有一个模块A和模块B组装在一起来创建一个战争。A 的 guice 依赖项在它自己的 guice 模块中,B 也是如此。对几个类A有 maven 依赖。B

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

标签: guice

解决方案


为了:

guice 何时使依赖项可用?

一般来说,构造是惰性的(对于非单例类,这是直观的——除非有人告诉你在某处注入一个实例,否则你不知道你需要一个新实例)。一个例外是急切地构造(等待它)的急切单例。Scopes 上的文档有更多关于让你的 Singletons 渴望与否的信息。

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

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

当我知道我正在运行应用程序的功能不需要注入类时,我如何告诉 guice 忽略它们或在需要之前不关心它们?

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

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


更新:

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

还有最后一种方法您可能想尝试也可能不想尝试:您当前是否B在注入器上安装 's 模块,以便从中获取所需的类B?如果是这样,您可以考虑不安装B's 模块,而是将所需的提供程序添加到您自己的模块中,省略任何您不需要的(即有问题的)。但是,我不能保证这会解决您的问题,而无需查看您的代码:)


推荐阅读