基于tx/aop配置的声明式事务管理是实际开发中最常用的事务管理方式之一。
在“Spring3事务管理——使用原始的TransactionProxyFactoryBean”代码基础上修改applicationContext.xml。
配置如下:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource">
</bean>
<!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethod"
expression=" execution(* net.yingyi.games.service..*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 定义JdbcTemplate的Bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource">
</bean>
<!-- 需要实施事务增强的目标业务Bean -->
<bean id="userScore"
class="net.hingyi.springDemo.transaction.service.UserScoreServiceImpl"
p:userScoreRepository-ref="userScoreRepository_jdbc" />
<bean id="userScoreRepository_jdbc"
class="net.hingyi.springDemo.transaction.repository.UserScoreRepositoryImpl"
p:jdbcTemplate-ref="jdbcTemplate" />
上面的代码中,我们可以看到不同的角色:通过tx/aop定义的声明式事务配置信息、业务Bean、Spring容器。Spring容器自动将“通过tx/aop定义的声明式事务配置信息”应用于“业务Bean”,从容器中返回的业务Bean已经是被织入事务增强的代理Bean,即“通过tx/aop定义的声明式事务配置信息”和“业务Bean”在配置时不直接管理。