我正在调试Guice不会调用构造函数的情况。
它成功执行Foo foo = injector.getInstance(Foo.class)
(Foo
是一个具体的类),调试器显示foo
在此语句后不为空......但是没有调用构造函数。
所有foo
的字段都为null,并且我没有调用在磁盘上创建文件的构造函数中放置的语句。
没有其他构造函数,Foo
不是单例 - 只是正常绑定。应用程序启动时会发生这种情况。 Foo
的构造函数从不运行 - 我提到它试图在构造函数中创建的文件永远不会被创建,这意味着构造函数代码永远不会运行。
我在Play Framework的bootstrap类中运行,尝试在having some problems with Play's Guice Module之后连接Guice以使用它。
编辑 - 我刚刚发现我在构造函数上缺少@Inject(它有参数,并且@Inject在这样的构造函数上是必需的)。但问题仍然有效 - 这里究竟发生了什么? Guice是否在不运行构造函数的情况下创建了对象,还是Play?
答案 0 :(得分:1)
不,一点也不。存在用于控制何时(而非)创建新对象的范围,例如单例。此外,某些东西可能绑定到对象的现有实例。例如,如果Foo
是enum
,则getInstance
肯定不会调用构造函数。
至于那里发生的事情,我不能说。对于通常绑定的东西(例如,不是提供者或现有实例),Guice只应创建一个对象,如果它有一个@Inject
带注释的构造函数或者只有一个没有arg的构造函数