„Плъгируем“ 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);
}
(Това е, което имате в Общият DAO на Morphia )
След това можете да разработите няколко различни общи DAO реализации, където можете да намерите различни полета (отразени в параметри на конструктора, сетери и гетери и т.н.). Да приемем, че е базиран на 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 {
}
(BTW, какво имате в BasicDAO на Morphia е реализация на общия DAO за MongoDB).
Второто нещо в pluggable архитектурата е изборът на конкретна реализация на DAO. Бих ви посъветвал да прочетете глава 2 от Apress:Pro Spring 2.5 („Поставяне на Spring в „Hello World“), за да научите постепенно за фабриките и инжектирането на зависимости.