已锁定 主题:Spring 事务简化配置
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-21
<beans> <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributeSource"> <value> com.skyon.user.manager.UserManager.*=PROPAGATION_REQUIRED #Add new defines here -> </value> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <!-- 增加新的 Interceptor --> </list> </property> </bean> <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor" ref="transactionInterceptor"/> </bean> </beans> 这里利用 DefaultAdvisorAutoProxyCreator 实现了对容器中所有 bean 的自动代理, 增加一个需要事务的业务 bean 时只要在 transactionInterceptor 增加一行即可, 增加别的 interceptor 也非常方便, 极大减少了配置量 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-03-21
Feiing 写道 com.skyon.user.manager.UserManager.*=PROPAGATION_REQUIRED 那你UserManager这个bean是在哪里定义的?程序里怎么能得到Spring AOP增强后的UserManager? 有点不明白,希望能继续解释一下:) |
|
返回顶楼 | |
发表时间:2006-03-21
我也没看明白,把UserManager这个Bean的定义也一起贴出来吧。
另外,要定义其他的Interceptor,Spring里面提供了postInterceptor和preInterceptor的选项,我感觉也不是很麻烦吧。如果仅仅是为了可以多定义Interceptor,反而看上去有些麻烦了。 另外,在多人团队开发中,多一个Manager,加一段配置,貌似比在同一段配置里面加多行来得干净吧。 |
|
返回顶楼 | |
发表时间:2006-03-21
增强版
com.skyon.user.manager.UserManager.*=PROPAGATION_REQUIRED 修改成使用接口 jkit.ILogic.execute*=PROPAGATION_REQUIRED 这样所有实现了ILogic的类都能实现自动代理,爽呀! |
|
返回顶楼 | |
发表时间:2006-03-21
确实是一个好贴,不过我却有点忧虑。spring现在被用得越来越邪乎了,xml配置文件简直已经到了奇技淫巧的地步了,仿佛许多隐而不宣的武林秘籍,掌握了这些xml配置段,就无敌了。唉!
|
|
返回顶楼 | |
发表时间:2006-03-21
明白叻,只要按照普通的配置bean的方法配置UserManager就行叻。
的确是个非常好的方法!! |
|
返回顶楼 | |
发表时间:2006-03-21
引用 确实是一个好贴,不过我却有点忧虑。spring现在被用得越来越邪乎了,xml配置文件简直已经到了奇技淫巧的地步了,仿佛许多隐而不宣的武林秘籍,掌握了这些xml配置段,就无敌了。唉!
没这么夸张 使得bean注入简捷的autowire,使得创建proxy简捷的autoproxy(实现有两个,一个是DefaultAdvisorAutoProxyCreator,BeanNameAutoProxyCreator). 另外一些奇技淫巧可以查下实现了BeanPostProcessor接口的类. |
|
返回顶楼 | |
发表时间:2006-03-21
完整版来叻!!
配置Spring,针对Service层的bean做事务处理,以往的做法是这样: <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="find*">PROPAGATION_REQUIRED, readOnly</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="some.package.UserManagerImpl"> <property name="userDAO"><ref bean="userDAO"/></property> </bean> </property> </bean> 以后,如果增加新的Service/Manager,则XML配置的增量是这一段: <bean id="someOtherManager" parent="txProxyTemplate"> <property name="target"> <bean class="some.package.someOtherManagerImpl"> </bean> </property> </bean> 上面说的是老的做法,比较传统。缺点是增量比较大,配置起来copy&paste让人觉得不太爽,比较臃肿。 下面的是Feiing给出的更好的方案,我有一些修改: <beans> <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA); --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory"/> </property> </bean> <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> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>*Service,*Manager</value> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> <!-- 此处增加新的Interceptor --> </list> </property> </bean> <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor" ref="transactionInterceptor"/> </bean> <bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/> </beans> 以后每次的增量是这一段: <bean id="userManager" class="some.package.UserManagerImpl" autoWire="byName"/> 跟配置普通bean的方法一样,非常简洁、直观。对现有的Service接口也无须任何修改 我把Feiing的transactionAttributesSource改成叻transactionAttributes,并且将DefaultAdvisorAutoProxyCreator改成了BeanNameAutoProxyCreator,我觉得毕竟不是context下的每个bean都需要事务,只要在Service层做AOP就可以叻。 和Robbin一致认为,Feiing的做法非常可取,因为它分离叻XML配置文件关注点 |
|
返回顶楼 | |
发表时间:2006-03-21
引用 IService接口不含任何东西,只是用来做标志。
直接使用beanname做标记,省下实现IService.transactionattribute就用find*... |
|
返回顶楼 | |
发表时间:2006-03-21
挑衅一下
如果使用UnitOfWork,结合一个DomainLifeCycle的Aspect。 Spring的事务配置,就可以扔到垃圾箱里去了。 想当初被MS的COM+...MTS弄得很惨,效率极其低下,俺再也不上这个当了。 |
|
返回顶楼 | |