用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
更改为如下内容:
UserHibernateDaoImpl
或UserMongoDBDaoImpl
或任何保存到任何数据库的实现
而且我的代码在UI/客户端中仍然完好无损,比如:
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Dao dao = (Dao) ctx.getBean("userDao");
dao.put(something);
我现在需要这样做的一个原因是,我需要使用app engine(通过objectify)进行开发,但是在未来,我可能需要将一些数据访问对象更改为hibernate,将一些更改为mongodb(因此这是一种混合)
我还没有测试过这个代码,这个策略有效吗
# 1 楼答案
是的,这会管用的。事实上,这是DI和接口编码被发明的主要原因之一。只要确保所有DAO实现都遵循相同的约定(DAO经常引入leaky abstractions)
此外,您还有其他几个选项可以实现相同的目标:
几个
@Service
注释的类,其中一个标记为@Primary
(如果使用自动连线)Spring profiles和豆类的选择性激活
顺便说一句,如果您正在考虑切换到不同的DAO实现,请从Spring Data查看^{} 。Spring数据项目为MongoDB、Neo4J、JPA等提供了几个实现该接口的模块
目前看来,几个Spring数据模块不能很好地配合使用(请参阅:DATAJPA-146),因此如果您选择实现
CrudRepository
,请确保这个问题已经解决,或者您可以解决它。感谢@iddqd指出这一点