成都网站建设设计

将想法与焦点和您一起共享

SpringBoot中怎么通过自定义注解实现主备库切换

今天就跟大家聊聊有关SpringBoot中怎么通过自定义注解实现主备库切换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

成都创新互联公司专注于企业成都营销网站建设、网站重做改版、仪征网站定制设计、自适应品牌网站建设、H5开发商城系统网站开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为仪征等各大城市提供网站开发制作服务。

一.通过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配置对应的是原来的  @Bean  public Advisor druidAdvisor() {    DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();    defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut());    defaultPointcutAdvisor.setAdvice(overallQueryInterceptor());    return defaultPointcutAdvisor;  }}

1.4 如何使用注解从主库到备库的切换

@SwitchDataBase(switch3Backup = true)List listByTemplateOver3(@Param("templates") List templates);

看完上述内容,你们对SpringBoot中怎么通过自定义注解实现主备库切换有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


本文标题:SpringBoot中怎么通过自定义注解实现主备库切换
标题来源:http://chengdu.cdxwcx.cn/article/pgdogp.html