中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot中自定義注解結合AOP實現主備庫切換問題

發布時間:2020-08-24 22:18:49 來源:腳本之家 閱讀:130 作者:alterem 欄目:編程語言

摘要:本篇文章的場景是做調度中心和監控中心時的需求,后端使用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 switch3Backup() 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.switch3Backup()) {
        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配置對應的是原來的<aop:advisor>
  @Bean
  public Advisor druidAdvisor() {
    DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();
    defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut());
    defaultPointcutAdvisor.setAdvice(overallQueryInterceptor());
    return defaultPointcutAdvisor;
  }
}

1.4 如何使用注解從主庫到備庫的切換

@SwitchDataBase(switch3Backup = true)
List<ConsumerNoticeMsg> listByTemplateOver3(@Param("templates") List<Integer> templates);

總結

以上所述是小編給大家介紹的Spring Boot中自定義注解結合AOP實現主備庫切換,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌海市| 类乌齐县| 内丘县| 隆德县| 舞阳县| 兴山县| 察雅县| 武鸣县| 元阳县| 潼南县| 固始县| 彩票| 仙桃市| 岢岚县| 新源县| 佛冈县| 南京市| 湟中县| 金乡县| 高淳县| 西安市| 嘉峪关市| 瓦房店市| 武定县| 和田市| 西藏| 清水河县| 龙岩市| 新宁县| 阳春市| 罗定市| 涟源市| 上饶市| 马鞍山市| 河南省| 嵊州市| 建宁县| 佛学| 武威市| 崇义县| 杭锦旗|