1

目前,我正在使用静态单例来获取 Guice 3.0 通过 DI 为我构建的单例服务 - 我认为这是一个可怕的 hack,而不是使用 Guice 进行 DI 的预期方式,并且使单元测试复杂化。

public class ServiceProvider {
    private static ServiceProvider instance = new ServiceProvider();    
    private MyService myService;

    public ServiceProvider() {      
        Injector myInjector = Guice.createInjector(new MyModule());
        myService = noobmeterInjector.getInstance(MyService.class);
    }

    public static MyService getMyService() {
        return instance.myService;
    }
}

但是,我不太确定如何解决这个问题,因为我至少在四个不同的地方需要该服务:

  • Stripes ActionBeans - 我认为Stripes Guice 插件可以帮助我,我确实连接了它,但最终得到了多个并行的 MyServices
  • ServletContextListener - 我认为Guice Servlet 模块可能会有所帮助,尽管我在文档中苦苦挣扎,因为它主要讨论用 Guice 配置替换 web.xml(此时不是我的优先事项)并将 HttpServletRequests 注入 Guice 构造的对象(再次不是我想做的)
  • Quartz Jobs - 在这里我找到了一些相关的东西,但不确定它是否最终不会仍然创建一个“平行”的 MyService 到其他的
  • 批处理从命令行运行 - 这是简单的部分

MyService 服务旨在成为单例(它拥有开放的 DB/MQ 连接等的其他服务,因此创建多个这样的服务会很糟糕)。

是否有一些简单的方法可以在我缺少的 Guice 中执行此操作?

4

1 回答 1

0

因此,您的代码片段存在一些问题。

  • 您不应再将单例实现为静态变量;让 Guice 为您做生命周期管理。
  • 在这个例子中,ServiceProvider基本上是一个服务定位器实现,因为您使用的是 Guice,所以这是不必要的。
  • 保持Injector创作尽可能“高”是一种很好的做法。服务器启动的main方法将是一个好地方。

我添加了一些代码来演示。

public class Server {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        // Your code here.
    }
}

public class MyModule extends AbstractModule {
    protected void configure() {
         // Assuming MyService implements Service
         bind(Service.class).to(MyService.class).in(Singleton.class);
    }
}
于 2013-10-19T07:33:16.120 回答