- PR -

SpringAOPを使用したトランザクション管理

1
投稿者投稿内容
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2005-06-06 19:30
springAOPを使用したトランザクション管理の実装に
悩んでいます。

以下のような実装を考えています。

===================================================
public class AspectTest implements MethodInterceptor{

public Object invoke(MethodInvocation invocation){

PlatformTransactionManager manager =
(PlatformTransactionManager)〜.getBean("transactionManager");
DefaultTransactionDefinition tx = new DefaultTransactionDefinition();
tx.setTimeout(60);
//トランザクションの開始
TransactionStatus txs = manager.getTransaction(tx);

Object result = null;
try {
result = invocation.proceed();
//トランザクションコミット
manager.commit(txs);
} catch (Throwable e) {
//トランザクションロールバック
manager.rollback(txs);
}

return result;

==================================================
public class DBAccsess {

public void greet(JdbcTarraDAO sampleDAO){

sampleDAO.add(new Person("1","name","address"));

}
==================================================
<設定ファイル>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    〜
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource"><ref local="dataSource"/></property>
</bean>

<bean id="aspect" class="spring.sample.dao.sample.test2.TerraAspect"/>

<bean id="accsess_test" class="spring.sample.dao.sample.test2.DBAccsess"/>
<bean id="accsess" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="accsess_test"/>
</property>
<property name="interceptorNames">
<value>aspect</value>
</property>
</bean>
</beans>
======================================================
public class MainClass {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("〜");
BeanFactory factory = new ClassPathXmlApplicationContext("〜");
JdbcTarraDAO sampleDAO = (JdbcTarraDAO)factory.getBean("〜");
DBAccsess sample = (DBAccsess)context.getBean("accsess");

sample.greet(sampleDAO);
Person person = sample.findPerson(sampleDAO);
//personを使ったビジネスロジック・・
}
}
=======================================================



アプリケーションでDBアクセスをする個所が多くなる為、
DAOでDBアクセスするクラスDBAccsessとほぼ同様のクラスを
複数作成して、下記に書いた設定を設定ファイルに追加して
DBAccsessをトランザクション制御を行っているクラス
AspectTestに制御させる方法を考えていますが、
DBAccsessとほぼ同様のクラスを数多く実装するつもりなので、
設定項目が多くなりうまくないように感じます。。

<bean id="aspect" class="spring.sample.dao.sample.test2.AspectTest"/>
<bean id="accsess_test2" class="spring.sample.dao.sample.test2.DBAccsess2"/>
<bean id="accsess" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="accsess_test2"/>
</property>
<property name="interceptorNames">
<value>aspect</value>
</property>
</bean>

もっとこうしたらいいとか、このサイトが役に立つとか
意見、情報を頂けないでしょうか
hiro
常連さん
会議室デビュー日: 2005/03/10
投稿数: 32
投稿日時: 2005-06-07 15:15
僕も同じ様なところで悩んでいます。

フライトさんの実装では、Auto Proxyを利用してはどうでしょうか?
org.springframework.aop.framework.autoproxyパッケージの
DefaultAdvisorAutoProxyCreatorとかBeanNameAutoProxyCreatorなど調べて見るといいかもしれません。

はずしていたらすみません。
フライト
ベテラン
会議室デビュー日: 2005/03/11
投稿数: 63
お住まい・勤務地: 津田沼・東京
投稿日時: 2005-06-07 19:32
hiroさん返信ありがとうございます。

引用:

hiroさんの書き込み (2005-06-07 15:15) より:

フライトさんの実装では、Auto Proxyを利用してはどうでしょうか?
org.springframework.aop.framework.autoproxyパッケージの
DefaultAdvisorAutoProxyCreatorとかBeanNameAutoProxyCreatorなど調べて見るといいかもしれません。



私の実装もちょっと試しながら作成した物ですが、やはりどれもこれも設定ファイルへの
設定項目が多くなってしまうんですね・・・
それでもBeanNameAutoProxyCreatorあたりだと少しは少なくなるんでしょうか・・

少しBeanNameAutoProxyCreatorを使用した実装を考えてみます。
1

スキルアップ/キャリアアップ(JOB@IT)