运行在Guice注入器内部,@Injects不受`new`的尊重

我们有一个Swing应用程序,我们想添加一点依赖注入来使用Guice-3.0。 我们的理由是将我们的旧工厂迁移到更灵活的东西。

我已经确保应用程序在注入器内部运行,并且我们现在想让一个类的方式有一些@Inject注入的字段,并且对于未经训练的眼睛来说,在“新注入”时忽略此类上的@Inject注释“ 在跑。

现在的问题是,如果我已经正确地理解了在Guice注入器中首次运行时保证其@Inject注释得到尊重,或者如果在代码中的一个或多个new之后此属性丢失,那么这些类将被刷新。

换一种说法:

给定A从Guice获得B的一个实例,然后B创建new C() ,然后运行new D() ,并且D恰好具有@ Inject的内部,如果D由Guice处理?

如果是的话,我怎么可以添加代码到我的Guice配置中,让我看到Guice正在处理“new X()”,并且正在执行“@Inject setY(Y y)”? 我不介意这个日志会非常大 - 我只需要验证Guice是否按我的预期工作。


不,没有直接由new创造的东西是由Guice处理的...它不会做魔术。 Guice应该工作的方式是为您创建对象图。 您不应该在类中引用Injector ,并且您不应该使用new来创建要注入的服务。

以下是您可能拥有的一些选项:

  • C注入到B而不是new它。 将D注入到C
  • 如果您需要在类中创建这些多次的一方或双方你目前new的荷兰国际集团他们,注入Provider<C>Provider<D>代替,并使用get() ,而不是new
  • 如果在运行时只有可用的对象需要传递给这些类(基于用户输入或来自其他地方的数据,比如说)来创建它们,则可能需要使用Assisted Inject并注入CFactoryDFactory而不是Provider
  • 如果你真的找不到更好的方法,你可以使用injector.injectMembers(Object)来注入你用new创建的对象......但是很难说如果你这么做的话,Guice是否帮助你很多。

  • 正如ColinD指出的,在你的例子中,D不会由Guice创建。 在Object上调用new将在Guice DI之外构造它。 如果你想确认通过Guice创建了什么,你可以将日志记录添加到@Inject setter方法中,或者如果你正在做构造函数注入,你可以添加一个新的方法来记录目的:

    @Inject
    public void log() {
        logger.debug(//check if injected classes have been set)
        ...
    }
    

    在将一个大的Swing应用程序转换为使用Guice并从头开始编写一个新的应用程序之后,需要记住一些事项。

    1)Guice不是为桌面应用程序设计的。 它创建用于服务器上。 启动时间不是考虑在内的事情。 将Swing应用程序从所有静态工厂完全转换为所有Guice后,它会在启动时间上加上30/60秒,具体取决于它是冷启动还是热启动。

    2)仅添加一些Guice是非常困难的。 正如你现在发现的,你很快就会想要对一个构造类进行三级深度依赖,并且必须将其全部转换为Guice,或者开始通过构造函数传递大量类并添加getters

    3)谨防热切地用Guice创造物体。 默认情况下@Singleton在启动时急切地构造对象。 这对于启动应用程序的时间可能是灾难性的。 如果你担心这个问题,Guice论坛上有一个关于创建@EagerSingleton或@LazySingleton的好主意,可能想要查看

    4)与所有的说法一样,Guice非常棒,只需要知道它如何在桌面应用程序中获得良好的性能

    链接地址: http://www.djcxy.com/p/94645.html

    上一篇: Running inside Guice injector, @Injects not respected on `new`

    下一篇: Guice expert question