spring中使用注解声明事务

/ Spring / 没有评论 / 487浏览

在上一篇中我们已经简单的介绍了用xml的方式声明事务,spring中除了上述方式外,还可以直接使用注解的方式管理事务,也就是通过@Transactional注解对需要的事务进行事务管理的。@Transactional注解可以对类或者方法进行标注。下面我们使用测试用例来演示@Transactional注解的具体使用。

public interface IUserService {
public void doInsert(UserInfo userInfo);
public UserInfo getUserInfo(String id);
}
@Transactional // 添加事务注解
public class UserServiceImpl implements IUserService {

@Autowired
private IUserInfoDao userInfoDao;

@Override
public void doInsert(UserInfo userInfo) {
userInfoDao.doInsert(userInfo);
}

@Override
public UserInfo getUserInfo(String id) {
return userInfoDao.findById(id);
}
}

因为@Transactional注解有默认的事务属性,所以只需要添加上述注解即可完成对事务的管理。但有一个问题我们要注意,就是虽然上述注解有默认事务功能,但是我们知道,事务的注解底层是通过AOP的方式实现事务管理的,所以我们还需要的配置spring中的xml,使之让spring支持对@Transactional注解的支持。具体配置如下:

<!-- 配置基于注解的声明式事务默认使用注解来管理事务行为 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

上述配置是最简单的配置,实际上<tx:annotation-driven>标签还有别外两个属性,下面我们看一下这两个属性的具体功能。

proxy-target-class--:如果为true,则spring将创建子类来代理事务类,如果为false,则使用接口代理。如果使用子类代理,则项目中必须添加CGLib.jar库。
order--:如果业务类除了事务切面外,还要织入其它的切面,则可以通过该属性控制事务切面在目标连接点的织入顺序。

下面我们看一下@Transactional注解的相关默认属性都有哪些。

上述介绍的是@Transactional注解的默认设置,虽然很常用,但不一定能满足我们所有的需求,所以,spring还提供我们手动设置上述默认注解的功能。具体的配置如下:

360截图18140131416127.png

下面我们介绍一下@Transactional注解的注意事项