Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换(3)
导读:Spring,在 Spring 配置中使用 :在 Spring 的配置中,我们可以将 AbstractRoutingDataSource 配置为数据源 bean,并将真实的数据源作为其目标数据源。在需要切换数据源的
Spring
在 Spring 配置中使用:在 Spring 的配置中,我们可以将AbstractRoutingDataSource配置为数据源 bean,并将真实的数据源作为其目标数据源。在需要切换数据源的时候,调用 determineCurrentLookupKey() 方法,它将返回用于切换数据源的键值。
在com.zbbmeta.config包下创建DynamicDataSource类
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
DynamicDataSource类中重写determineCurrentLookupKey()方法:在这个方法中,我们通过调用DataSourceContextHolder.getDataSourceType()来获取当前线程持有的数据源类型。这个方法的返回值将被用作数据源的 lookup key,从而实现动态切换。
6. 添加DataSource注解类
在·com.zbbmeta.annotation包下创建DataSource注解类,这是一个自定义注解,用于标记在类或方法上,以指定数据源的类型。下面是对这段代码的注解说明
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
DatabaseType type() default DatabaseType.SLAVE;
}
注解说明:
- @interface DataSource:这是一个注解的声明,用于创建名为 DataSource 的自定义注解。
- @Target({ElementType.METHOD, ElementType.TYPE}):
@Target注解表示此注解可以用于类和方法。在这里,DataSource注解可以标注在类和方法上。 @Retention(RetentionPolicy.RUNTIME):@Retention 注解表示这个注解的生命周期,即在运行时仍然可用。这是因为我们希望在运行时通过反射获取注解信息。DatabaseType type() default DatabaseType.SLAVE:这是 DataSource 注解的一个成员变量。它是一个枚举类型的变量,表示数据库类型,默认值为 SLAVE。通过这个成员变量,我们可以在使用 DataSource 注解时指定使用的数据源类型
7. 配置数据源切换切面
在com.zbbmeta.aspect包下创建一个切面类DataSourceAspect,用于在执行数据库操作前动态切换数据源。
@Aspect
@Component
@EnableAspectJAutoProxy
public class DataSourceAspect {
// 定义切点,匹配使用了 @DataSource 注解的方法
@Pointcut("@annotation(com.zbbmeta.annotation.DataSource)")
public void dataSourcePointCut() {}
// 环绕通知,在方法执行前后切换数据源
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
// 获取方法上的 @DataSource 注解
DataSource dataSource = method.getAnnotation(DataSource.class);
if (dataSource != null) {
// 切换数据源类型
DatabaseContextHolder.setDatabaseType(dataSource.type());
}
try {
// 执行目标方法
return point.proceed();
} finally {
// 清除数据源类型,确保线程安全
DatabaseContextHolder.clearDatabaseType();
}
}
}
相关阅读
-
免费备案二级域名分发解析 永久免费已备案二级域名注册
今天为大家介绍免费备案二级域名分发解析和永久免费已备案二级域名注册的IT知识,一起来了解了解吧。 想要制作一个网站,域名是必不可少的。每个网站都有独一无二的域名,那么新手该
-
什么是服务器虚拟化? 服务器虚拟化的优点
下面为网友们详细介绍什么是服务器虚拟化方面的介绍,一起跟随小编看看吧! 随着云计算平台越来越成熟,服务器虚拟化技术也逐渐普及。服务器虚拟化可以将一台物理服务器分成多个虚拟
-
OSI七层网络模型物理层详解 物理层的主要功能和特点有哪些
下面为网友们详细介绍OSI七层网络模型物理层详解的相关话题,接下来一起来看看吧。 物理层是OSI模型中的第一层,它负责在物理媒介上传输原始比特流,并定义了传输介质、传输速率、编码
-
网站制作要求有哪些内容 简述网页制作的基本步骤
正文核心导读:网站制作要求有哪些内容和简述网页制作的基本步骤方面的内容,具体详情如下: 1、找专业网站建设公司。既为专业,那建站经验很丰富,有着完善的建站流程,高水准的建站


