2016-04-23 7 views
0

Я новичок в Spring и пытаюсь реализовать Generic DAO, как в этой статье http://www.ibm.com/developerworks/library/j-genericdao/. У меня есть несколько сущностей - ConcreteEntity1 и ConcreteEntity2. Кроме того, у меня есть классыAutowiring generic types with constructor [Spring 4.2.5]

public interface GenericDao<T extends Serializable> { 
    public T get(long id); 
    public List<T> get(String hql); 
    public void remove(T persistentObject); 
    public void add(T entity); 
} 

и

@Repository("hibGenericDao") 
public class HibGenericDaoImpl<T extends Serializable> implements GenericDao<T> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Class<T> type; 

    public HibGenericDaoImpl(Class<T> type) { 
     this.type = type; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public T get(long id) { 
     T entity; 
     try (Session session = sessionFactory.getCurrentSession()) { 
      entity = session.get(type, id); 
     } 
     return entity; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public List<T> get(String hql) { 
     List<T> entityList; 
     try (Session session = sessionFactory.getCurrentSession()) { 
      Query query = session.createQuery(hql); 
      entityList = query.list(); 
     } 
     return entityList; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void remove(T persistentObject) { 
     try (Session session = sessionFactory.getCurrentSession()) { 
      session.delete(persistentObject); 
     } 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void add(T entity) { 
     try (Session session = sessionFactory.getCurrentSession()) { 
      session.saveOrUpdate(entity); 
     } 
    } 
} 

Сейчас я пытаюсь написать слой службы, и я хочу autowire HibGenericDaoImpl<ConcreteEntity1> где поле type содержит ConcreteEntity1.class. Не могли бы вы сказать, как выполнить его без XML?

ответ

0

Если вы уже используете весной, вы можете использовать класс GenericTypeResolver утилиты, как показано в этом SO ответ: How to get a class instance of generics type T

Вы должны быть в состоянии сделать что-то вроде:

this.type = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), GenericDao.class); 
0

Замените конструктор на конструктор нуля-arg. Затем вы можете получить T с отражением, используя this link.