Et "pluggbart" DAO-lag er normalt/altid baseret på en grænseflade DAO. Lad os for eksempel overveje en ganske generisk simpel en:
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);
}
(Dette er, hvad du har i Morphias generiske DAO )
Derefter kan du udvikle forskellige flere generiske DAO-implementeringer, hvor du kan finde forskellige felter (afspejlet i konstruktørparametre, sættere og gettere osv.). Lad os antage en JDBC-baseret:
public class GenericDAOJDBCImpl<T, K extends Serializable> implements GenericDAO<T, K extends Serializable> {
private String db_url;
private Connection;
private PreparedStatement insert;
// etc.
}
Når først den generiske DAO er implementeret (for et konkret datalager), ville det være umuligt at få en konkret DAO:
public interface PersonDAO extends GenericDAO<Person, Long> {
}
og
public class PersonDAOJDBCImpl extends GenericDAOJDBCImpl<Person, Long> implements PersonDAO {
}
(BTW, hvad du har i Morphias BasicDAO er en implementering af den generiske DAO for MongoDB).
Den anden ting i den pluggbare arkitektur er valget af den konkrete DAO-implementering. Jeg vil råde dig til at læse kapitel 2 fra Apress:Pro Spring 2.5 ("Putting Spring into "Hello World") for gradvist at lære om fabrikker og afhængighedsinjektion.