Spring-事務管理(完全註解方式實現宣告式事務管理)
阿新 • • 發佈:2020-08-19
(1)建立配置類代替配置檔案
package com.orzjiangxiaoyu.spring.util; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidPooledConnection; import org.junit.Test; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.sql.SQLException; /** * @author orz * @create 2020-08-18 22:50*/ @Configuration//配置類 @ComponentScan(basePackages = "com.orzjiangxiaoyu")//元件掃描 @EnableTransactionManagement//開啟事務 public class TxConfig { //建立資料庫連線池 @Bean public DruidDataSource getDruidDataSource() { DruidDataSource dataSource=new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode\\=true&characterEncoding\\=utf-8"); dataSource.setUsername("root"); dataSource.setPassword("root"); return dataSource; } //建立JdbcTemplate物件 @Bean public JdbcTemplate getJdbcTemplate(DataSource dataSource) { //到ioc中根據型別找到dataSource JdbcTemplate jdbcTemplate=new JdbcTemplate(); //注入dataSoure jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } //建立事務管理器物件 @Bean public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) { DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } }
package com.orzjiangxiaoyu.spring.service; import com.orzjiangxiaoyu.spring.dao.BankDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * @author orz * @create 2020-08-18 16:32 */ @Service @Transactional public class BankService { @Autowired private BankDao bankDao; //轉賬方法 //宣告式 public void accountMoney() { //少錢操作 bankDao.reduceMoney(); //手動丟擲異常 System.out.println(1/0); //多錢操作 bankDao.addMoney(); } }
測試
package com.orzjiangxiaoyu.spring.testdemo; import com.orzjiangxiaoyu.spring.service.BankService; import com.orzjiangxiaoyu.spring.util.TxConfig; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @author orz * @create 2020-08-18 23:04 */ public class Test2 { @Test public void test1() { ApplicationContext context=new AnnotationConfigApplicationContext(TxConfig.class); BankService bankService = context.getBean("bankService", BankService.class); bankService.accountMoney(); } }