• aop 拦截含有特定注解的类


    1.功能点:使用aop拦截含有自定义注解的类

    1.自定义注解

      

    package com.zhuanche.common.dingdingsync;
    
    import java.lang.annotation.*;
    
    /**
     * @Author fanht
     * @Description 含有该注解的controller方法存储到mq
     * @Date 2019/2/28 上午11:26
     * @Version 1.0
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Documented
    public @interface DingdingAnno {
    }

    2.使用切面

    package com.zhuanche.common.dingdingsync;

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.*;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;

    import java.lang.reflect.Method;
    import java.util.Arrays;

    /**
    * @Author fanht
    * @Description
    * @Date 2019/2/28 上午11:59
    * @Version 1.0
    */
    @Component
    @Aspect
    public class DingdingAspect {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("execution(* com.zhuanche.controller.driverteam.DriverTeamController.*(..))")
    public void pointCut(){
    logger.info("含有自定义注解dingdingAnno的方法...");
    }

    @Before("pointCut() && @annotation(dingdingAnno) ")
    public void dingdingVerify(JoinPoint joinPoint,DingdingAnno dingdingAnno){
    System.out.println("&&&&&&&&&&&&&&&&&&&&");
    logger.info(joinPoint.getSignature().getName() + ",入参:{" + Arrays.asList(joinPoint.getArgs() + "}"));
    }



    @AfterReturning("pointCut() && @annotation(dingdingAnno)")
    public void finish(JoinPoint jointPoint,DingdingAnno dingdingAnno){
    logger.info(jointPoint.getSignature().getName() + "*********");
    Signature signature = jointPoint.getSignature();
    MethodSignature methodSignature = (MethodSignature) signature;
    Method method = methodSignature.getMethod();
    if (method != null){
    dingdingAnno = method.getAnnotation(DingdingAnno.class);
    if (dingdingAnno != null){
    System.out.println(jointPoint.getTarget().getClass().getName());
    System.out.println(jointPoint.getSignature().getName());
    System.out.println(jointPoint.getArgs().length);
    }
    }


    System.out.println(jointPoint.getSignature().getName());
    }
    }



    3.配置aop

    <context:component-scan base-package="com.zhuanche.**"/>
    <!--开启aop注解 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

    4.在类上面添加特定注解
    @ResponseBody
    @RequestMapping(value = "/driverTeamDetail")
    @DingdingAnno
    public AjaxResponse driverTeamDetail(DriverTeamRequest param){
    logger.info("查询车队详情入参:"+ JSON.toJSONString(param));
    CarDriverTeamDTO detail = carDriverTeamService.selectOneDriverTeam(param);
    return AjaxResponse.success(detail);
    }

    启动项目,遇到的几个问题:1.使用Jrebel 每次修改后,总是不成功,报各种异常。原因应该是 aop在spring启动时候就加载进去了,修改后需要重启;2.遇到的几个问题:1)启动报错

    [Xlint:invalidAbsoluteTypeName]error

     

      原因一般是point后面的地址错误,我的原因是后面多加了&& +自定义注解名称

    2)没进入后置通知: 第一次的时候,写的是  

     
    @AfterReturning("within(com.zhuanche.controller..*) && @annotation(sdol)")
    没有成功,具体原因还不太清楚。
     
  • 相关阅读:
    不测的秘密:精准测试之路----读书笔记(第二章)
    如何使用for循环连续的实例化多个对象!
    java如何在一个有序的数组类插入一个数!
    webstrom 常用快捷键
    如何使Label带有链接??此法感觉有点取巧!!!
    System.DateTime的一些格式
    如何解决”无法将类型为“System.DateTime”的对象强制转换为类型“System.String”。“
    如何解决“连接未关闭。 连接的当前状态为打开”问题
    c语言中 %p的含义
    什么情况下用递归?
  • 原文地址:https://www.cnblogs.com/thinkingandworkinghard/p/10453662.html
Copyright © 2020-2023  润新知