从 guiceModule 访问 dropwizard Bundle 实例
Accessing a dropwizard Bundle instance from guiceModule
我是 dropwizard 的新手,正在我的应用程序中使用 GuiceBundle 和 MongoBundle。
MongoClient 包装在一个 dropwizard Managed 对象中,并与应用程序的生命周期相关联。
public class SalApplication extends Application<SomeConf> {
...
private GuiceBundle<SomeConf> guiceBundle;
private MongoBundle<SomeConf> mongoBundle;
...
@Override
public void initialize(Bootstrap<SomeConf> bootstrap) {
// build bundles and add to bootstrap
...
}
@Override
public void run(SomeConf someConf, Environment env) throws Exception{
...
MongoClient client = mongoBundle.getClient();
MongoClientManager mongoDB = new MongoClientManager(client);
env.lifecycle().manage(mongoDB); //MongoClientManager implements Managed
}
我的小问题是,如何获取 MongoClient 对象。
该对象应该被注入到我的 DAO 中。
但是 如何从 guice 模块中访问 MongoClient 对象。
如果我在 guice 模块中构造另一个 MongoClient 对象,那么 Managed Object 的意义何在。我真的很困惑。
我找到了一种更简单的方法来实现我的需要。
我之前使用的是 com.meltmedia.dropwizard.dropwizard-mongo,它的 MongoBundle 构建了 MongoClient,它必须传递给我的 ManagedObject。
我停止使用它了。相反,我在 guice 模块中使用 mongo-java-driver 自己构建 MongoClient 对象,并将其注入到我的托管对象的构造函数中。
我建议您编写自己的 Guice 模块。虽然 dropwizard-guice 非常有用,但它自 2017 年 2 月以来就没有更新过,并且只支持 DW 的最高版本 1.0.0。您的模块的基本版本可能如下所示:
public class CustomModule implements Module {
private final MongoClient mongoClient;
public CustomModule(MongoClient mongoClient) {
this.mongoClient = mongoClient;
}
@Override
public void configure(Binder binder) {
binder.bind(MongoClient.class).toInstance(mongoClient);
}
}
然后您可以使用 Guice 标准方法从应用程序 class 中的 "run" 方法初始化:
public class SalApplication extends Application<SomeConf> {
...
@Override
public void run(SomeConf someConf, Environment env) throws Exception{
Guice.createInjector(new CustomModule(mongoBundle.getClient());
...
}
}
我是 dropwizard 的新手,正在我的应用程序中使用 GuiceBundle 和 MongoBundle。 MongoClient 包装在一个 dropwizard Managed 对象中,并与应用程序的生命周期相关联。
public class SalApplication extends Application<SomeConf> {
...
private GuiceBundle<SomeConf> guiceBundle;
private MongoBundle<SomeConf> mongoBundle;
...
@Override
public void initialize(Bootstrap<SomeConf> bootstrap) {
// build bundles and add to bootstrap
...
}
@Override
public void run(SomeConf someConf, Environment env) throws Exception{
...
MongoClient client = mongoBundle.getClient();
MongoClientManager mongoDB = new MongoClientManager(client);
env.lifecycle().manage(mongoDB); //MongoClientManager implements Managed
}
我的小问题是,如何获取 MongoClient 对象。 该对象应该被注入到我的 DAO 中。 但是 如何从 guice 模块中访问 MongoClient 对象。
如果我在 guice 模块中构造另一个 MongoClient 对象,那么 Managed Object 的意义何在。我真的很困惑。
我找到了一种更简单的方法来实现我的需要。
我之前使用的是 com.meltmedia.dropwizard.dropwizard-mongo,它的 MongoBundle 构建了 MongoClient,它必须传递给我的 ManagedObject。
我停止使用它了。相反,我在 guice 模块中使用 mongo-java-driver 自己构建 MongoClient 对象,并将其注入到我的托管对象的构造函数中。
我建议您编写自己的 Guice 模块。虽然 dropwizard-guice 非常有用,但它自 2017 年 2 月以来就没有更新过,并且只支持 DW 的最高版本 1.0.0。您的模块的基本版本可能如下所示:
public class CustomModule implements Module {
private final MongoClient mongoClient;
public CustomModule(MongoClient mongoClient) {
this.mongoClient = mongoClient;
}
@Override
public void configure(Binder binder) {
binder.bind(MongoClient.class).toInstance(mongoClient);
}
}
然后您可以使用 Guice 标准方法从应用程序 class 中的 "run" 方法初始化:
public class SalApplication extends Application<SomeConf> {
...
@Override
public void run(SomeConf someConf, Environment env) throws Exception{
Guice.createInjector(new CustomModule(mongoBundle.getClient());
...
}
}