最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot中自定義注解結(jié)合AOP實(shí)現(xiàn)主備庫切換問題

 更新時間:2019年08月02日 09:50:03   作者:alterem  
這篇文章主要介紹了Spring Boot中自定義注解+AOP實(shí)現(xiàn)主備庫切換的相關(guān)知識,本篇文章的場景是做調(diào)度中心和監(jiān)控中心時的需求,后端使用TDDL實(shí)現(xiàn)分表分庫,需要的朋友可以參考下

摘要:本篇文章的場景是做調(diào)度中心和監(jiān)控中心時的需求,后端使用TDDL實(shí)現(xiàn)分表分庫,需求:實(shí)現(xiàn)關(guān)鍵業(yè)務(wù)的查詢監(jiān)控,當(dāng)用Mybatis查詢數(shù)據(jù)時需要從主庫切換到備庫或者直接連到備庫上查詢,從而減小主庫的壓力,在本篇文章中主要記錄在Spring Boot中通過自定義注解結(jié)合AOP實(shí)現(xiàn)直接連接備庫查詢。

一.通過AOP 自定義注解實(shí)現(xiàn)主庫到備庫的切換

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 實(shí)現(xiàn)方法攔截器對自定義注解處理

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() + "方法調(diào)用失敗,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,實(shí)現(xiàn)掃描特定目錄下的注解,實(shí)現(xiàn)切面變成形成通知處理。示例代碼如下

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;
  }
  //設(shè)置默認(rèn)的aop配置對應(yīng)的是原來的<aop:advisor>
  @Bean
  public Advisor druidAdvisor() {
    DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();
    defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut());
    defaultPointcutAdvisor.setAdvice(overallQueryInterceptor());
    return defaultPointcutAdvisor;
  }
}

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

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

總結(jié)

以上所述是小編給大家介紹的Spring Boot中自定義注解結(jié)合AOP實(shí)現(xiàn)主備庫切換,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java 獲取當(dāng)前時間及實(shí)現(xiàn)時間倒計時功能【推薦】

    Java 獲取當(dāng)前時間及實(shí)現(xiàn)時間倒計時功能【推薦】

    這篇文章主要介紹了Java 獲取當(dāng)前時間及實(shí)現(xiàn)時間倒計時功能 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Spring?Cloud整合XXL-Job的示例代碼

    Spring?Cloud整合XXL-Job的示例代碼

    這篇文章主要介紹了springcloud整合xxl-job的示例代碼,主要分為四個過程,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java學(xué)習(xí)之緩沖流的原理詳解

    Java學(xué)習(xí)之緩沖流的原理詳解

    為了提高其數(shù)據(jù)的讀寫效率,Java中又定義了四種緩沖流,分別是:字節(jié)緩沖輸入流、字節(jié)緩沖輸出流、字符緩沖輸入流和字符緩沖輸出流。本文主要來和大家聊聊這些緩沖流的原理,希望對大家有所幫助
    2023-01-01
  • Mybatis實(shí)現(xiàn)動態(tài)SQL編寫詳細(xì)代碼示例

    Mybatis實(shí)現(xiàn)動態(tài)SQL編寫詳細(xì)代碼示例

    這篇文章主要為大家詳細(xì)介紹了Mybatis中動態(tài)SQL的編寫使用,動態(tài)SQL技術(shù)是一種根據(jù)特定條件動態(tài)拼裝SQL語句的功能,它存在的意義是為了解決拼接SQL語句字符串時的痛點(diǎn)問題,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀

    這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細(xì)解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時響應(yīng)中斷,比如一個線程t1通過lockInterruptibly()方法獲取到一個可重入鎖,并執(zhí)行一個長時間的任務(wù),需要的朋友可以參考下
    2023-12-12
  • Java基于解釋器模式實(shí)現(xiàn)定義一種簡單的語言功能示例

    Java基于解釋器模式實(shí)現(xiàn)定義一種簡單的語言功能示例

    這篇文章主要介紹了Java基于解釋器模式實(shí)現(xiàn)定義一種簡單的語言功能,簡單描述了解釋器模式的概念、功能及Java使用解釋器模式定義一種簡單語言的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-05-05
  • Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用詳細(xì)介紹(1)

    Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用詳細(xì)介紹(1)

    這篇文章主要介紹了Mybatis中SqlMapper配置的擴(kuò)展與應(yīng)用(1)的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • Java 中POI 導(dǎo)入EXCEL2003 和EXCEL2007的實(shí)現(xiàn)方法

    Java 中POI 導(dǎo)入EXCEL2003 和EXCEL2007的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java 中POI 導(dǎo)入EXCEL2003 和EXCEL2007的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能掌握理解這種方法,需要的朋友可以參考下
    2017-09-09
  • @RequestMapping對不同參數(shù)的接收方式示例詳解

    @RequestMapping對不同參數(shù)的接收方式示例詳解

    Spring?MVC框架中,@RequestMapping注解用于映射URL到控制器方法,不同的參數(shù)類型如簡單參數(shù)、實(shí)體參數(shù)、數(shù)組參數(shù)、集合參數(shù)、日期參數(shù)和JSON參數(shù),本文給大家介紹@RequestMapping對不同參數(shù)的接收方式,感興趣的朋友一起看看吧
    2024-10-10
  • SpringBoot項(xiàng)目中新增脫敏功能的實(shí)例代碼

    SpringBoot項(xiàng)目中新增脫敏功能的實(shí)例代碼

    項(xiàng)目中,由于使用端有兩個,對于兩個端的數(shù)據(jù)權(quán)限并不一樣。Web端可以查看所有數(shù)據(jù),小程序端只能查看脫敏后的數(shù)據(jù),這篇文章主要介紹了SpringBoot項(xiàng)目中新增脫敏功能,需要的朋友可以參考下
    2022-11-11

最新評論

山阳县| 昭平县| 康乐县| 庄浪县| 唐河县| 汨罗市| 闸北区| 揭西县| 和田市| 聂拉木县| 察隅县| 济阳县| 宝鸡市| 碌曲县| 沅陵县| 孝感市| 水富县| 偃师市| 重庆市| 张掖市| 五原县| 民丰县| 开平市| 仙居县| 延安市| 西林县| 安新县| 金寨县| 林口县| SHOW| 伊川县| 成安县| 闽清县| 云龙县| 新乐市| 湘阴县| 炉霍县| 昌平区| 即墨市| 沅江市| 边坝县|