- txannotation-driven其他属性
- 关于Transaction的属性
- 在何处标注Transactional注解
- 使用不同的事务管理器
系列
Spring对事务管理的支持概述以及 编程式的事务管理
Spring JDBC-使用XML配置声明式事务
Spring JDBC-使用注解配置声明式事务
概述
除了基于XML的事务配置,Spring还提供了基于注解的事务配置,即通过@Transactional对需要事务增强的Bean接口、实现类或者方法进行标注: 在容器中配置基于注解的事务增强驱动,即可以启用基于注解的声明式事务 。
使用@Transactional注解
我们来对Spring JDBC-使用XML配置声明式事务中的例子使用@Transactional对基于aop/tx命名空间的事务配置进行改造,我们来感受下二者在使用方式上的差异。
@Service @Transactional // 对业务类进行事务增强的标注 public class TeacherService { private TeacherDao teacherDao; public void addTeacher(Teacher teacher) { teacherDao.addTeacher(teacher); } public void updateTeacher(Teacher teacher) { teacherDao.updateTeacher(teacher); } public void getTeacherById(int teacherId) { teacherDao.getTeacher(teacherId); } public void addStudentForTeacher(Teacher teacher, Student student) { teacher.setStudent(student); teacherDao.addStudent(student); } }
因为注解本身具有一组普适性的默认事务属性,所以 往往只需要在需要事务管理的业务类中添加一个@Transactional注解,就完成了业务类事务属性的配置.
当然,注解只是提供元数据,它本身并不能完成事务切面织入的功能,因此,还需要 在Spring中配置文件中通过一行小小的配置“通知”Spring容器对标注@Transactional注解的Bean进行加工处理 ,如下
<!--基于数据源的事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/> <!--对标注了@Transactional注解Bean进行加工处理,以织入事务管理切面--> <tx:annotation-driven transaction-manager="transactionManager"/>
在默认情况下, <tx:annotation-driven>
会自动使用名为transactionManager事务管理器, 所以,如果我们的事务管理器的id为transactionManager,如上所示,则可以进一步简化为
<tx:annotation-driven/>
<tx:annotation-driven>
其他属性
- proxy-target-class: 如果为true ,Spring将通过创建子类来代理业务类,若果为false,则使用基于接口的代理。 如果使用子类代理,,需要在类路径中添加CGlib.jar类库
- order:如果业务类除