前の記事 で見たアノテーションによるトランザクションを見ていきます。
例によって、サンプルをメインにしてみて行こうと思います。
【Spring設定ファイル(AppricationContext.xml)】
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop ="http://www.springframework.org/schema/aop
"
xmlns:tx ="http://www.springframework.org/schema/tx
"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- Data Source (例えばPostgres)--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url" value="jdbc:postgresql://localhost/XXXX" /> <property name="username" value="XXX" /> <property name="password" value="XXX" /> </bean>
<!-- DAO -->
<bean id="memberDao" class="dao.MemberDaoImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ビジネス -->
<bean id="memberService" class="business.service.MemberServiceImpl">
</bean>
<!-- トランザクション管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- トランザクションのアノテーションを有効にする -->
<tx:annotation-driven />
</beans>
<ビジネスロジック(アノテーションのサンプルその)>
@Transactional(readOnly=true)
public class MemberServiceImpl{
public find(Member member){
}
@Transactional(readOnly=false, rollbackFor=RuntimeException.class)
public update(Member member){
}
//・・・様々なメソッド
}
【説明】
クラスの先頭でクラス内のメソッドすべてにreadOnlyを設定しています。
そして、さらに、メソッド毎にも@Transactional を設定できています。
アノテーションは、オーバーライドができるようです。
この事情は、クラスを派生させたときにも同じようです。
さて、ほんとんど説明することはないかと思います。
指定したクラス、またはメソッド毎にトランザクションを指定できます。
宣言的トランザクションがアプリケーション全体を相手にしているのに対して、
アノテーションは1つのクラス、1つのメソッドを相手にする感じですかね。
上記では、updateメソッドだけ、書き込みOKになっています。
<アノテーションを有効にする方法>
実は@Transactional をコードに記述すればトランザクションが行われるわけではありません。
Springの設定ファイルに以下の記述をする必要があります。
① <tx:annotation-driven />
② beanのtransactionManagerを記述する。
これだけです!
上記①のタグの属性はAOPの設定とほぼ同じです。
基本的にはinterfaceについてのみアノテーションが適用されます。
classについても適用したい場合は、proxy-target-class="true"に設定してください。
詳しくは、・DIxAOPの機能について 参照。
【設定について】
実は、内容は宣言的トランザクションと同じです。
ですので、宣言的トランザクションのタグとアノテーションの対応さえを分かればすぐ使えると思います。
こちらの記事 の一覧表とあわせてみていただければ分かるかと思います。
<宣言的トランザクションとの対応表>
tx:methodのタグ属性 | @Transactionalでの名称 | アノテーションの備考 |
---|---|---|
propagation | propagation | Propagation.REQUIREDのように列挙型を設定する |
isolation | isolation | Isolation.DEFAULTのように列挙型を設定する |
read-only | readOnly | true/false |
rollback-for | rollbackFor | RuntimeException.classのようにクラスを設定する。 |
no-rollback-for | noRollbackFor | 同上 |
timeout | timeout |
宣言的トランザクションとアノテーションのトランザクションは同じなので、どちらかを覚えればすぐ使用できるかと思います!
参照:
・トップ
Transactionalアノテーションの例