Java 带Guice的GenericDAO,使用泛型和参数化类型

Java 带Guice的GenericDAO,使用泛型和参数化类型,java,hibernate,generics,guice,Java,Hibernate,Generics,Guice,大多数人应该熟悉为Spring+hibernate制作通用DAO。参考资料来自此处,但在此基础上有所改进 这种改进是检测类型,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类 public GenericDaoJpaImpl() { ParameterizedType genericSuperclass = (ParameterizedType) getClass() .getGenericSuperclass(); this.entityClass =

大多数人应该熟悉为Spring+hibernate制作通用DAO。参考资料来自此处,但在此基础上有所改进

这种改进是检测类型,因为它是超类的一部分,而不是使用构造函数来判断它是哪个类

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();
}

我将此标记为答案,因为这是获取类型的一种方式,但对我来说,最终这只是很多代码,与自己提供类型相比。我将此标记为答案,因为这是获取类型的一种方式,但对我来说,最终这只是很多代码,与自己提供类型相比