春ブーツのカスタム注釈+ AOPスタンバイスイッチングライブラリを達成

要約:この記事では、シーンが派遣センターと監視センター、バックエンドTDDLは、サブメーターと倉庫を、達成するときに実行する必要がある需要:バックアップにメインライブラリーから切り替える必要がMyBatisのクエリのデータを使用している場合、クエリモニタ重要な事業を実施直接ライブラリー、またはスタンバイデータベースクエリに接続され、これ春ブーツは、この記事でAOPを直接接続スタンバイ・データベースのクエリを結合一次記録カスタム注釈では、メインバンクの圧力を低下させます。

バックアップリポジトリに切り替えることにより達成A. AOPマスターライブラリのカスタム注釈

1.1カスタム注釈

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
パブリック@interface SwitchDataBase {
    ブールswitch2Backup()は偽デフォルト。
}

1.2実装のカスタムインターセプタ注釈プロセス
のインポートjava.lang.reflect.Methodオブジェクト、
インポートjava.util.Arrays。

輸入org.aopalliance.intercept.MethodInterceptor。
輸入org.aopalliance.intercept.MethodInvocation。
輸入org.slf4j.Logger。
輸入org.slf4j.LoggerFactory;
輸入org.springframework.stereotype.Component。

/ **
 *スタンバイ・データベースの処理ロジックノートを行く
 * /
@Component
パブリッククラスSwitchDataBaseInterceptor実装{MethodInterceptorの

    民間最終ロガーログ= LoggerFactory.getLogger(SwitchDataBaseInterceptor.class)。

    @Override
    パブリックオブジェクトを呼び出し(MethodInvocation呼び出し)がThrowableを{スロー
        メソッドのメソッドを= invocation.getMethod()。
        SwitchDataBase注釈= getAnnotation(方法)
        IF(注釈== NULL){
            戻りinvocation.proceed()。
        }
        ヴァル= NULLオブジェクト。
        (もし!ThreadLocalMap.containsKey(GroupDataSourceRouteHelper.DATASOURCE_INDEX)){
            場合(annotation.switch2Backup()){
                log.info( "クエリバックDBアップ、方法:" + method.getName());
                GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1、TRUE)。
            }他{
                log.info( "クエリプライマリDB、方法:" + method.getName())。
                GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0、TRUE)。
            }
        }
        {試みる
            ヴァル= invocation.proceed()。
        }キャッチ(例外e){
            log.info(method.getDeclaringClass()のgetName()+ +。 ""
                    invocation.getMethod()のgetName()+ "方法调用失败、引数:" +
                    Arrays.toString(呼び出し。 getArguments()))。
            新しいのRuntimeException(e)を投げます。
        }最後に{
            GroupDataSourceRouteHelper.removeGroupDataSourceIndex()。
        }

        ヴァルを返します。
    }

    / **
    見つけるための方法の上方に宣言*注意
    * /
    プライベートSwitchDataBase getAnnotation(メソッド、メソッド){
        IF(method.isAnnotationPresent(SwitchDataBase.class)){
            ; method.getAnnotation(SwitchDataBase.class)を返す
        }
        戻りヌル;
    }

}

1.3設定OverallQueryConfiguration

AOPビーンに装着春ブーツ、特定のディレクトリのスキャンでの実装の注意事項は、通知プロセスを達成するために、カットに形成されています。以下のサンプルコードは
、インポートcom.wdk.wms.annotation.SwitchDataBaseInterceptor
インポートorg.springframework.aop.Advisor;
インポートorg.springframework.aop.support.DefaultPointcutAdvisor;
インポートorg.springframework.aop.support.JdkRegexpMethodPointcut;
インポートorg.springframework。 context.annotation.Bean;
インポートorg.springframework.context.annotation.Configuration。

@Configuration
パブリッククラスSwitchDataBaseConfiguration {

    @Bean(名= "overallQueryInterceptor")
    公衆SwitchDataBaseInterceptor overallQueryInterceptor(){
        )(新しいSwitchDataBaseInterceptorを返します。
    }


    //添加AOP的ポイントカット
    @Bean(名前= "jdkRegexpMethodPointcut")
    公共JdkRegexpMethodPointcut jdkRegexpMethodPointcut(){
        JdkRegexpMethodPointcut jdkRegexpMethodPointcut =新しいJdkRegexpMethodPointcut();
        jdkRegexpMethodPointcut.setPatterns( "com.wdk.wms.mapper *。");
        jdkRegexpMethodPointcutを返します。
    }

    AOPは、対応するデフォルト構成を設定//オリジナル<AOP:アドバイザ>
    @Bean
    公共druidAdvisorアドバイザ(){
        DefaultPointcutAdvisor DefaultPointcutAdvisor新しい新しいDefaultPointcutAdvisor =();
        defaultPointcutAdvisor.setPointcut(JdkRegexpMethodPointcut());
        defaultPointcutAdvisor.setAdvice(overallQueryInterceptor()) ;
        ; DefaultPointcutAdvisorを返します
    }

}

1.4どのようにスタンバイプールに一次ライブラリー・スイッチからのアノテーションを使用する
(trueに= switch2Backup)@SwitchDataBase
一覧<ConsumerNoticeMsg> listByTemplateOver3(@Param(「テンプレート」)一覧<整数>テンプレート)。

おすすめ

転載: www.linuxidc.com/Linux/2019-08/159830.htm