最初基于此线程:
Spring IoC and Generic Interface Type
还有这个
Write Less DAOs with Spring Hibernate using Annotations
我想知道如何实现前者的想法。可以说我有
@Repository
@Transactional
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory factory;
private Class<T> type;
public void persist(T entity){
factory.getCurrentSession().persist(entity);
}
@SuppressWarnings("unchecked")
public T merge(T entity){
return (T) factory.getCurrentSession().merge(entity);
}
public void saveOrUpdate(T entity){
factory.getCurrentSession().merge(entity);
}
public void delete(T entity){
factory.getCurrentSession().delete(entity);
}
@SuppressWarnings("unchecked")
public T findById(long id){
return (T) factory.getCurrentSession().get(type, id);
}
}
我是具有标记界面:
public interface CarDao extends GenericDao<Car> {}
public interface LeaseDao extends GenericDao<Lease> {}
但是我想通过1 GenericDaoImpl(类似于上面的GenericDaoImpl)来实现细节,以避免为简单的CRUD编写重复的Impl。 (我将为需要更高级DAO功能的实体编写自定义Impl。)
因此,最终我可以在控制器中执行以下操作:
CarDao carDao = appContext.getBean("carDao");
LeaseDao leaseDao = appContext.getBean("leaseDao");
这可能吗?我需要怎么做才能做到这一点?
最佳答案
接口不能扩展类,因此在这种情况下不能使用标记接口。你可以上课。以目前的形式,我认为您将无法创建GenericDAOImpl的bean,因此您需要创建扩展GenericDAOImpl的特定类的bean。也就是说,您绝对可以将sessionfactory作为静态字段拉到一个单独的类中,进行连接并在DAO中使用静态引用。然后,您将不需要连接整个DAO,只需将实例创建为新的GenericDAOImpl()(或通过工厂)即可运行。显然,对于特定操作,您可以具有扩展GenericDAOImpl的实现。
HTH!