运行在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
。 CFactory
或DFactory
而不是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`