「プラグ可能な」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 のジェネリック DAOにあるものです)
次に、さまざまなフィールド (コンストラクターのパラメーター、セッター、ゲッターなどに反映される) を見つけることができる、さまざまないくつかの汎用 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 {
}
(ところで、Morphia の BasicDAOにあるのは、MongoDB 用の汎用 DAO の実装です)。
プラグ可能なアーキテクチャの 2 番目のことは、具体的な DAO 実装の選択です。Apress: Pro Spring 2.5の第 2 章("Putting Spring into "Hello World") を読んで、ファクトリと依存性注入について徐々に学習することをお勧めします。