Spring 配置事务管理器




事务管理器
方式一1. 实现TransactionManagementConfigurer接口2. 源码分析
方式二1. @Bean2. 源码分析


方式一
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;
}
}
12345678910111213141516171819202122
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;
}
}

12345678910111213141516171819202122
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);
}
}
1234567891011121314
————————————————
版权声明:本文为CSDN博主「Fisher3652」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40977118/article/details/109014755

posted @ 2022-06-01 10:35  职业吃井人  阅读(573)  评论(0编辑  收藏  举报