Spring Boot中自定义注解+AOP实现主备库切换

  • 2019 年 10 月 3 日
  • 笔记

??: ???????????????????????????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?????????<aop:advisor>      @Bean      public Advisor druidAdvisor() {          DefaultPointcutAdvisor defaultPointcutAdvisor = new DefaultPointcutAdvisor();          defaultPointcutAdvisor.setPointcut(jdkRegexpMethodPointcut());          defaultPointcutAdvisor.setAdvice(overallQueryInterceptor());          return defaultPointcutAdvisor;      }    }

1.4 ???????????????

@SwitchDataBase(switch2Backup = true)  List<ConsumerNoticeMsg> listByTemplateOver3(@Param("templates") List<Integer> templates);