在Spring中,@Enable驱动基于@Import实现,通过@Import装载导入类,将其定义为Spring Bean。而导入类主要@Configuration标注的类,接口ImportBeanDefinitionRegistrar以及ImportSelector的实现三种实现形式。以下代码基于@Configuration实现mybatis多数据配置
POM文件依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.march</groupId>
<artifactId>multiple-datasource-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
</dependencies>
定义EnableMultipartsDataSource注解
/**
*@description: 多数据源配置
*@see: EnableMulipartsDataSource
*@createTime: 2020/5/18 13:57
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import(MultipartsDataSourceConfiguration.class)
public @interface EnableMultipartsDataSource {
}
MultipartsDataSourceConfiguration的实现,根据此类加载动态数据源
/**
*@description: 多数据源配置Configuration
*@see: MultipartsDataSourceConfiguration
*@createTime: 2020/5/18 14:24
*@version:1.0
*/
@Configuration
public class MultipartsDataSourceConfiguration {
@Primary
@Bean(name = "firstDataSource")
@ConfigurationProperties(prefix = "spring.datasource.first")
public DataSource getDateSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource getDateSource2() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dynamicSwitchDataSource")
@ConditionalOnBean(name={"firstDataSource","secondDataSource"})
public DynamicSwitchDataSource DataSource(@