区分包扫描方法 (正在使用的方法)
@Configuration
//配置包扫描路径
@MapperScan(basePackages = TiDBDataSourceConfig.PACKAGE,
sqlSessionFactoryRef = "tiDBSqlSessionFactory")
public class TiDBDataSourceConfig {
//当前数据源 包扫描路径
static final String PACKAGE = "com.zto.monitor.dal.dao.tidb";
//当前数据源 mapper映射扫描路径
static final String MAPPER_LOCATION = "classpath:com/zto/dal/dao/tidb/*.xml";
@Value("${spring.datasourceTiDB.url}")
private String url;
@Value("${spring.datasourceTiDB.username}")
private String user;
@Value("${spring.datasourceTiDB.password}")
private String password;
@Value("${spring.datasourceTiDB.driver-class-name}")
private String driverClass;
//配置数据源 名为tiDBDataSource
@Bean(name = "tiDBDataSource")
public DataSource tiDBDataSource() {
//新建druid数据源 使用druid连接池
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
//配置事务管理器 名为tiDBTransactionManager
@Bean(name = "tiDBTransactionManager")
public DataSourceTransactionManager tiDBTransactionManager() {
return new DataSourceTransactionManager(tiDBDataSource());
}
//配置sessionFactory
@Bean(name = "tiDBSqlSessionFactory")
public SqlSessionFactory tiDBSqlSessionFactory(@Qualifier("tiDBDataSource") DataSource tiDBDataSource)
throws Exception {
//新建sessionFactory
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
//设置数据源为当前数据源
sessionFactory.setDataSource(tiDBDataSource);
//设置mapper映射路径
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(TiDBDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
aop
简介: 用这种方式实现多数据源的前提必须要清楚两个知识点:AOP原理和AbstractRoutingDataSource抽象类。
1、AOP:这个东西。。。不切当的说就是相当于拦截器,只要满足要求的都会被拦截过来,然后进行一些列的操作。具体需要自己去体会。。。
2、AbstractRoutingDataSource:这个类是实现多数据源的关键,他的作用就是动态切换数据源,实质:有多少个数据源就存多少个数据源在targetDataSources(是AbstractRoutingDataSource的一个map类型的属性,其中value为每个数据源,key表示每个数据源的名字)这个属性中,然后根据determineCurrentLookupKey()这个方法获取当前数据源在map中的key值,然后determineTargetDataSource()方法中动态获取当前数据源,如果当前数据源不存并且默认数据源也不存在就抛出异常。
————————————————
参考链接:https://blog.csdn.net/tuesdayma/article/details/81081666