最初基于此线程:

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!

08-05 13:07