gpt4 book ai didi

java - 将 Guice 单例服务注入(inject) Quartz 任务、Stripes ActionBeans 和 ServletContextListeners 的正确方法?

转载 作者:行者123 更新时间:2023-12-01 04:25:12 25 4
gpt4 key购买 nike

目前,我正在使用静态单例来获取 Guice 3.0 通过 DI 为我构建的单例服务 - 我相信这是一个可怕的黑客行为,根本不是使用 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 plugin会在那里帮助我,我确实连接了它,但最终得到了多个并行的 MyServices
  • ServletContextListener - 我认为可能是 Guice Servlet module可以以某种方式提供帮助,尽管我正在努力处理文档,因为它主要讨论用 Guice 配置替换 web.xml (此时不是我的首要任务)并将 HttpServletRequests 注入(inject) Guice 构造的对象(同样不是我想要做的)<
  • Quartz 工作 - 我在这里找到 something relevant ,但不确定它最终是否仍会创建一个与其他服务“并行”的 MyService
  • 从命令行运行批处理 - 这是简单的部分

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

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

最佳答案

所以您的代码片段存在一些问题。

  • 您不应该再将单例实现为静态变量;让 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);
}
}

关于java - 将 Guice 单例服务注入(inject) Quartz 任务、Stripes ActionBeans 和 ServletContextListeners 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18568212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com