前言MybatisPlus(MP)作为mybatis的增强工具,提供了配置多数据源的扩展。经过几个简单的配置步骤后即可使用Annotations轻松切换数据源。下面是dynamic-datasource提供的功能列表:使用方法1.引入dynamic-datasource-spring-boot-starter。com.baomidoudynamic-datasource-spring-boot-starter${version}2.配置多个数据源。spring:datasource:dynamic:primary:master#默认主库名为masterstrict:false#不使用严格模式datasource:master:url:jdbc:mysql://127.0.0.1:3306/master用户名:root密码:66668888驱动程序类名:com.mysql.jdbc.Driverslave_1:url:jdbc:mysql://127.0.0.1:3307/slave_1用户名:root密码:66668888驱动程序类名:com.mysql.jdbc.Driverslave_2:url:ENC(xxxxx)#内置加密用户名:ENC(xxxxx)密码:ENC(xxxxx)driver-class-name:com.mysql.jdbc.Driver主库默认master,从库命名默认情况下,格式由_分隔。3、在方法或类上使用@DS切换数据源DS注解既可以写在类上也可以写在方法上,方法的优先级高于类。如果不指定DS的属性值或者不使用DS注解,会自动转到master主库。通过以上3个步骤,你就可以轻松使用MP切换多个数据源的能力了。当然除了支持主从模式外,还支持多主多从、多库、混合模式。原理探究打开dynamic-datasource-spring-boot-starter.jar包。在spring.factories文件中可以看到配置了DynamicDataSourceAutoConfiguration启动类。打开DynamicDataSourceAutoConfiguration类,可以看到通过@AutoConfigureBefore注解提前初始化了MP自身的DataSource数据源。DataSourceAutoConfiguration类的核心功能是初始化DataSrouce,MP通过抢占式配置让DataSource成为自己指定的数据源。DynamicDataSourceAutoConfiguration类除了初始化MP自身的数据源之外,还做了一些其他的初始化工作,比如DynamicDataSourceProperties配置,初始化DS注解的aspectAdvisor等。初始化工作完成之后,接下来就是判断是哪个数据源了根据DS注释使用。DynamicDataSourceAnnotationInterceptor类是一个方法拦截器,它的invoke包含判断DSkey的操作。在determineDatasourceKey方法中,会调用预先注入的DataSourceClassResolver类的findKey方法,判断类或方法上是否指定了DS注解。在该方法中,MP会缓存该方法的判断结果,下次执行同一个类的方法时,可以直接缓存,从而大大提高查找效率。获取到dsKey后,会在DynamicDataSourceContextHolder的LOOKUP_KEY_HOLDER中进行设置。它是一个泛型为Deque的ThreadLocal。为什么设置为栈?官方的解释是:下一步是获取数据库链接的AbstractRoutingDataSource类的getConnection方法,determineDataSource方法会获取指定的数据源。这里的逻辑是:如果没有指定DS,就去主库,如果指定了DS,就根据DS的属性值进行条件匹配,看走哪个判断分支。拿到连接链接后,接下来就是执行真正的数据库语句了。以上就是一个常见的数据库操作流程。大致思路是先找到MP的启动类,看看启动类是做什么的,然后按照寻找数据源和链接的思路,看看MP是如何实现多数据的。源切换操作。当然MP多数据源还有其他的功能,但是总体来说代码逻辑不是很复杂,通过debug整理一下源码即可。