- - PR -
SpringAOPを使用したトランザクション管理
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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> もっとこうしたらいいとか、このサイトが役に立つとか 意見、情報を頂けないでしょうか | ||||
|
投稿日時: 2005-06-07 15:15
僕も同じ様なところで悩んでいます。
フライトさんの実装では、Auto Proxyを利用してはどうでしょうか? org.springframework.aop.framework.autoproxyパッケージの DefaultAdvisorAutoProxyCreatorとかBeanNameAutoProxyCreatorなど調べて見るといいかもしれません。 はずしていたらすみません。 | ||||
|
投稿日時: 2005-06-07 19:32
hiroさん返信ありがとうございます。
私の実装もちょっと試しながら作成した物ですが、やはりどれもこれも設定ファイルへの 設定項目が多くなってしまうんですね・・・ それでもBeanNameAutoProxyCreatorあたりだと少しは少なくなるんでしょうか・・ 少しBeanNameAutoProxyCreatorを使用した実装を考えてみます。 |
1