【问题标题】:Google guice lazy bindingsGoogle guice 惰性绑定
【发布时间】:2019-08-15 11:27:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: guice


    【解决方案1】:

    按顺序:

    guice 何时使依赖项可用?

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

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

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

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

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

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


    更新:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多