Seasar DI Container with AOP

トランザクションの自動制御

S2Txの機能を使って、POJO(普通のJavaのクラス)に対して、Aspectでトランザクションの自動管理機能を組み込むことができます。EJBコンテナが提供するようなトランザクション管理機能をPOJOに対して透明に組み込むことができるのです。組む込むことのできるトランザクション属性は次のとおりです。

トランザクション属性

コンポーネント名がAdviceの名前です

属性 コンポーネント名 説明
Required j2ee.requiredTx トランザクションが開始されていなければ、
自動的にトランザクションを開始します。
既にトランザクションが開始されていれば、
そのトランザクションを引き継ぎます。
RequiresNew j2ee.requiresNewTx 常に新しいトランザクションを開始させます。
既存のトランザクションが開始されているなら、
既存のトランザクションを中断し、
自分自身のトランザクションの終了後、
中断したトランザクションを復帰させます。
Mandatory j2ee.mandatoryTx トランザクションが既に開始されてなければエラーにします。

Example

Hoge.java

package examples.tx;

public interface Hoge {

    public void foo();
}

HogeImpl.java

package examples.tx;

public class HogeImpl implements Hoge {

    public void foo() {
        System.out.println("foo");
    }
}

HogeClient.dicon

<components>
<include path="j2ee.dicon"/>
<component class="examples.tx.HogeImpl">
<aspect>j2ee.requiredTx</aspect>
</component>
</components>

HogeClient.java

package examples.tx;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class HogeClient {

    private static final String PATH =
        "examples/tx/HogeClient.dicon";
        
    public static void main(String[] args) {
        S2Container container = S2ContainerFactory.create(PATH);
        Hoge hoge = (Hoge) container.getComponent(Hoge.class);
        hoge.foo();
    }
}

実行結果

DEBUG 2004-03-14 18:05:18,402 [main] Transaction.begin()
foo
DEBUG 2004-03-14 18:05:18,432 [main] Transaction.commit()

j2ee.diconはS2としてあらかじめ用意(srcの直下)されています。Adviceのコンポーネント名をaspectタグのボディに指定するだけなので簡単です。 POJOに簡単にトランザクション管理機能が組み込めることがわかってもらえたと思います。