【问题标题】:Does Injector.getInstance() always call a constructor?Injector.getInstance() 是否总是调用构造函数?
【发布时间】:2011-12-08 18:20:22
【问题描述】:

我正在调试 Guice 似乎没有调用构造函数的情况。 成功执行Foo foo = injector.getInstance(Foo.class)Foo是一个具体的类),调试器显示foo在这条语句后不为空......但构造函数没有被调用。

foo 的所有字段都是空的,并且我在构造函数中放入的在磁盘上创建文件的语句没有被调用。

没有其他构造函数,Foo 不是单例 - 只是正常绑定。这发生在应用程序启动时。 Foo 的构造函数完全从不运行 - 我提到它试图在构造函数中创建的文件永远不会创建,这意味着构造函数代码从未运行过。

我在 Play Framework 的引导类中运行,试图在 having some problems with Play's Guice Module 之后连接 Guice 以使用它。

编辑 - 我刚刚发现构造函数上缺少@Inject(它有参数,而@Inject 在此类构造函数上是必需的)。但是这个问题仍然有效——这里到底发生了什么? Guice 是在没有运行构造函数的情况下创建了对象,还是 Play?

【问题讨论】:

  • getInstance() 可能返回了一个缓存的(例如先前构建的)实例。
  • @MДΓΓБДLL - 感谢上帝 SO 的自动完成昵称。我编辑了这个问题 - 构造函数从未运行过 - 如果它运行了,它将在磁盘上创建一个文件。模块是空的,并且对象没有被标记为@Singleton,所以 Guice 本身不应该在这里缓存任何东西。

标签: java playframework guice


【解决方案1】:

不,一点也不。范围,例如单例,用于控制何时创建(和不)创建新对象。此外,某些东西可能会绑定到对象的现有实例。例如,如果FooenumgetInstance 肯定不会调用构造函数。

至于那里实际发生了什么,我不能说。对于正常绑定的东西(例如,不绑定到提供程序或现有实例),Guice 应该仅在具有 @Inject 带注释的构造函数或只有单个无参数构造函数的情况下创建对象。

【讨论】:

  • Foo 是正常绑定的,不是枚举,也不是@Singleton。构造函数代码从未为此对象运行过,否则我会看到在磁盘上创建了一个文件。发生了一些可疑的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多