1. 程式人生 > 實用技巧 >Spring-事務管理(完全註解方式實現宣告式事務管理)

Spring-事務管理(完全註解方式實現宣告式事務管理)

(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();
    }
}