2012-02-09 117 views
0

我在考慮使用依賴注入來實現Objectify DAO,這樣我就可以維護我的代碼以訪問相同的「Dao」,而實現可能在將來從Objectify改爲Hibernate-MySQL或MongoDb時不需要我擔心在UI或客戶端更改任何代碼。使用Spring實現DAO

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> 

如果我需要改變的實施,我只需要改變這個豆從UserObjectifyDaoImpl類似於:

UserHibernateDaoImplUserMongoDBDaoImpl或任何實施保存到任何數據庫。

而且仍然有我在UI /客戶端代碼完好無損,如:

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

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

一個原因,我現在需要做的這個權利,我需要使用的應用程序引擎(通過客觀化)發展,但是在未來,我可能需要將某些數據訪問對象更改爲休眠狀態,並將某些數據訪問對象更改爲mongodb(因此它是混合)。

我還沒有測試過這個代碼,這個策略會工作嗎?

回答

1

是的,這將起作用。事實上,這是爲什麼DI和接口編碼被髮明的主要原因之一。只要確保所有DAO實施遵循同一合同(DAO經常引入leaky abstractions)。

你也有其他幾個選項來達到同樣的目標:

  • 幾個@Service註釋類有一個標記爲@Primary(如果使用的是自動裝配)

  • Spring profiles和豆類的選擇性激活

順便說一句,如果你正在考慮切換到不同的DAO實現請從Spring Data查看CrudRepository。 Spring Data項目提供了幾個爲MongoDB,Neo4J,JPA等實現此接口的模塊。

目前,好像有幾個Spring Data模塊不能很好地協作(見:DATAJPA-146),所以如果您選擇執行CrudRepository確保此問題已修復,或者您可以解決此問題。感謝@iddqd指出。

+1

它會工作。你是righ,spring-data是好方法,但只適用於sql。spring-data-mongodb現在無法使用其他數據源https://jira.springsource.org/browse/DATAMONGO-389,https://jira.springsource.org/browse/DATAJPA-146 – iddqd 2012-02-09 12:13:42

+0

@iddqd:Nice ..但我相信OP希望完全從一個實現切換到另一個,而不是同時使用它們。 – 2012-02-09 12:15:45

+1

「我現在需要這樣做的一個原因是,我需要開發使用應用程序引擎(通過objectify),但是在將來我可能需要將某些數據訪問對象更改爲休眠模式,以及將某些數據訪問對象更改爲mongodb。 「 – iddqd 2012-02-09 12:17:01

0

你可以改變背景config來選擇DAO實現,如果你只需要一個實現應用程序,但如果你在你的應用需要一個以上的實現(混合模式),你需要設計工廠層。您嘗試設計一個名爲Factory的圖層,並使用它的API和實現,並決定在任何時候選擇Dao(Hibernate,MongoDB,JP等)。