论坛首页 Java企业应用论坛

Spring 事务简化配置

浏览 67729 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-03-21  
nihongye 写道
引用
IService接口不含任何东西,只是用来做标志。

直接使用beanname做标记,省下实现IService.transactionattribute就用find*...


原来可以这样啊。。。:idea:
0 请登录后投票
   发表时间:2006-03-21  
引用
挑衅一下 Very Happy
如果使用UnitOfWork,结合一个DomainLifeCycle的Aspect。
Spring的事务配置,就可以扔到垃圾箱里去了。
想当初被MS的COM+...MTS弄得很惨,效率极其低下,俺再也不上这个当了。

有这么神奇,赶紧上example.板凳ing
0 请登录后投票
   发表时间:2006-03-21  
呵呵, 想不到大家反响这么激烈, 我说一下自己的想法

1. 用 DefaultAdvisorAutoProxyCreator 实现 autoProxy, 相比 BeanNameAutoProxyCreator 应该是来的更简洁,  哪些 bean 需要事务管理, 哪些不需要, 是在 TransactionInterceptor 中的transactionAttributeSource 中定义的,
   TransactionInterceptor 只会管理定义了的 bean, 这一点可以看一下 TransactionInterceptor 的代码,    所以就不必在BeanNameAutoProxyCreator  中声明.

2. 用一个标志性接口 IService 来进一步减少配置量的确是一个好办法, 但是缺点是增加了侵入性, 并且个人感觉这个接口叫
   TransactionAware 似乎更为合适
 
3. 说到事务控制, 其实我的项目是放在 Action 做的, 可能要被鄙视了, 我们用 xwork Interceptor 实现, 再加上 webwork
   <default-interceptor-ref name="defaultStack" /> 的功能, 基本上完全不用再管事务, 当然策略只能是 PROPAGATION_REQUIRED 了
0 请登录后投票
   发表时间:2006-03-21  
nihongye 写道
引用
挑衅一下 Very Happy
如果使用UnitOfWork,结合一个DomainLifeCycle的Aspect。
Spring的事务配置,就可以扔到垃圾箱里去了。
想当初被MS的COM+...MTS弄得很惨,效率极其低下,俺再也不上这个当了。

有这么神奇,赶紧上example.板凳ing

赫赫,就不打搅你们了。
回头,俺会开专门的帖子,讨论这个问题的。
0 请登录后投票
   发表时间:2006-03-21  
Feiing 写道

1. 用 DefaultAdvisorAutoProxyCreator 实现 autoProxy, 相比 BeanNameAutoProxyCreator 应该是来的更简洁,  哪些 bean 需要事务管理, 哪些不需要, 是在 TransactionInterceptor 中的transactionAttributeSource 中定义的,
   TransactionInterceptor 只会管理定义了的 bean, 这一点可以看一下 TransactionInterceptor 的代码,    所以就不必在BeanNameAutoProxyCreator  中声明.


这个是跟后面那个IService结合起来用的。这样就不用每加一个Service都要还去改transactionAttributeSource那个地方了

Feiing 写道

2. 用一个标志性接口 IService 来进一步减少配置量的确是一个好办法, 但是缺点是增加了侵入性, 并且个人感觉这个接口叫
   TransactionAware 似乎更为合适


nihongye的做法连这个接口都不需要了。。。。见上面:)
0 请登录后投票
   发表时间:2006-03-21  
nihongye 写道
引用
IService接口不含任何东西,只是用来做标志。

直接使用beanname做标记,省下实现IService.transactionattribute就用find*...


这种方式虽然省下了IService,但是必须多出一个命名规约。
这种小的规约一旦多了,就容易遗忘,而且无法检查其正确性,到最后都不知道是怎么死的!
所以接口还是必要的。而且多实现一个接口似乎不费事吧?
0 请登录后投票
   发表时间:2006-03-23  
稍微总结一下,  两种实现方案

1. 使用 DefaultAdvisorAutoProxyCreator ,  需要事务控制的类实现一个标志性接口

2. 使用 BeanNameAutoProxyCreator, 需要事务控制的 bean 声明时名称需要满足一定规则, 如 xxxManager, xxxService

至于孰优孰劣,就见仁见智了:lol:

btw, 问一下 jkit, 你的那个标志性接口不用定义任何方法吗, 我试了
 somepackage.IService.* =   PROPAGATION_REQUIRED
貌似不行
0 请登录后投票
   发表时间:2006-03-23  
Feiing 写道

btw, 问一下 jkit, 你的那个标志性接口不用定义任何方法吗, 我试了
 somepackage.IService.* =   PROPAGATION_REQUIRED
貌似不行


问错叻啦,是我一开始提出的。后来我试验叻,的确不行,Spring AOP会去找这个接口定义的方法,空接口是不允许的,因为它找不到任何Method。

最后的方案是使用BeanNameAutoProxyCreator,还是不要空的接口,配置transactionAttributes而不是transactionAttributeSource。像这样:

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager"/>?
		<property name="transactionAttributes">
			<props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
    </bean>


详见Wiki:
http://www.iteye.com/pages/viewpage.action?pageId=1314
0 请登录后投票
   发表时间:2006-03-23  
接口里面要定义方法的。
前面的回复
jkit.ILogic.execute*=PROPAGATION_REQUIRED


有点要注意的是:这里的自动代理是针对方法的,而不是针对类型的。
这个接口也并非是为了配置这个事务而特意做的,而是把已经存在的接口直接拿过来用,以实现在不改变原有代码的基础上添加事务。
0 请登录后投票
   发表时间:2006-03-23  
引用
问错叻啦,是我一开始提出的。后来我试验叻,的确不行

ok,如果使用transactionAttributeSource的话
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics