91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

SpringBoot中怎么通過自定義注解實現主備庫切換

發布時間:2021-08-10 14:24:36 來源:億速云 閱讀:202 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關SpringBoot中怎么通過自定義注解實現主備庫切換,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一.通過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;/** * 處理走備庫邏輯的注解 */@Componentpublic 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;@Configurationpublic 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);

看完上述內容,你們對SpringBoot中怎么通過自定義注解實現主備庫切換有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

南投县| 罗平县| 陆河县| 许昌县| 宁明县| 安阳县| 彩票| 剑川县| 临猗县| 正定县| 深圳市| 普兰县| 新沂市| 博爱县| 龙山县| 拉孜县| 扎兰屯市| 临湘市| 台前县| 西林县| 贵州省| 来安县| 汶川县| 德格县| 驻马店市| 枝江市| 浮梁县| 太仆寺旗| 车致| 达州市| 丰顺县| 运城市| 鹤庆县| 启东市| 吐鲁番市| 泸定县| 白银市| 隆尧县| 元阳县| 抚顺县| 监利县|