DIコンテナ対応(Configのインジェクションに対応する)案

@Daoのconfig要素に指定するクラスでDIコンテナからlookupしてもらえればいいかと思っていましたが、いいアイデアを思いついたので対応する方向で考えたいと思います。

DIコンテナ使わない場合

いままでどおり、@Daoのconfig要素にアプリで作成したクラスを指定します。

@Dao(config = AppConfig.class)
public interface EmpDao {
    ...
}

実装クラスは引数なしのpublicなコンストラクタを持つようにaptで生成します。

public EmpDaoImpl() {
    super(new AppConfig());
}

ですので簡単にnewできます。

DIコンテナ使う場合

@Daoのconfig要素にDomaが提供するConfigAdapterを指定します。

@Dao(config = ConfigAdapter.class)
public interface EmpDao {
    ...
}

実装クラスは引数ありのpublicなコンストラクタを持つようにaptで生成します。引数なしコンストラクタは生成しません。

public EmpDaoImpl(Config config) {
    super(new ConfigAdapter(config));
}

で、ここにDIコンテナで管理したConfigのインスタンスをインジェクションしてもらうことになります。ConfigAdapterは処理を全部インジェクトされたconfigに委譲します。configに指定するクラスとDIされるインスタンスの整合性が崩れると嫌だなぁと思っていたのですが、こうすれば問題ないですね。