成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Boot中自定義注解+AOP實現(xiàn)主備庫切換

zhisheng / 787人閱讀

摘要:示例代碼如下添加的設(shè)置默認(rèn)的配置對應(yīng)的是原來的如何使用注解從主庫到備庫的切換

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

一.通過AOP 自定義注解實現(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 實現(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,實現(xiàn)掃描特定目錄下的注解,實現(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)的是原來的
    @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);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75740.html

相關(guān)文章

  • Spring Boot [配置-下篇]

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

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

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

    Olivia 評論0 收藏0
  • Spring Boot Aop

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

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

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

    meislzhua 評論0 收藏0
  • SpringBoot基礎(chǔ)篇AOP之基本使用姿勢小結(jié)

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

    timger 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<