栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Boot中自定义注解结合AOP实现主备库切换问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Boot中自定义注解结合AOP实现主备库切换问题

摘要:本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的压力,在本篇文章中主要记录在Spring Boot中通过自定义注解结合AOP实现直接连接备库查询。

一.通过AOP 自定义注解实现主库到备库的切换

1.1 自定义注解

自定义注解如下代码所示

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SwitchDatabase {
  boolean switch2Backup() default false;
}

1.2 实现方法拦截器对自定义注解处理

import java.lang.reflect.Method;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SwitchDatabaseInterceptor implements MethodInterceptor {
  private final Logger log = LoggerFactory.getLogger(SwitchDatabaseInterceptor.class);
  @Override
  public Object invoke(MethodInvocation invocation) throws Throwable {
    Method method = invocation.getMethod();
    SwitchDatabase annotation = getAnnotation(method);
    if (annotation == null) {
      return invocation.proceed();
    }
    Object val = null;
    if(!ThreadLocalMap.containsKey(GroupDataSourceRouteHelper.DATASOURCE_INDEX)) {
      if (annotation.switch2Backup()) {
 log.info("query back up DB, method: " + method.getName());
 GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1, true);
      } else {
 log.info("query primary DB, method: " + method.getName());
 GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0, true);
      }
    }
    try {
      val = invocation.proceed();
    } catch (Exception e) {
      log.info(method.getDeclaringClass().getName() + "." +
   invocation.getMethod().getName() + "方法调用失败,arguments:" +
   Arrays.toString(invocation.getArguments()));
      throw new RuntimeException(e);
    } finally {
      GroupDataSourceRouteHelper.removeGroupDataSourceIndex();
    }
    return val;
  }
  
  private SwitchDatabase getAnnotation(Method method) {
    if (method.isAnnotationPresent(SwitchDatabase.class)) {
      return method.getAnnotation(SwitchDatabase.class);
    }
    return null;
  }
}

1.3 配置OverallQueryConfiguration

在Spring Boot中装配AOP Bean,实现扫描特定目录下的注解,实现切面变成形成通知处理。示例代码如下

import com.wdk.wms.annotation.SwitchDatabaseInterceptor;
import org.springframework.aop.Advisor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SwitchDatabaseConfiguration {
  @Bean(name = "overallQueryInterceptor")
  public SwitchDatabaseInterceptor overallQueryInterceptor() {
    return new SwitchDatabaseInterceptor();
  }
  //添加aop的pointcut
  @Bean(name = "jdkRegexpMethodPointcut")
  public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() {
    JdkRegexpMethodPointcut jdkRegexpMethodPointcut = new JdkRegexpMethodPointcut();
    jdkRegexpMethodPointcut.setPatterns("com.wdk.wms.mapper.*");
    return jdkRegexpMethodPointcut;
  }
  //设置默认的aop配置对应的是原来的
  @Bean
  public Advisor druidAdvisor() {
    DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();
    defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut());
    defaultPointcutAdvisor.setAdvice(overallQueryInterceptor());
    return defaultPointcutAdvisor;
  }
}

1.4 如何使用注解从主库到备库的切换

@SwitchDatabase(switch2Backup = true)
List listByTemplateOver3(@Param("templates") List templates);

总结

以上所述是小编给大家介绍的Spring Boot中自定义注解结合AOP实现主备库切换,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/137473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号