使用Google Guice进行终身管理

rip*_*234 8 java dependency-injection guice object-lifetime

是否有建议的模式来关闭/关闭使用Guice创建的对象?

我的目标是:

  1. 准备一个Guice模块
  2. 创建一个注射器
  3. 通过代码使用注入器来获取对象(injector.getInstance(Foo.class))
  4. ...
  5. 关闭所述对象持有的所有资源(文件句柄,TCP连接等).我希望这是一个确定性的步骤(而不是"GC运行的某一天").

Mic*_*mlk 2

我希望这是一个确定性步骤(而不是“GC 运行的某一天”)。

抱歉,Java 语言不适合您。DI 框架不知道某个对象的所有引用何时消失。只有 GC 知道这一点。

如果您有“可关闭”资源,则使用 try/finally 模式来关闭它(见下文)。

Closable c = // ...
try {
   c.use();
} finally {
   c.close();
}
Run Code Online (Sandbox Code Playgroud)

现在回过头来兜售一下。Guice 可以知道范围何时开始和结束。您的自定义范围可以在完成时运行清理步骤。此作用域甚至可以返回代理,因此如果您尝试在允许的作用域之外访问它们,则对象将无效。

(哦,还有给 ColinD +1 - 注入提供商。:)

编辑Guiceyfruit似乎对生命周期有一些支持

  • 我认为这只是对 GC 用途的典型误解(如果您使用 C++ 编程,则特别容易犯此错误)。在垃圾收集语言中,对象生存期/GC 与释放文件句柄或网络套接字等资源无关。 (2认同)