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>