您在Spring中有一个Generic类,我想为注入的bean获取通用的T类类。我知道classic way in Java并阅读how Spring 4 implements Java Generics。此外,我试图使用ResolvableType找到解决方案,但没有任何作用。
@Autowired
GenericDao<SpecificClass> specificdao;
public GenericDaoImpl <T> {
private Class<T> type;
public DaoImpl () {
this.type = ...?
}
public T findById(Serializable id) {
return (T) HibernateUtil.findById(type, id);
}
}
有什么方法可以避免这种情况吗?
@Autowired
@Qualifier
GenericDao<SpecificClass> specificdao;
@Repository("specificdao")
public SpecificDaoImpl extends GenericDao<SpecificClass> {
public SpecificDaoImpl () {
// assuming the constructor is implemented in GenericDao
super(this.getClass())
}
}
感谢。
答案 0 :(得分:2)
好的,如果我理解你的问题:你想要达到的目标非常棘手。
您可以使用TypeTools,然后执行以下操作:
import net.jodah.typetools.TypeResolver;
public GenericDaoImpl <T> {
private Class<T> type;
public GenericDaoImpl () {
Class<?>[] typeArguments = TypeResolver.resolveRawArguments(GenericDaoImpl.class, getClass());
this.type = (Class<T>) typeArguments[0];
}
public T findById(Serializable id) {
return (T) HibernateUtil.findById(type, id);
}
}
但我仍怀疑这是不是一个好主意。因为通常你不想要:
@Autowired
GenericDao<SpecificClass> specificDao;
但相反:
@Autowired
SpecificDao specificDao;
为什么呢?因为每个DAO几乎总是与其他DAO完全不同的方法。唯一通用的通用方法可能是:findById
,findAll
,save
,count
,delete
等。
因此,从GenericDAO继承子类是最明显的方法,因为它允许您在具体的DAO中添加任何所需的方法。
顺便说一句:你说你想要自己重新实现Spring Data功能。但请注意,在Spring方式中,您仍然需要创建具体的存储库。