JdbcTemplate中如何进行事务的切面配置?

JdbcTemplate支持通过切面进行事务管理。所谓切面,就是把一些跨越多个类的功能抽取出来,并声明这个功能什么时候应该执行。

JdbcTemplate的事务切面配置步骤如下:
1、 在 Spring 配置文件中定义事务管理器:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

2、 使用tx namespace定义事务通知:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>
  • transaction-manager:指定事务管理器
  • tx:method:设置切面规则,名称为*表示匹配所有方法
    3、 使用aop namespace定义切面:
<aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>  
  • aop:pointcut:定义切点,匹配com.example.service包下的所有方法
  • aop:advisor:将事务通知和切点进行绑定
    4、 事务通知会自动应用到指定包的所有方法上。
    例如:
  • com.example.service包下所有的方法
  • 会自动应用上事务配置
  • 不需要在每个方法上添加@Transactional注解

这实现了 declarative transaction management(声明式事务管理),以更简单的方式配置事务。

一个完整示例:

<!--事务管理器-->  
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="dataSource"/>  
</bean> 

<!--事务通知-->  
<tx:advice id="txAdvice" transaction-manager="transactionManager">  
    <tx:attributes>  
        <tx:method name="*"/>  
    </tx:attributes>  
</tx:advice>

<!--切面配置-->  
<aop:config> 
    <aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/>  
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>  
</aop:config>