T2+Spring+Domaのサンプル(Doma-0.9.8)

T2+Spring+Domaのサンプルを更新しました。アプリの内容・構成についてはこちらのエントリを参照してください。

ソース

SVNを使用する場合は、「http://t-2.googlecode.com/svn/trunk/samples/t2-spring-doma」からチェックアウトできます。
またアーカイブ形式のものは、「http://t-2.googlecode.com/files/t2-spring-doma-0.6.1-ga.zip」からダウンロードできます。
いずれもeclipseプロジェクト形式になっています。


eclipseを使用する場合は、eclipse3.5以上を使用してください。(domaのapt機能が3.5以上でないと動作しないため)


ダウンロード後にリビルドして、bootstrap/samples/SpringDomaSampleServerStart.javaJava実行すると、アプリが動作します。

0.9.8での変更

ConfigProxy

Doma0.9.8から、ConfigProxyクラスが追加されています。
Daoインターフェースに

@Dao(config = ConfigProxy.class)
public interface PersonDao {

と書いておくと、

public class PersonDaoImpl extends org.seasar.doma.jdbc.DomaAbstractDao implements org.t2framework.samples.spring.dao.PersonDao {

    public PersonDaoImpl(org.seasar.doma.jdbc.Config config) {
        super(new org.seasar.doma.jdbc.ConfigProxy(config));
    }

というコードを生成してくれます。
以前は

@Dao(config = SpringConfig.class)
public interface PersonDao {

と書く必要があったため、Dao実装時に使用するConfigを決める必要がありましたが、Configをコンストラクタで取れるようになったので、後でDIすることができるようになり、Dao実装時にConfigを決める必要がなくなりました。
以前のサンプルはstatic変数を使用してDataSourceやDialectを渡していましたが、ConfigProxyが利用できる0.9.8以降はそういった実装が不要になります。
DomaはConfigからはDataSourceやDialect(DBごとの方言)を取得するので、実行時にConfigをSpringから渡すことで、Springで一元管理できるようになります。

AnnotateWith,Annotationアノテーション

AnnotateWithアノテーションをDaoインターフェースに書くことで、生成されるDaoImplに対して付与するアノテーションを指定できるようになりました。
Springの場合

@Dao(config = ConfigProxy.class)
@AnnotateWith(annotations = {
		@Annotation(target = AnnotationTarget.CLASS, type = Repository.class),
		@Annotation(target = AnnotationTarget.CONSTRUCTOR, type = Autowired.class) })
public interface PersonDao {

としておくと、生成されたクラスは

@org.springframework.stereotype.Repository()
@javax.annotation.Generated(value = { "Doma", "0.9.7" }, date = "2009-10-22 01:59:21")
public class PersonDaoImpl extends org.seasar.doma.jdbc.DomaAbstractDao implements org.t2framework.samples.spring.dao.PersonDao {

    @org.springframework.beans.factory.annotation.Autowired()
    public PersonDaoImpl(org.seasar.doma.jdbc.Config config) {
        super(new org.seasar.doma.jdbc.ConfigProxy(config));
    }

という具合になります。
Springの場合、@Repositoryがついていればcomponent-scanで一括登録可能ですし、AutowiredがコンストラクタについていればConfigをDI出来るので、便利です。
AnnotateWithアノテーションは、Springに限らず、ほかのコンテナと連携するときに役に立つと思います。


Springとの連携は、今回の対応でほぼ期待通りになったかなと思います。id:taediumさんありがとうございますm(_ _)m
eclipseのpluginや@OriginalStatesといったアノテーションも新機能としてあるようなので、こちらもチェケラしたいと思っています。


余談ですが

T2はHTTPのPUTやDELETEを受ける事が出来るので、呼び出されたPageクラスと連動してDomaを呼び出してDBを操作する、RESTっぽいサンプルを作成できないかなと思っています。

@Dao(config = ConfigProxy.class)
@AnnotateWith(annotations = {
		@Annotation(target = AnnotationTarget.CLASS, type = Page.class,elements="/Person")})
public interface PersonDaoPage {
}

これはちょっとやりすぎですが。
あとLucyを使ったサンプルも作成しようと思っています。