对于AOP之事务管理
一、使用标签配置事务管理
1. 在XML配置文件中声明TransactionManager代理
<!-- 声明 TransactionManager bean -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 创建通知 -->
<bean id="txAdvice" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="txManager"/>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
</bean>
<!-- 声明 advisor 通知 -->
<bean id="txAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut">
<bean class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>save*</value>
<value>update*</value>
<value>delete*</value>
</list>
</property>
</bean>
</property>
<property name="advice" ref="txAdvice"/>
</bean>
<!-- 在相应的 bean 中引用 txAdvisor -->
<bean id="exampleBean" class="examples.ExampleBean">
<property name="dataSource" ref="dataSource"/>
<property name="jdbcTemplate" ref="jdbcTemplate"/>
<property name="txAdvice" ref="txAdvisor"/>
</bean>
上述配置中,我们声明了一个TransactionManager对象作为我们的事务管理器,接着创建了TransactionInterceptor对象,用于表示我们的事务拦截器,这里我们针对save、update、delete三种操作增加了REQUIRED类型的事务传播行为。最后,我们通过DefaultPointcutAdvisor对象将我们的通知txAdvice和切点NameMatchMethodPointcut进行关联。
2. 使用注解定义事务管理
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional
@Override
public void transfer(Account account1, Account account2, double money) {
accountDao.withdraw(account1, money);
accountDao.deposit(account2, money);
}
}
上述代码中,我们通过@Transactional注解来配置我们的事务,直接在方法上加上该注解即可实现事务的自动管理。
二、使用@Transactional注解配置事务管理
两种方式各有优缺点,使用xml声明式事务管理方式适用于具有层次结构的场景,通过定义切入点和Advisor实现对多个类和方法进行事务管理。使用注解方式优势是可以灵活地对各个方法进行独立的事务配置,更加简单方便。选择哪种方式,具体根据实际场景和需求进行考虑。
示例代码:
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional
@Override
public void transfer(Account account1, Account account2, double money) {
accountDao.withdraw(account1, money);
accountDao.deposit(account2, money);
}
}
@Component
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void withdraw(Account account, double money) {
jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?", money, account.getId());
}
@Override
public void deposit(Account account, double money) {
jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?", money, account.getId());
}
}
以上示例中,我们定义了一个AccountServiceImpl服务,并在transfer方法上使用了@Transactional注解来配置事务。另外,我们还使用了Autowired注解来对类中的依赖进行注入,使我们能够使用AccountDaoImpl类中的数据库操作方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:AOP之事务管理