「可插拔」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和getters等)。讓我們假設一個基於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(「把Spring放入」Hello World「)中的第2章,以逐步瞭解工廠和依賴注入的知識。
+1這個我會補充說Guice是我們的DI框架使用很好的成功。 –