有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Spring实现DAO的java

我正在考虑使用依赖注入实现Objectify DAO,这样我就可以维护代码以访问同一个“DAO”,而将来实现可能会从Objectify更改为Hibernate MySQL或MongoDb,而不用担心更改UI或客户端的任何代码

UserDao基于以下示例: http://turbomanage.wordpress.com/2010/01/28/simplify-with-objectify/

UserObjectifyDaoImpl implements Dao<User> {

 private UserDao dao = null; 

 public void put(User entity) {
    if (dao == null) {
       dao = new UserDao(); 
    }
    dao.put(entity);
 }
 // other put and set methods
}

因此,我有context.xml

<bean id="userDao" class="com.example.server.daoimpl.UserObjectifyDaoImpl">
    <property name="dataSource" ref="dataSource"/>
</bean>

如果我需要更改实现,我只需要将这个bean从UserObjectifyDaoImpl更改为如下内容:

UserHibernateDaoImplUserMongoDBDaoImpl或任何保存到任何数据库的实现

而且我的代码在UI/客户端中仍然完好无损,比如:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);

我现在需要这样做的一个原因是,我需要使用app engine(通过objectify)进行开发,但是在未来,我可能需要将一些数据访问对象更改为hibernate,将一些更改为mongodb(因此这是一种混合)

我还没有测试过这个代码,这个策略有效吗


共 (1) 个答案

  1. # 1 楼答案

    是的,这会管用的。事实上,这是DI和接口编码被发明的主要原因之一。只要确保所有DAO实现都遵循相同的约定(DAO经常引入leaky abstractions

    此外,您还有其他几个选项可以实现相同的目标:

    • 几个@Service注释的类,其中一个标记为@Primary(如果使用自动连线)

    • Spring profiles和豆类的选择性激活

    顺便说一句,如果您正在考虑切换到不同的DAO实现,请从Spring Data查看^{}。Spring数据项目为MongoDB、Neo4J、JPA等提供了几个实现该接口的模块

    目前看来,几个Spring数据模块不能很好地配合使用(请参阅:DATAJPA-146),因此如果您选择实现CrudRepository,请确保这个问题已经解决,或者您可以解决它。感谢@iddqd指出这一点