Cpt*_*ard 7 dependency-injection guice jdbi dropwizard
我目前正在构建一个Dropwizard + Guice + Jersey-based应用程序,其中数据库访问暂时由JDBI处理.
我想要实现的是拥有典型的企业架构,其中Resources访问服务类访问DAO类,而DAO类又访问数据库.如果所有其他方法都失败了,我想我可以在应用程序的run()方法中构建我的对象图,这将很高兴以正确的DI方式连接所有这些.
所以,我遇到了之前提到的这个问题:获取DBIFactory需要环境和配置,当Guice执行注入魔法而不是run()时,它需要在某种程度上可用. .
作为一个Dropwizard和Guice noob,到目前为止我设法把它放在一起就是我需要一个Provider来为我的DAO对象提供一些东西.
public class UserDAOProvider implements Provider<UserDAO> {
@Inject
Environment environment;
@Inject
Configuration configuration;
@Override
public UserDAO get() {
final DBIFactory factory = new DBIFactory();
final (MyConfiguration) config = (MyConfiguration) configuration;
DBI jdbi = null;
try {
jdbi = factory.build(environment, config.getDataSourceFactory(),
"mysql");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jdbi.onDemand(UserDAO.class);
}
}
Run Code Online (Sandbox Code Playgroud)
将此注册为单身提供商应该让我将UserDAO注入我的服务.
现在,我们如何实际将环境注入到Provider中?目前我被困在Guice抱怨没有为环境找到合适的构造函数,所以它试图实例化它而不是从Dropwizard本身获取它.
看起来这是可行的; 有一个dropwizard-guice包,我认为DropWizardEnvironmentModule是我需要的.但我觉得我只是错过了一些难题,以便了解如何将事情放在一起.到目前为止,我还没有找到一个完整的工作示例......
这就是我使用 Guice 和 Dropwizard 的方式。在 run() 方法中添加以下行
Guice.createInjector(new ConsoleModule());
Run Code Online (Sandbox Code Playgroud)
您不能注入 Environ
创建类 ConsoleModule
public class ConsoleModule extends AbstractModule {
//configuration and env variable declaration
public ConsoleModule(ConsoleConfiguration consoleConfig, Environment env)
{
this.consoleConfig = consoleConfig;
this.env= env;
}
protected void configure()
{
//You should not inject Configuration and Environment in your provider since you are mixing
//dropwizard framework stuff with Guice.Neverthless you will have to bind them in the below order
bind(Configuration.class).toInstance(consoleConfig.class);
bind(Environment.class).toInstance(env.class);
bind(UserDAO.class).toProvider(UserDAOProvider.class).in(Singleton.class);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15531 次 |
最近记录: |