声明式事务处理(Declarative transactions)
我们来介绍声明式事务处理(Declarative transactions)。它是Spring目前最重要的一个应用。声明式事务处理是由Spring AOP实现的,大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。
类似于EJB的容器管理事务(Container Managed Transaction)可以在配置文件中声明对事务的支持,可以精确到单个方法的级别,这通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的PlatformTransactionManager的引用和事务属性。事务属性含有上面描述的事务定义。
在项目中,我们使用了以下配置。
<bean id="orderService" class="org.springframework.transaction.
interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="myTransactionManager"/>
</property>
<property name="target"><ref local="orderTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="find*">
PROPAGATION_REQUIRED,readOnly,-OrderException
</prop>
<prop key="save*">
PROPAGATION_REQUIRED,-OrderMinimumAmountException
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-OrderException
</prop>
</props>
</property>
</bean>
通过以上配置声明,Spring会自动帮助我们处理事务。也就是说,对于orderTarget类中的所有以find、save和update开头的方法,自动增加事务管理服务。
这里的transaction attributes属性定义在org.springframework.transaction.interceptor.Name MatchTransactionAttributeSource中的属性格式来设置。这个包括通配符的方法名称映射是很直观的。注意,save*的映射的值包括回滚规则。添加的-OrderMinimumAmountException指定,如果方法抛出OrderMinimumAmountException或它的子类,事务将会自动回滚。可以用逗号分隔定义多个回滚规则。-前缀强制回滚,+前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务,当然你自己要明白自己在做什么)。
TransactionProxyFactoryBean允许你通过“preInterceptors”和“postInterceptors”属性设置“前”或“后”通知来提供额外的拦截行为。可以设置任意数量的“前”和“后”通知,它们的类型可以是Advisor(可以包含一个切入点)、MethodInterceptor或被当前Spring配置支持的通知类型(例如,ThrowAdvice、AfterReturningtAdvice或BeforeAdvice,这些都是默认支持的)。这些通知必须支持实例共享模式。如果你需要高级AOP特性来使用事务,那最好使用通用的org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactoryBean实用代理创建者。
也可以设置自动代理:配置AOP框架,不需要单独的代理定义类就可以生成类的代理。