公司项目重构,由于时间+成本原因决定将老项目分成多个单体项目,后续再集成微服务.但是由于各服务的数据库不一致且存在单个服务调用多个数据库问题,采用了springboot集成多数据源的方式处理;
一.持久层模块
1.创建多个数据库模块并放到一个父Maven项目中,每一个模块对应一个数据库
2.每个模块内写一个configuration,集成对应的数据源,并指定包下的类使用对应数据源
package com.pay.provider.management.config;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
// 这里扫描mapper文件,设定这些mapper下的类使用此数据源
@MapperScan(basePackages = "com.pay.provider.management.mapper", sqlSessionTemplateRef = "managementFactory")
public class ManagementDatasourceConfig {
@Bean(name = "managementDatasource")
@ConfigurationProperties("spring.datasource.management") // 这里是yml配置里datasource的前缀
public DataSource managementDatasource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "managementDataSourceFactory")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("managementDatasource") DataSource dataSource) throws Exception {
// 如果使用MyBatis-Plus使用MybatisSqlSessionFactoryBean,否则SqlSessionFactoryBean
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/management/*.xml"));
return sessionFactoryBean.getObject();
}
/**
* 创建SqlSessionTemplate
*/
@Bean(name = "managementFactory")
public SqlSessionTemplate managementSqlSessionTemplate(@Qualifier("managementDataSourceFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
/**
* 创建事务管理器
*/
@Bean("managementTransactionManger")
public DataSourceTransactionManager managementTransactionManger(@Qualifier("managementDatasource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
3.在MATE-INF里添加文件spring.factories,并指定配置文件位置(约定优于配置的特性,springboot项目引用此模块时会根据此文件读取配置)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.pay.provider.management.config.ManagementDatasourceConfig
二.业务模块
1.引用持久层模块,直接在pom.xml里添加依赖即可(这里是所有模块在同一个项目里,如果不是则可将持久成打成jar包引入)
2.application.yml文件里写入datasuorce数据,注意红框里的字段要和前面的configuration里对应上
3.启动类去掉springboot自带的datasoure集成