DAO 和依赖注入,建议?

Posted

技术标签:

【中文标题】DAO 和依赖注入,建议?【英文标题】:DAO and dependency injection, advice? 【发布时间】:2011-12-24 09:05:06 【问题描述】:

这是我第一次使用 DAO 模式。从我目前的read 来看,实现这个模式将帮助我将我的调用代码(控制器)与任何持久性实现分开——这正是我想要的;也就是说,我不想被限制使用任何特定的数据库或第 3 方库。

我正在使用 MongoDB 和 morphia(作为示例)创建一些测试代码(以 TDD 方式),其中 morphia 提供了 BasicDAO 类。

据我所知,扩展 BasicDAO<T, V> 需要一个接受 Morphia 和 Mongo 对象的构造函数;这些是非常具体的(第 3 方)类型,我真的不想在 DAO 类本身之外四处游荡。

我怎样才能拥有更多的可插拔架构?我的意思是,我应该如何重新配置​​我的应用程序以使用具有特定配置参数的特定 DAO,在实际源之外?

【问题讨论】:

【参考方案1】:

“可插拔”DAO 层通常/总是基于接口 DAO。例如,让我们考虑一个非常通用的简单的:

public interface GenericDAO <T, K extends Serializable>   
    List<T> getAll(Class<T> typeClass);   
    T findByKey(Class<T> typeClass, K id);  
    void update(T object);  
    void remove(T object);  
    void insert(T object);  

(这是您在Morphia's generic DAO 中的内容)

然后您可以开发不同的几种通用 DAO 实现,您可以在其中找到不同的字段(体现在构造函数参数、setter 和 getter 等)。让我们假设一个基于 JDBC 的:

public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> 
    private String db_url;

    private Connection;
    private PreparedStatement insert;
    // etc.

一旦实现了通用 DAO(对于具体的数据存储),获得具体的 DAO 将不费吹灰之力:

public interface PersonDAO extends GenericDAO<Person, Long> 


public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO 


(顺便说一句,Morphia's BasicDAO 中的内容是 MongoDB 的通用 DAO 的实现)。

可插拔架构中的第二件事是选择具体的 DAO 实现。我建议您阅读 Apress: Pro Spring 2.5 的第 2 章(“将 Spring 放入“Hello World”),以逐步了解工厂和依赖注入。

【讨论】:

为此 +1。我要补充一点,Guice 是我们使用的 DI 框架并取得了巨大的成功。【参考方案2】:

Spring 使用配置为您进行 DI,并且被广泛使用。

【讨论】:

【参考方案3】:

您好,我不是 java 专家。但试图给出一个解决方案。

你可以有一个超类,所有与连接相关的东西都发生在这个超类中,你可以拥有一个可以扩展和使用它的任何其他基类。

稍后在您的数据库中为特定的第 3 方驱动程序进行任何切换,您都可以重写超类。

再说一遍,我不是专家。只是想在这里学习。 :)

【讨论】:

【参考方案4】:

几个标准的 DI 框架是 Spring 和 Guice。这两个框架都有助于 TDD。

【讨论】:

以上是关于DAO 和依赖注入,建议?的主要内容,如果未能解决你的问题,请参考以下文章

解析-依赖注入

Spring框架--依赖注入

Spring入门篇3 --- 依赖注入(DI)方式集合注入

beans.factory.BeanCreationException:创建名为“dao”的bean时出错:注入持久性依赖项失败

这是 MVC DAO 的正确方法吗?我收到类似自动装配依赖项注入失败的错误

Spring依赖注入无法继承