【问题标题】:How to specify object instantiation order in guice?如何在guice中指定对象实例化顺序?
【发布时间】:2020-05-04 16:37:36
【问题描述】:

我在两个 Guice 模块中创建两个对象,Object1Object2。这两个对象都使用Object3。我如何控制 Guice 实例化 Object1Object2Object 12 之前)的顺序,因为 Object1 设置的 Object3 的状态是 Object2 所必需的?在春天,这类似于拥有@DependsOn。但我在 Guice 中找不到类似的东西。

GuiceModule1
    Object1(Object3)
GuiceModule2
    Object2(Object3)

我认为可以解决此问题的一种方法是在构造Object1 时将Object2 作为参数传递,但这听起来不正确,因为我必须这样做只是为了定义依赖项创建顺序。

【问题讨论】:

  • Guice 默认应该正确排列初始化顺序。在 spring 中,@dependsOn 的使用是为了解决诸如具有静态依赖关系的对象未由 spring 处理的问题。一个更具体的例子会有所帮助

标签: spring dependency-injection guice


【解决方案1】:

你不能通过一些注解或内置机制在 Guice 中强制执行注入顺序。

但是您可以通过要求类Object2 持有对Object1 的引用而不对引用做任何事情来欺骗Guice 强制注入顺序。它绝对不干净,但可以轻松完成工作。

依赖注入最佳实践提示

如果可能的话,您应该以一种注入顺序无关紧要的方式来重构您的类设计。依赖顺序应该是注入顺序的唯一驱动因素,而这正是 Guice 或其他 DI 框架擅长的地方。

也许这就是为什么 Guice 没有提供这样一个内置机制来强制执行注入顺序的原因,因为它会带来一些其他成本,例如维护注释,甚至如果您的引用发生剧烈变化时会产生一些矛盾,从而注释会与您的依赖关系图所说的相反。我想你知道我要去哪里了。

如果没有关于您的应用的更多信息,很难就如何“做得更好”提出建议。

无论如何,我希望它有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多