Java 带Guice的GenericDAO,使用泛型和参数化类型
大多数人应该熟悉为Spring+hibernate制作通用DAO。参考资料来自此处,但在此基础上有所改进 这种改进是检测类型,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类Java 带Guice的GenericDAO,使用泛型和参数化类型,java,hibernate,generics,guice,Java,Hibernate,Generics,Guice,大多数人应该熟悉为Spring+hibernate制作通用DAO。参考资料来自此处,但在此基础上有所改进 这种改进是检测类型,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类 public GenericDaoJpaImpl() { ParameterizedType genericSuperclass = (ParameterizedType) getClass() .getGenericSuperclass(); this.entityClass =
public GenericDaoJpaImpl() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass
.getActualTypeArguments()[0];
}
这样一来,我们的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中使用一个超级构造函数,但仍然希望获得类型而不是提供它,有什么想法吗?这些通用的技巧让我头疼,如果我在那里,我经常会问我是否应该,也许有更好的解决方案,但我认为你可以通过在Guice中使用提供者来做到这一点,因此,您正在传递实际的类,而不是让Guice创建它。所以
public class DAOProvider implements Provider<TestDaoImpl> {/*etc*/}
bind(TestDao.class).toProvider(new DAOProvider());
公共类DAOProvider实现提供程序{/*etc*/}
bind(TestDao.class).toProvider(新的DAOProvider());
这些通用技巧让我头疼,如果我在那里,我经常会问我是否应该在那里,也许有更好的解决方案,但我认为您可以通过在Guice中使用提供程序来实现这一点,因此您正在传递实际的类,而不是让Guice创建它。所以
public class DAOProvider implements Provider<TestDaoImpl> {/*etc*/}
bind(TestDao.class).toProvider(new DAOProvider());
公共类DAOProvider实现提供程序{/*etc*/}
bind(TestDao.class).toProvider(新的DAOProvider());
“guicy”方法是让Guice向代码中注入TypeLiteral
bind(new TypeLiteral<Dao<Foo>>(){}).to(GenericDAO.class);
bind(newtypeliteral(){}).to(GenericDAO.class);
然后
class GenericDao implements Dao<T>
@Inject
GenericDao(TypeLiteral<T> type) {
this.whatever = type;
}
}
类GenericDao实现Dao
@注入
GenericDao(TypeLiteral类型){
this.whatever=类型;
}
}
Guice知道T的类型,很高兴告诉你。TypeLiteral具有用于获取原始基础类型的访问器
guice文档中关于这项技术的宝贵信息很少,但这篇博文很有帮助:guice的方法是让guice将TypeLiteral注入到代码中
bind(new TypeLiteral<Dao<Foo>>(){}).to(GenericDAO.class);
bind(newtypeliteral(){}).to(GenericDAO.class);
然后
class GenericDao implements Dao<T>
@Inject
GenericDao(TypeLiteral<T> type) {
this.whatever = type;
}
}
类GenericDao实现Dao
@注入
GenericDao(TypeLiteral类型){
this.whatever=类型;
}
}
Guice知道T的类型,很高兴告诉你。TypeLiteral具有用于获取原始基础类型的访问器
guice文档中关于这项技术的宝贵信息很少,但这篇博文很有帮助:您可以使用以下代码从guice proxy获取底层类:
Class<?> clazz = getClass();
if (clazz.getName().contains("EnhancerByGuice")) {
clazz = clazz.getSuperclass();
}
Class clazz=getClass();
if(clazz.getName().contains(“EnhancerByGuice”)){
clazz=clazz.getSuperclass();
}
您可以使用以下代码从Guice proxy获取底层类:
Class<?> clazz = getClass();
if (clazz.getName().contains("EnhancerByGuice")) {
clazz = clazz.getSuperclass();
}
Class clazz=getClass();
if(clazz.getName().contains(“EnhancerByGuice”)){
clazz=clazz.getSuperclass();
}
我将此标记为答案,因为这是获取类型的一种方式,但对我来说,最终这只是很多代码,与自己提供类型相比。我将此标记为答案,因为这是获取类型的一种方式,但对我来说,最终这只是很多代码,与自己提供类型相比