用Spring实现DAO

时间:2012-02-09 12:02:38

标签: java spring objectify

我正在考虑使用依赖注入实现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 / Client中的代码完好无损,例如:

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

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

我需要立即执行此操作的一个原因,我需要使用app引擎(通过objectify)开发,但是将来我可能需要将一些数据访问对象更改为hibernate,一些更改为mongodb(因此它是混合) 。

我还没有测试过这段代码,这个策略会起作用吗?

2 个答案:

答案 0 :(得分:1)

是的,这会有效。实际上,这是发明DI和编码接口的主要原因之一。只需确保所有DAO实现遵循相同的合同(DAO经常引入leaky abstractions)。

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

  • 多个@Service个带注释的类,其中一个标记为@Primary(如果您使用自动装配)

  • Spring profiles并选择性激活bean

顺便说一句,如果您正在考虑切换到其他DAO实施,请查看CrudRepository中的Spring Data。 Spring Data项目提供了几个为MongoDB,Neo4J,JPA等实现此接口的模块。

暂时似乎有几个Spring Data模块不能很好地协同工作(请参阅:DATAJPA-146),因此如果您选择实施CrudRepository,请确保此问题已得到修复或您可以正常工作它周围。感谢@iddqd指出了这一点。

答案 1 :(得分:0)

如果在应用程序中只需要一个实现,但是如果在应用程序中需要多个实现(混合模式),则可以将上下文配置更改为选定的Dao实现,您需要设计工厂层。您尝试设计一个名为Factory的图层及其API和实现,并决定随时选择女巫Dao(Hibernate,MongoDB,JP等)。

相关问题