我正在调试 Guice 似乎没有调用构造函数的情况。
它成功执行了Foo foo = injector.getInstance(Foo.class)
(Foo
是具体类),调试器显示foo
不是此语句后为 null ... 但未调用构造函数。
foo
的所有字段都是空的,并且我放入构造函数中的在磁盘上创建文件的语句没有被调用。
没有其他构造函数,Foo
不是单例 - 只是正常绑定(bind)。这是在应用程序启动时发生的。 Foo
的构造函数根本从不 运行 - 我提到它试图在构造函数中创建的文件从未创建,这意味着构造函数代码从未运行。
我在 Play Framework 的 Bootstrap 类中运行,试图在 having some problems with Play's Guice Module 之后连接 Guice 来使用它.
编辑 - 我刚刚发现我在构造函数上缺少一个@Inject(它有参数,并且@Inject 对此类构造函数是强制性的)。但问题仍然有效——这里到底发生了什么? Guice 是在没有运行构造函数的情况下创建了对象,还是在 Play 中创建了对象?
最佳答案
不,一点也不。作用域(例如单例)的存在是为了控制何时创建(和不创建)新对象。此外,某些东西可能绑定(bind)到对象的现有实例。例如,如果 Foo
是一个 enum
,getInstance
肯定不会调用构造函数。
至于那里到底发生了什么,我不能说。对于正常绑定(bind)的内容(例如,不绑定(bind)到提供者或现有实例),Guice应该只创建一个对象,如果它有一个 @Inject
注释构造函数或只有一个,无参数构造函数。
关于java - Injector.getInstance() 是否总是调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8435686/