我们有一个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是否正常运行。
答案 0 :(得分:7)
不,直接用new
创建的没有由Guice处理......它不会做魔术。 Guice的工作方式是它为你创建对象图。您不应该在类中引用Injector
,也不应该使用new
来创建要注入的服务。
以下是您可能拥有的一些选项:
C
注入B
而不是new
。将D
注入C
。new
进入,请注入Provider<C>
或Provider<D>
并使用{{1}而不是get()
。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非常棒,只需要知道它如何在桌面应用程序中使用它来获得良好的性能