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