gpt4 book ai didi

java - GenericDAO 与 Guice,玩转泛型和参数化类型

转载 作者:行者123 更新时间:2023-11-29 07:17:12 37 4
gpt4 key购买 nike

大多数人应该熟悉为 Spring + hibernate 制作通用 DAO。引用来自这里http://www.ibm.com/developerworks/java/library/j-genericdao/index.html但在 Single DAO & generic CRUD methods (JPA/Hibernate + Spring) 上有改进

此改进是检测类型,因为它是父类(super class)的一部分,而不是使用构造函数来判断它是哪个类

public GenericDaoJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass
.getActualTypeArguments()[0];
}

但是,此转换将因 Guice 而失败。要被注入(inject),接口(interface)和类需要像这样绑定(bind)在一个模块中

bind(TestDao.class).to(TestDaoImpl.class);

这样做的话,我们的 GenericDAO 的构造函数将无法工作,原因如下:

getClass().getGenericSuperclass() = java.lang.Class
getClass().getName() = com.gwtplatform.samples.basic.server.dao.TestDaoImpl$$EnhancerByGuice$$5fe0d6fd

与 Spring + Hibernate 返回的相反

getClass().getGenericSuperclass() = sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
getClass().getName() = com.gwtplatform.samples.basic.server.dao.TestDaoImpl

我现在只是在我的扩展 DAO 中使用 super 构造函数,但仍然想获取类型而不是提供它,有什么想法吗?

最佳答案

“guicy”方式是让 Guice 将 TypeLiteral 注入(inject)您的代码。

bind(new TypeLiteral<Dao<Foo>>(){}).to(GenericDAO.class);

然后……

class GenericDao implements Dao<T>
@Inject
GenericDao(TypeLiteral<T> type) {
this.whatever = type;
}
}

Guice 知道 T 的类型并且很乐意告诉您。 TypeLiteral 具有获取原始底层类型的访问器。

guice 文档关于此技术的信息很少,但这篇博文很有帮助:http://blog.publicobject.com/2008/11/guice-punches-erasure-in-face.html

关于java - GenericDAO 与 Guice,玩转泛型和参数化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569152/

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