你好,我正在尝试使用下拉向导框架创建一个应用程序。我有DAO类impl,它需要连接管理器实例的句柄,然后用来获取数据库连接。我有一个多租户数据库应用程序。此连接管理器将是自定义实现。
应用程序使用hikari作为连接池和mysql数据库。我希望使用下拉向导托管对象功能初始化数据源和连接池。初始化数据源后,我希望使用guice绑定将连接管理器实例注入到每个dao类中
bind(ConnectionManager.class).toProvider(ConnectionManagerProvider.class);
然后在每个dao impl类中
@Inject
public class UserDAOIpl extends AbstractDAO {
protected UserDAOImpl(ConnectionManager connectionManager) {
super(connectionManager);
}
}
我已经在网上到处查找过了,我的用例没有特别的例子。此外,dropwirzard.io缺乏文档。
这更像是一个架构设计问题,而不是代码问题。
数据源模块将是一个单独的模块,将用于许多服务。我正在使用maven作为构建工具。
我的问题是
我期待着社区的任何指导,或者如果有任何机构能给我提供一些好的资源。
注意:我们不会在这个应用程序中使用hibernate,而是使用JDBI。
发布于 2015-04-10 12:30:51
我准备了一个类似于下面描述的设置。它设置guice,初始化一个DBIFactory (您可能需要在您的场景中采用这个部分)。然后将一个JDBI对象移交给存储库实现,该实现可以使用它来持久化类型为Vessel
的实体。
(1)将guice添加到项目中
<dependency>
<groupId>com.hubspot.dropwizard</groupId>
<artifactId>dropwizard-guice</artifactId>
<version>x.x.x</version>
</dependency>
(2)在initialize()
中设置Guice:
guiceBundle = GuiceBundle.<YourConfiguration>newBuilder()
.addModule(new GuiceModule())
.enableAutoConfig("your.package.name.heres")
.setConfigClass(YourConfiguration.class)
.build();
(3)用于准备JDBI元素的Guice配置
public class GuiceModule extends AbstractModule {
private DBI jdbi;
@Provides
public DBI prepareJdbi(Environment environment,
SightingConfiguration configuration) throws ClassNotFoundException {
// setup DB access including DAOs
// implementing a singleton pattern here but avoiding
// Guice to initialize DB connection too early
if (jdbi == null) {
final DBIFactory factory = new DBIFactory();
jdbi = factory.build(environment, configuration.getDataSourceFactory(), "h2");
}
return jdbi;
}
@Provides
public VesselJDBI prepareVesselJdbi(DBI jdbi) {
return jdbi.onDemand(VesselJDBI.class);
}
@Override
protected void configure() {
bind(VesselRepository.class).to(VesselRepositoryImpl.class);
/* ... */
}
}
(4)开始在你的课堂上使用它
public class VesselRepositoryImpl implements VesselRepository {
private VesselJDBI jdbi;
@Inject
public VesselRepositoryImpl(VesselJDBI jdbi) {
this.jdbi = jdbi;
}
public Vessel create(Vessel instance) {
return jdbi.inTransaction((transactional, status) -> {
/* do several things with jdbi in a transactional way */
});
}
}
(请注意:最后一个代码示例使用了Java 8。若要将JDBI与Java8一起使用Dropwizard 0.8.1,请使用jdbi版本2.62以避免bug https://github.com/jdbi/jdbi/issues/144)
如果这对你有帮助,请告诉我。
诚挚的问候,
亚历山大
发布于 2015-09-23 08:51:02
我不能对此发表评论,但想补充一下亚历克斯的回答:
对于存储库实现,我建议由jDBI来处理存储库,而不是使用Guice。我所做的是:
在Guice模块中,添加一个提供方法:
@Provides
@Singleton
public void repository(Dbi dbi) {
// dbi.onDemand(whateverYourClassIs.class)
}
在存储库类中,使用@CreateSqlObject使DAO可用:
public abstract class Repo {
@CreateSqlObject
abstract Dao dao(); // will return a jDBI managed DAO impl
public void doWhatever() {
/// logic
}
}
这有一个明显的优点,即您现在可以使用jDBI注释。(我还没有找到直接和guice一起使用它们的方法)。例如,如果您需要在事务中执行DAO代码,这是非常好的。Repository仍然是在Guice中处理的,因此它可以被注入到任何地方,但是jDBI处理DAO/Repository代码中的棘手部分。
希望这会有所帮助:)
阿图尔
https://stackoverflow.com/questions/29203709
复制相似问题