已锁定 主题:Spring 事务简化配置
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-21
nihongye 写道 引用 IService接口不含任何东西,只是用来做标志。
直接使用beanname做标记,省下实现IService.transactionattribute就用find*... 原来可以这样啊。。。:idea: |
|
返回顶楼 | |
发表时间:2006-03-21
引用 挑衅一下 Very Happy
如果使用UnitOfWork,结合一个DomainLifeCycle的Aspect。 Spring的事务配置,就可以扔到垃圾箱里去了。 想当初被MS的COM+...MTS弄得很惨,效率极其低下,俺再也不上这个当了。 有这么神奇,赶紧上example.板凳ing |
|
返回顶楼 | |
发表时间: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 了 ![]() |
|
返回顶楼 | |
发表时间:2006-03-21
nihongye 写道 引用 挑衅一下 Very Happy
如果使用UnitOfWork,结合一个DomainLifeCycle的Aspect。 Spring的事务配置,就可以扔到垃圾箱里去了。 想当初被MS的COM+...MTS弄得很惨,效率极其低下,俺再也不上这个当了。 有这么神奇,赶紧上example.板凳ing 赫赫,就不打搅你们了。 回头,俺会开专门的帖子,讨论这个问题的。 |
|
返回顶楼 | |
发表时间:2006-03-21
Feiing 写道 1. 用 DefaultAdvisorAutoProxyCreator 实现 autoProxy, 相比 BeanNameAutoProxyCreator 应该是来的更简洁, 哪些 bean 需要事务管理, 哪些不需要, 是在 TransactionInterceptor 中的transactionAttributeSource 中定义的, TransactionInterceptor 只会管理定义了的 bean, 这一点可以看一下 TransactionInterceptor 的代码, 所以就不必在BeanNameAutoProxyCreator 中声明. 这个是跟后面那个IService结合起来用的。这样就不用每加一个Service都要还去改transactionAttributeSource那个地方了 Feiing 写道 2. 用一个标志性接口 IService 来进一步减少配置量的确是一个好办法, 但是缺点是增加了侵入性, 并且个人感觉这个接口叫 TransactionAware 似乎更为合适 ![]() nihongye的做法连这个接口都不需要了。。。。见上面:) |
|
返回顶楼 | |
发表时间:2006-03-21
nihongye 写道 引用 IService接口不含任何东西,只是用来做标志。
直接使用beanname做标记,省下实现IService.transactionattribute就用find*... 这种方式虽然省下了IService,但是必须多出一个命名规约。 这种小的规约一旦多了,就容易遗忘,而且无法检查其正确性,到最后都不知道是怎么死的! 所以接口还是必要的。而且多实现一个接口似乎不费事吧? |
|
返回顶楼 | |
发表时间:2006-03-23
稍微总结一下, 两种实现方案
1. 使用 DefaultAdvisorAutoProxyCreator , 需要事务控制的类实现一个标志性接口 2. 使用 BeanNameAutoProxyCreator, 需要事务控制的 bean 声明时名称需要满足一定规则, 如 xxxManager, xxxService 至于孰优孰劣,就见仁见智了:lol: btw, 问一下 jkit, 你的那个标志性接口不用定义任何方法吗, 我试了 somepackage.IService.* = PROPAGATION_REQUIRED貌似不行 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2006-03-23
接口里面要定义方法的。
前面的回复 jkit.ILogic.execute*=PROPAGATION_REQUIRED 有点要注意的是:这里的自动代理是针对方法的,而不是针对类型的。 这个接口也并非是为了配置这个事务而特意做的,而是把已经存在的接口直接拿过来用,以实现在不改变原有代码的基础上添加事务。 |
|
返回顶楼 | |
发表时间:2006-03-23
引用 问错叻啦,是我一开始提出的。后来我试验叻,的确不行
ok,如果使用transactionAttributeSource的话 |
|
返回顶楼 | |