Java 使用googleguice进行生命周期管理

Java 使用googleguice进行生命周期管理,java,dependency-injection,guice,object-lifetime,Java,Dependency Injection,Guice,Object Lifetime,是否有建议的模式用于关闭/关闭使用Guice创建的对象 我的生命周期目标是: 准备一个Guice模块 创建一个喷油器 通过代码使用注入器来获取对象(injector.getInstance(Foo.class)) 关闭所述对象持有的任何资源(文件句柄、TCP连接等)。我希望这是一个确定性步骤(而不是“GC运行的某一天”) 我希望这是一个确定性步骤(而不是“GC运行的某一天”) 很抱歉,但是Java对您来说是错误的语言。DI框架不知道对象的所有引用何时消失。只有GC知道这一点 如果您有一个“可关

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

我的生命周期目标是:

  • 准备一个Guice模块
  • 创建一个喷油器

  • 通过代码使用注入器来获取对象(
    injector.getInstance(Foo.class)
  • 关闭所述对象持有的任何资源(文件句柄、TCP连接等)。我希望这是一个确定性步骤(而不是“GC运行的某一天”)
  • 我希望这是一个确定性步骤(而不是“GC运行的某一天”)

    很抱歉,但是Java对您来说是错误的语言。DI框架不知道对象的所有引用何时消失。只有GC知道这一点

    如果您有一个“可关闭”的资源,那么使用try/finally模式来关闭它(见下文)

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

    (Oh和+1到ColinD-注入提供者:)


    编辑:要获得对

    的一些支持,您可能需要在您的问题中添加一些示例代码,因为我并不真正理解您的意思。“通过代码使用注入器来获取对象(injector.getInstance(Foo.class))”—这显然不是Guice或任何DI的使用方式。那只是一个服务定位器。它应该是构建对象图,注入器应该只在一些根引导程序类中创建和引用。我认为,在任何您可能想要使用injector.getInstance(Foo.class)的地方,您都应该能够注入一个提供程序并使用它。但是,该类清楚地声明了它所依赖的内容,而当您看到一个类引用了该注入器时,您不知道它可能会从中得到什么。是的,这对于单元测试来说是一个很大的不同。。。不必配置注入器,只需创建一个伪提供程序,以您希望的方式返回实例。您不再依赖于提供依赖项的机制。。。仅依赖于依赖项本身。这些评论是浪费时间!好问题!我认为这只是对GC用途的一个典型误解(如果您使用C++编程,就很容易犯这个错误)。在垃圾收集语言中,对象生存期/GC与释放文件句柄或网络套接字等资源无关。代码块不分配对象,因此不负责释放它。具体来说,Singleton(在GUI模块中)是由Injector.getInstance()获得的,但在使用后不应关闭。整个问题在很大程度上取决于您正在做什么以及在什么上下文中。不同的对象具有不同的生命周期、不同的作用域等,因此没有一个简单的解决方案。你是在网络应用程序中这样做的吗?您主要谈论的是关闭单例吗?单例只能在应用程序关闭期间“释放”(因此通过关闭挂钩)。我相信您可以编写一个作用域来处理这个问题。此外,如果代码块从提供程序检索一个没有作用域的对象并使用它,它肯定会在必要时负责关闭该对象,尽管它本身没有创建。
    Closable c = // ...
    try {
       c.use();
    } finally {
       c.close();
    }