Spring 配置事务管理器

方式一

1. 实现TransactionManagementConfigurer接口

  • 重写annotationDrivenTransactionManager()方法。返回一个事务管理器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import javax.sql.DataSource;

//创建事务管理器
@Component
public class TransactionManagementConfigurerBean implements TransactionManagementConfigurer {

    @Autowired
    private DataSource dataSource;

    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        DataSourceTransactionManager dtm = new DataSourceTransactionManager();
        dtm.setDataSource(dataSource);
        return dtm;
    }
}

2. 源码分析

  • AbstractTransactionManagementConfiguration类,spring的注解事务管理器,里面有一个事务管理器变量

在这里插入图片描述

  • setConfigurers()方法中,通过TransactionManagementConfigurer类的annotationDrivenTransactionManager()得到一个子类返回的事务管理器,并赋值给spring的事务管理器变量,点击这个annotationDrivenTransactionManager方法,会跳到上面重写的那个annotationDrivenTransactionManager方法

在这里插入图片描述
在这里插入图片描述

方式二

1. @Bean

  • 这里dataSource实例需要在Spring容器存在,通过@Bean向spring容器中添加一个PlatformTransactionManager 类型的bean
package org.example.transaction;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Component
public class EnableTransactionManagementBean {

    //创建事务管理器
    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager(DataSource dataSource) {
        DataSourceTransactionManager dtm = new DataSourceTransactionManager();
        dtm.setDataSource(dataSource);
        return dtm;
    }
}

2. 源码分析

  • TransactionAspectSupport类中的determineTransactionManager()方法是用来获取事务管理器的

在这里插入图片描述

在这里插入图片描述

// 1.先获取变量transactionManager
PlatformTransactionManager defaultTransactionManager = getTransactionManager();
// 2.如果defaultTransactionManager 为空,则进入if
if (defaultTransactionManager == null) {
	// 3.从缓存中获取transactionManager变量,如果缓存中也不存在,则进入if
	defaultTransactionManager = this.transactionManagerCache.get(DEFAULT_TRANSACTION_MANAGER_KEY);
	if (defaultTransactionManager == null) {
		// 4.从beanFactory中获取PlatformTransactionManager类型的bean,所以通过@Bean可以添加事务管理器
		defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class);
		// 加入缓存
		this.transactionManagerCache.putIfAbsent(
				DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager);
	}
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值