Spring 4泛型类,获取参数化类型

时间:2015-11-26 14:02:34

标签: java spring generics

您在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())
      }
}

感谢。

1 个答案:

答案 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完全不同的方法。唯一通用的通用方法可能是:findByIdfindAllsavecountdelete等。

因此,从GenericDAO继承子类是最明显的方法,因为它允许您在具体的DAO中添加任何所需的方法。

顺便说一句:你说你想要自己重新实现Spring Data功能。但请注意,在Spring方式中,您仍然需要创建具体的存储库。