在Guice注入器内部运行时,@ new在@ new`-ed类中不受尊重

时间:2011-05-25 11:31:27

标签: java debugging guice

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

我确保应用程序在一个注入器中运行,我们现在想让一个类向下有一些字段@Inject'ed,并且它出现给我未经训练的眼睛@Inject 正在运行时,将忽略此类上的注释。

现在的问题是,如果我已经正确理解了第一次在Guice注入器内运行时新的类被保证得到了@Inject注释,或者在你的代码中有一个或多个新的属性之后这个属性丢失了。 / p>

换句话说:

鉴于A从Guice获取B的实例,然后B创建new C(),而new D()依次运行{{1}},D恰好在@ Inject内部,如果D由Guice处理吗

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

2 个答案:

答案 0 :(得分:7)

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

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

  • C注入B而不是new。将D注入C
  • 如果您需要在课程中多次创建这些中的一个或两个,您当前new进入,请注入Provider<C>Provider<D>并使用{{1}而不是get()
  • 如果有些对象仅在运行时可用,需要传递给这些类(基于用户输入或来自其他地方的数据,比如说)来创建它们,您可能需要使用Assisted Inject并注入{{1} }或new代替CFactory
  • 如果你真的找不到更好的方法,你可以使用DFactory注入你用Provider创建的对象......但很难说Guice是否对你有所帮助你正在这样做。

答案 1 :(得分:4)

正如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或者通过构造函数开始传递大量类并添加getter

3)小心用Guice热切地创建对象。 @Singleton默认情况下急切地在启动时构造对象。这对应用程序的启动时间来说可能是灾难性的。如果您对此感到担心,Guice论坛上有一个关于创建@EagerSingleton或@LazySingleton可能想要查看的好帖子

尽管如此,Guice非常棒,只需要知道它如何在桌面应用程序中使用它来获得良好的性能