Uma camada DAO "conectável" é geralmente/sempre baseada em uma interface DAO. Por exemplo, vamos considerar um simples bastante genérico:
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);
}
(Isso é o que você tem em DAO genérico do Morphia )
Então você pode desenvolver várias implementações genéricas de DAO, onde você pode encontrar diferentes campos (refletidos em parâmetros do construtor, setters e getters, etc). Vamos supor um baseado em JDBC:
public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> {
private String db_url;
private Connection;
private PreparedStatement insert;
// etc.
}
Uma vez que o DAO genérico é implementado (para um armazenamento de dados concreto), obter um DAO concreto seria um acéfalo:
public interface PersonDAO extends GenericDAO<Person, Long> {
}
e
public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {
}
(BTW, o que você tem em BasicDAO do Morphia é uma implementação do DAO genérico para MongoDB).
A segunda coisa na arquitetura plugável é a seleção da implementação concreta do DAO. Eu aconselho você a ler o capítulo 2 de Apress:Pro Spring 2.5 ("Putting Spring into "Hello World") para aprender progressivamente sobre fábricas e injeção de dependência.