java - 如何将 jdbiFactory DAO 注入(inject) Dropwizard 命令?

标签 java dependency-injection dropwizard jdbi

我开始使用 Dropwizard我正在尝试创建一个 Command这需要使用数据库。如果有人想知道我为什么要这样做,我可以提供充分的理由,但这不是我要问的重点。它是关于 Dropwizard 中的依赖倒置和服务初始化和运行阶段。

Dropwizard 鼓励使用其 DbiFactory to build DBI instances但是为了获得一个,您需要一个 Environment 实例和/或数据库配置:

public class ConsoleService extends Service<ConsoleConfiguration> {

  public static void main(String... args) throws Exception {
    new ConsoleService().run(args);
  }

  @Override
  public void initialize(Bootstrap<ConsoleConfiguration> bootstrap) {
    bootstrap.setName("console");
    bootstrap.addCommand(new InsertSomeDataCommand(/** Some deps should be here **/));
  }

  @Override
  public void run(ConsoleConfiguration config, Environment environment) throws ClassNotFoundException {
    final DBIFactory factory = new DBIFactory();
    final DBI jdbi = factory.build(environment, config.getDatabaseConfiguration(), "postgresql");
    // This is the dependency I'd want to inject up there
    final SomeDAO dao = jdbi.onDemand(SomeDAO.class); 
  }
}

如您所见,您在其 run() 方法中配置了服务及其环境,但需要在其 initialize() 中将命令添加到服务的 Bootstrap 中 方法。

到目前为止,我已经能够通过扩展 ConfiguredCommand 来实现这一点在我的命令中并在它们的 run() 方法中创建 DBI 实例,但这是一个糟糕的设计,因为 dependencies should be injected into the object instead of creating them inside .

我更愿意通过它们的构造函数注入(inject) DAO 或我的命令的任何其他依赖项,但目前这对我来说似乎是不可能的,因为 Environment 和配置在服务初始化时不可访问,当我需要创建它们并将它们添加到它的 Bootstrap 中。

有人知道如何实现吗?

最佳答案

你能用EnvironmentCommand吗? ?

关于java - 如何将 jdbiFactory DAO 注入(inject) Dropwizard 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319965/

相关文章:

java - 如何在没有 Shade 插件的情况下编译 DropWizard?

java - 适用于 OS X Lion 的 Netbeans 中的 JDK 7

java - 移动背景 Android

java - 无法执行字符串拆分

c# - 通过 Controller Factory 注入(inject)实例

angular - 注入(inject)ActivatedRoute会产生循环依赖错误

c# - 如果我为集线器定义构造函数,连接将关闭

java - 将 dropwizard 配置为(几乎)所有路由的服务器 index.html?

java - 在Dropwizard的数据库迁移包装器中,是否可以基于上下文进行迁移?

java:找出丢失符号的原始包