gpt4 book ai didi

java - 在 Guice 中配置返回泛型类型的 Provider

转载 作者:搜寻专家 更新时间:2023-11-01 03:05:29 26 4
gpt4 key购买 nike

我正在尝试为使用 JDBI 创建的 DAO 设置一个 Provider。 JDBI 使用 Handle 对象(它是 JDBC Connection 的包装器),您可以使用 handle.attach(MyDaoType.class) 获取 DAO 。不必为每个 DAO 类编写单独的 Provider 实现,我认为这样做是有意义的:

public class DaoProvider<T> implements Provider<T> {

private final Class<T> daoType;
private final Handle handle;

@Injected
public DaoProvider(Class<T> daoType, Handle handle) {
this.daoType = daoType;
this.handle = handle;
}

@Override
public T get() {
return handle.attach(daoType);
}
}

但是将它与 Guice 联系起来似乎非常困难。我已经尝试按照 this answer 中的建议在第一个构造函数参数上使用 @Assisted 注释.我这样定义了一个工厂:

public interface DAOProviderFactory {
<T> DAOProvider<T> create(Class<T> daoType);
}

但不清楚我应该如何调用 FactoryModuleBuilder.implemented 方法,因为重点是我不想扩展我的提供者类。

我有一个工厂返回一个返回我真正想要的东西的提供者似乎也有点疯狂!

令我印象深刻的是,使用 Spring DI 容器可以很容易地做到这一点,所以我相信使用 Guice 可以做到这一点。谁能指出我正确的方向?

最佳答案

感谢@condit 指出了一些使我能够解决问题的方法。其实很简单。我更改了 Provider 实现,为 Handler 使用字段注入(inject),如下所示:

public class DAOProvider<T> implements Provider<T> {

private @Inject Handle handle;
private final Class<T> daoType;

public DAOProvider(Class<T> daoType) {
this.daoType = daoType;
}

@Override public T get() {
return handle.attach(daoType);
}
}

然后在我想要绑定(bind)的特定 DAO 类的任何模块或应用程序中,我可以执行如下操作:

bind(UserStore.class).toProvider(new DAOProvider<>(UserStore.class));
bind(MessageStore.class).toProvider(new DAOProvider<>(MessageStore.class));

Guice 然后自动将 Handle 注入(inject)到 DAOProvider 实例中。

关于java - 在 Guice 中配置返回泛型类型的 Provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24287204/

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