1. 程式人生 > 實用技巧 >spring全家桶使用學習-多資料來源(多主)配置

spring全家桶使用學習-多資料來源(多主)配置

對於一些專案中可能存在需要配置多個主資料來源,並非HA模式

當存在多主資料來源時,就不能使用 spring-boot-jdbc-starter 自動裝配,而需要自行管理相關bean;

1:排除spring-boot datasource相關自動配置類

通過SpringBootApplication註解中的exclude 方法可以排除多個類 ;

對於當前情況,需要排除

  • DataSource自動配置 :org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
  • TransactionManager 自動配置:org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
  • JDBCTemplate 自動配置:org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration

2:排除了springboot自動裝配後,手動配置dataSource相關bean

/*
 * Copyright (c) 2020, guoxing, Co,. Ltd. All Rights Reserved
 */
package com.xingguo.multi.datasource.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; /** * MultiDataSourceConfig * 自定義多資料來源 * * @author guoxing * @date 2020/12/14 3:53 PM * @since */ @Configuration public class MultiDataSourceConfig { /** * 自定義宣告 foo.datasource 配置相關 * {@link ConfigurationProperties}註解使用支援解析properties檔案中指定字首的key * * @return */ @Bean("fooDataSourceProperties") @ConfigurationProperties("foo.datasource") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); } /** * 自定義宣告 foo datasource * * @param dataSourceProperties * @return */ @Bean("fooDataSource") public DataSource fooDataSource(@Qualifier("fooDataSourceProperties") DataSourceProperties dataSourceProperties) { System.out.printf("當前fooDataSourceUrl為:%s\n", dataSourceProperties.getUrl()); return dataSourceProperties.initializeDataSourceBuilder().build(); } /** * 自定義 foo 相關事務管理器 */ @Bean("fooTransactionManager") public PlatformTransactionManager fooTransactionManager(@Qualifier("fooDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 自定義宣告 bar.datasource 配置相關 * * @return */ @Bean("barDataSourceProperties") @ConfigurationProperties("bar.datasource") public DataSourceProperties barDataSourceProperties() { return new DataSourceProperties(); } /** * 自定義宣告 bar datasource * * @param dataSourceProperties * @return */ @Bean("barDataSource") public DataSource barDataSource(@Qualifier("barDataSourceProperties") DataSourceProperties dataSourceProperties) { System.out.printf("當前barDataSourceUrl為:%s\n", dataSourceProperties.getUrl()); return dataSourceProperties.initializeDataSourceBuilder().build(); } /** * 自定義 bar 相關事務管理器 */ @Bean("barTransactionManager") public PlatformTransactionManager barTransactionManager(@Qualifier("barDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }

詳細原始碼地址:https://github.com/mengyan183/spring-family/tree/main/spring-multi-datasource