专栏首页海加尔金鹰的专栏springboot之aop切面execution表达式,@args,@annotation

springboot之aop切面execution表达式,@args,@annotation

最近在使用springboot进行切面编程的时候,发现定义切面点有很多种方式,每种方式有每种方式的特点。特此记录

execution表达式

基本语法格式为:execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)除了返回类型模式,方法名模式和参数模式外,其它项都是可选的。 例如:

 	@Pointcut("execution(public * cn.hjljy.*.controller..*.*(..))")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("进入切面进行验证");
        Object obj = joinPoint.proceed();
        return obj;
    }

| 模式 | 描述 | | - | - | | public | public 表示public 级别方法。 可以不写,不写就是所有的方法(public,private,protected等级别的方法) | | 开头的 * | 表示方法返回值的类型 * 表示全部 | | cn.hjljy..controller | 表示具体的包名,中间使用做通配符 | | .. | 表示包以及包下面的子包 | | * | 表示全部 | | .*(..) | 表示全部方法 |

@args 表达式

args主要是用来限制方法的参数的,args有两种表现形式:@args 和args 使用@args需要通过注解,如果方法里面有参数持有这个注解,就可以。 例如:

 	@Pointcut("@args(cn.hjljy.mlog.common.annotation.MlogLog)")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("进入切面进行验证");
        Object obj = joinPoint.proceed();
        return obj;
    }

如果某个方法例如:

  public void test(MlogCommentEntity entity) {
      //如果entity这个实体类上面有MlogLog这个注解,就会被切面切到。
   }

如果是args需要书写方法参数类型并且是配合execution表达式进行的处理例如:

//第一种写法
   @Around("execution( * cn..*.controller..*.*(..))&&args(..,org.springframework.validation.BindingResult)\"")
   public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
       System.out.println("进入切面进行验证");
       Object obj = joinPoint.proceed();
       return obj;
   }
//第二种写法
   @Around("execution( * cn..*.controller..*.*(..))&& args(..,bindingResult)")
   public Object validateParam(ProceedingJoinPoint joinPoint, BindingResult bindingResult) throws Throwable {
       System.out.println("进入切面进行验证");
       Object obj = joinPoint.proceed();
       return obj;
   }

| 模式 | 描述 | | - | - | | 两种写法 | 表示任意参数开头,方法最后一个入参是BindingResult 类型 |

@annotation 表达式

这个非常的常见,直接通过注解进行的切面。只需要在需要切面的方法上加上对应的注解就可以了。 例如:

	@Pointcut("@annotation(cn.hjljy.mlog.common.annotation.MlogLog)")
    public void logCut(){}
    @Around("logCut()")
    public Object validateParam(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("进入切面进行验证");
        Object obj = joinPoint.proceed();
        return obj;
    }

然后在需要进行切面的方法上加上对应的注解就可以了。


标题:springboot之aop切面execution表达式,@args,@annotation 作者:海加尔金鹰 地址:https://www.hjljy.cn/articles/2020/06/07/1591530138070.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式学习笔记之外观模式

    子系统类(Subsystem Classes):具体的子系统,实现由外观模式Facade对象来调用的具体任务

    海加尔金鹰
  • springboot整合websocket技术

    简单来说就是一个基于TCP的持久化的网络通信协议。主要作用就是:服务端可以主动推送信息给客户端,不需要客户端重复的向服务端发请求查询。

    海加尔金鹰
  • 设计模式学习笔记之单例模式

    这是一篇学习笔记,内容很多是来源于网上的资料,按照自己学习进行的总结。 我的个人博客:海加尔金鹰

    海加尔金鹰
  • yaffs_attribs.c

    1.void yaffs_load_attribs(struct yaffs_obj *obj, struct yaffs_obj_hdr *oh)//stru...

    瓜大三哥
  • PyQt5 技巧篇-按钮隐藏并保留位置,设置按钮的可见度,设置按钮透明度

    如果是绝对布局的话,隐藏当然不会影响位置的变化,但大家都知道绝对布局有很多缺点,比如改动的成本大,灵活性不高,适应能力很差等等。 我们习惯嵌套在一些横向和纵向...

    小蓝枣
  • 构建一个完整的中文智能问答系统

    机器学习AI算法工程
  • Eventbus3代码分析(五):getDefault(),register和EventBusBuilder等

    除了注解,其他都和EventBus这个类有关系了 我们先从getDefault()方法开始分析

    dodo_lihao
  • Java技巧收录一 那些你相见恨晚的快捷键和代码注释模板

    设置注释模板的入口:Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所...

    glm233
  • apply/call/bind 自我实现

    面试题:“call/apply/bind源码实现”,事实上是对 JavaScript 基础知识的一个综合考核。

    前端迷
  • 平台币申购量突破一个亿,58COIN或成今年最大黑马!!!

    就在昨天,58COIN又传来消息——58COIN平台币上线5日,累计申购量已破1亿,惊喜数据还在持续刷爆中……

    区块链领域

扫码关注云+社区

领取腾讯云代金券