国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot中自定義注解+AOP實現主備庫切換

zhisheng / 770人閱讀

摘要:示例代碼如下添加的設置默認的配置對應的是原來的如何使用注解從主庫到備庫的切換

摘要: 本篇文章的場景是做調度中心和監控中心時的需求,后端使用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);

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75740.html

相關文章

  • Spring Boot [配置-下篇]

    摘要:進行異常的捕捉與錯誤信息頁面的定制。告訴,這是一個對象,該對象應該被注冊為在應用程序上下文中的。不同框架的不同配置這里以作為演示默認情況下,保護已啟用。你必須配置包含令牌的所有的網頁來工作。該命名結構旨在幫你找到需要的。 導讀: 在上篇文章中我們了解到Spring Boot 的一些常用的外部化配置,在本篇中我們將會繼續對類的配置進行了解 一個簡單的例子[錯誤頁面定制]: 在 Spr...

    StonePanda 評論0 收藏0
  • Javag工程師成神之路(2019正式版)

    摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...

    Olivia 評論0 收藏0
  • Spring Boot Aop

    摘要:面向切面的程序設計思想也是面向切面軟件開發的基礎。與切面相關的編程概念還包括元對象協議主題混入和委托。切面聲明類似于中的類聲明,在中會包含著一些以及相應的。 spring-boot-aop 什么是aop 面向切面的程序設計(Aspect-oriented programming,AOP,又譯作面向方面的程序設計、剖面導向程序設計)是計算機科學中的一種程序設計思想,旨在將橫切關注點與業務...

    Channe 評論0 收藏0
  • 貓頭鷹的深夜翻譯:使用SpringBoot和AspectJ實現AOP

    摘要:我們會寫切面來攔截對這些業務類和類的調用。切面定義何時攔截一個方法以及做什么和在一起成為切面連接點當代碼開始執行,并且切點的條件滿足時,通知被調用。 前言 這篇文章會幫助你使用Spring Boot Starter AOP實現AOP。我們會使用AspectJ實現四個不同的通知(advice),并且新建一個自定義的注解來追蹤方法的執行時間。 你將會了解 什么是交叉分割關注點(cross...

    meislzhua 評論0 收藏0
  • SpringBoot基礎篇AOP之基本使用姿勢小結

    摘要:通知和切點共同定義了關于切面的全部內容,它是什么時候,在何時和何處完成功能引入允許我們向現有的類添加新的方法或者屬性組裝方面來創建一個被通知對象。這可以在編譯時完成例如使用編譯器,也可以在運行時完成。和其他純框架一樣,在運行時完成織入。 原文:190301-SpringBoot基礎篇AOP之基本使用姿勢小結 一般來講,談到Spring的特性,繞不過去的就是DI(依賴注入)和AOP(切...

    timger 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<