[英]Spring IoC and Generic Interface Type Implementation
最初基于此线程:
还有这个
使用注释使用Spring Hibernate编写更少的DAO
我想知道如何实现前者的想法。 可以说我有
@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!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.