其实这里的核心是@EnableTransactionManagement
注解启用事务管理。在XXXConfig中注入datasource与DataSourceTransactionManager即可。
配置类如下:
@EnableTransactionManagement @ComponentScan("com.web.tx") @Configuration public class TxConfig { //数据源 @Bean public DataSource dataSource() throws Exception{ ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("123456"); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); return dataSource; } // @Bean public JdbcTemplate jdbcTemplate() throws Exception{ //Spring对@Configuration类会特殊处理;给容器中加组件的方法,多次调用都只是从容器中找组件 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource()); return jdbcTemplate; } //注册事务管理器在容器中 @Bean public PlatformTransactionManager transactionManager() throws Exception{ return new DataSourceTransactionManager(dataSource()); } }
@EnableTransactionManagement注解功能:开启基于注解的事务管理功能。
等同于以前xml配置:
<tx:annotation-driven/>
另外需要注意注册事务管理器bean于Spring容器中。
UserDao如下:
@Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public void insert(){ String sql = "INSERT INTO `tbl_user`(username,age) VALUES(?,?)"; String username = UUID.randomUUID().toString().substring(0, 5); jdbcTemplate.update(sql, username,19); } }
UserService如下:
@S@Service public class UserService2 { @Autowired private UserDao userDao; @Transactional public void insertUser(){ userDao.insert(); //otherDao.other();xxx System.out.println("插入完成..."); int i = 10/0;//这里人为抛出异常,测试事务 } }
测试类如下:
public class IOCTest_Tx { @Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TxConfig.class); UserService2 userService = applicationContext.getBean(UserService2.class); userService.insertUser(); applicationContext.close(); } }
综上,可以看到将数据源,事务管理器等以前xml配置的方式替换为注解形式,可以实现完全无xml的声明式事务。