在Dropwizard应用程序中的Guice AbstractModule中注入配置

时间:2017-05-18 14:42:46

标签: java dependency-injection guice dropwizard

我正在开发使用Guice和Dropwizard开发的应用程序,我们在其中创建不同的包,如guice包,迁移包等,并将它们添加到initialize()方法中的bootstrap。

我正在尝试在MyModule类中注入Configuration对象,但无法执行此操作。

以下是Application类的代码:

public class MyApplication extends Application<MyConfiguration> {

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

    private GuiceBundle<MyConfiguration> guiceBundle = GuiceBundle.<MyConfiguration> newBuilder()
        .addModule(new MyModule()).enableAutoConfig(getClass().getPackage().getName())
        .setConfigClass(MyConfiguration.class).build(Stage.DEVELOPMENT);

    @Override
    public void initialize(Bootstrap<MyConfiguration> bootstrap) {
        bootstrap.addBundle(guiceBundle);
    }

    @Override
    public void run(MyConfiguration configuration, Environment environment) throws Exception {
        ...
    }
}

下面是Module类,它扩展了AbstractModule:

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {

    }
}

使用这种方法,我发现很难在Module类中注入Configuration对象,因为Configuration对象在initialize()方法中不可用,但在run()方法中可用。

有没有其他方法可以做到这一点?

注意:我知道另一种可以在run()方法中创建Module类对象的方法,用于创建注入器(在MyModule类的构造函数中将配置和环境对象作为参数传递)。但这需要我在run()方法中注册所有托管对象和所有资源。我想避免这样做。

1 个答案:

答案 0 :(得分:0)

Guice模块是存储配置的类,在创建注入器时会解析。您无法在模块中明确注入对象。

我不认为如果不查看GuiceBundle的内部内容,我就可以告诉你更多。