zoukankan      html  css  js  c++  java
  • 切面+自定义注解的使用

    1.applicationContext.xml中开启注解扫描

    <context:component-scan base-package="com.lcb,com.lcb.soa.store.item" />

    2.自定义注解

    1 @Target(ElementType.METHOD)
    2 @Retention(RetentionPolicy.RUNTIME)
    3 @Documented
    4 @Inherited
    5 public @interface DateBaseName {
    6 
    7     String dataBaseName() default "";
    8 }


    3.定义切面类

     1 /**
     2  * @author caiyike
     3  * @version 1.0
     4  * @date 2019-02-26 15:26
     5  */
     6 @Aspect
     7 @Component
     8 public class DataBaseManager {
     9 
    10     @Pointcut("execution(* com.lcb.soa.store.item.test..*.*(..)) ")
    11     private void useDateBaseByName() {
    12     }
    13 
    14 
    15     @Around("useDateBaseByName()")
    16     public Object useMaster(ProceedingJoinPoint joinPoint) throws Throwable {
    17         Object[] args = joinPoint.getArgs();
    18         Method method = getMethod(joinPoint, args);
    19         //获取数据库名称参数
    20         String oldDataSource = DataSourceContextHolder.getRuntimeDataSourceKey();
    21         DateBaseName chooseDataSource = method.getAnnotation(DateBaseName.class);
    22         if(chooseDataSource != null){
    23             String dataBaseName = chooseDataSource.dataBaseName();
    24             DataSourceContextHolder.setDataSourceKey(dataBaseName);
    25             try {
    26                 Object proceed = joinPoint.proceed();
    27                 DataSourceContextHolder.setDataSourceKey(oldDataSource);
    28                 return proceed;
    29             } catch (Throwable e) {
    30                 throw e;
    31             } finally {
    32                 DataSourceContextHolder.clearDataSourceKey();
    33             }
    34         }else {
    35             Object proceed = joinPoint.proceed();
    36             DataSourceContextHolder.setDataSourceKey(oldDataSource);
    37             return proceed;
    38         }
    39 
    40     }
    41 
    42     private Method getMethod(ProceedingJoinPoint joinPoint, Object[] args) throws NoSuchMethodException {
    43         String methodName = joinPoint.getSignature().getName();
    44         Class clazz = joinPoint.getTarget().getClass();
    45         Method[] methods = clazz.getMethods();
    46         for (Method method : methods) {
    47             if (methodName.equals(method.getName())) {
    48                 return method;
    49             }
    50         }
    51         return null;
    52     }
    53 }

    4.Method上使用自定义注解

    @DateBaseName(dataBaseName = "masterStoreItem")
    public void method(){}

    AOP中pointcut expression表达式参考

    https://blog.csdn.net/kkdelta/article/details/7441829 

  • 相关阅读:
    《程序员修炼之道:从小工到专家》阅读笔记(一)
    第十一周进度报告
    用户模板和用户场景
    第十周进度报告
    团队冲刺第十天
    团队冲刺第九天
    团队冲刺第八天
    第一阶段用户评价
    第十二周总结
    第十一周总结
  • 原文地址:https://www.cnblogs.com/joke0406/p/10441929.html
Copyright © 2011-2022 走看看