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

posted @ 2020-12-14 21:03  郭星  阅读(239)  评论(0)    收藏  举报