DAO和依赖注入,建议?

时间:2011-11-08 11:24:05

标签: java design-patterns mongodb dao morphia

这是我第一次使用DAO模式。从我read到目前为止,实现这种模式将帮助我从任何持久性实现中分离我的调用代码(控制器) - 正是我想要的;也就是说,我不想被重新使用任何特定的数据库或第三方库。

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

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

我如何拥有更多可插拔架构?我的意思是,我应该考虑如何配置我的应用程序以使用具有特定配置参数的特定DAO,在实际源外部?

4 个答案:

答案 0 :(得分:9)

“可插拔”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(“将春天放入”Hello World“)中的第2章,逐步了解工厂和依赖注入。

答案 1 :(得分:1)

Spring使用配置为您做DI,并且它被广泛使用。

答案 2 :(得分:1)

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

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

稍后您的数据库中任何特定第三方驱动程序的开关都可以重写超类。

我再也不是专家。试着在这里学习。 :)

答案 3 :(得分:0)

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