iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring基于常用AspectJ切点表达式使用介绍
  • 418
分享到

Spring基于常用AspectJ切点表达式使用介绍

Spring AspectJAspectJ切点表达式 2022-12-20 12:12:52 418人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

execution (常用,方法级别的匹配) 语法: execution(modifiers-pattern? ret-type-pattern declaring-type-pat

execution (常用,方法级别的匹配)

语法:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

  • modifiers-pattern:方法的访问符,如public、protected、default,不能匹配private方法
  • ret-type-pattern:方法的返回值类型,例:java.util.List、java.lang.String(类的全限定名,或者支持的简写如String、Integer)
  • declaring-type-pattern:方法所在类的全路径名,例:life.cqq.controller.UserController
  • name-pattern:方法名
  • param-pattern:方法的参数类型,例:java.util.List、java.lang.String
  • throws-pattern:方法抛出的异常类型,例:java.lang.RuntimeException、java.lang.Exception

(注:返回值类型 & 参数类型支持泛型判断)

带有?的位,非必写,即可省略。所以,一个表达式至少由3部分组成。例:

// 匹配所有方法
execution(* *(..))

若该位省略,例modifiers-pattern,意味着匹配该位能匹配的全部方法:public、protected、default修饰的方法

上例子:

@Pointcut("execution(public java.util.List<java.lang.Integer> *.test(java.util.List<java.lang.String>) throws java.lang.RuntimeException)")

匹配所有的方法名为test,方法格式为下方格式的方法。

public List<Iteger> test(List<String> list) throws RuntimeException

通配符

  • “..” : 应用在declaring-type-pattern上时,意味着扫描子孙包。应用在param-pattern时意味着任意类型
  • “*” :任意匹配符
  • “+” :表示按照类型匹配,必须追加在declaring-type-pattern中的类名后,表示所有的该类型的类、继承和扩展该类型的类

上例子:

// 1. 关于 .. 通配符
// 匹配子孙包下的所有类的所有方法
execution(* life.cqq..*.*(..))

// 2. 关于 * 通配符
// 匹配所有类的所有方法
execution(* *(..))

// 匹配子孙包下带有指定前缀的包下的所有类的所有方法
execution(* life.cqq..prefix*.*.*(..))

// 3. 关于 + 通配符
// 匹配子孙包下继承或实现了指定类型的类 以及 该类型的本类(若该类型不为接口) 下的所有方法
execution(* life.cqq..type+.*(..))

within (常用,类级别的匹配) 语法:

within(declaring-type-pattern)

execution语法中的declaring-type-pattern部分,从通配符的例子中提取出可应用于within的内容:

// 1. 关于 .. 通配符
// 匹配子孙包下的所有类的所有方法
within(life.cqq..*)

// 2. 关于 * 通配符
// 匹配所有类的所有方法
within(*)

// 匹配子孙包下带有指定前缀的包下的所有类的所有方法
within(life.cqq..prefix*.*)

// 3. 关于 + 通配符
// 匹配子孙包下继承或实现了指定类型的类 以及 该类型的本类(若该类型不为接口) 下的所有方法
within(life.cqq..type+)

@annotation (常用,方法级别的匹配)

语法:

@annotation(annotation-type-pattern)

与execution一样针对于方法,匹配添加了指定注解的方法。

@within (常用,类级别的匹配)

语法:

@within(annotation-type-pattern)

与within一样针对于类,匹配添加了指定注解的类。

逻辑运算符

  • &&
  • ||
  • !

应用在多个Point上组成稍微复杂的匹配表达式

上例子:

@Component
class aopBean {
    public void test(String str) {
        System.out.println("String");
    }
    public void test(Integer integer) {
        System.out.println("Integer");
    }
}
@Pointcut("within(life.cqq.aop.logicsymbol.AopBean)")
public void point1() {}
@Pointcut("execution(public void test(java.lang.String))")
public void point2() {}
@Pointcut("execution(public void test(java.lang.Integer))")
public void point3() {}
// @Around("point1() && point2()")               : 匹配参数为String类型的方法
// @Around("point1() && (point2() || point3())") : 匹配参数为Integer、String类型的方法
// @Around("point1() && !point2())")             : 匹配参数为Integer类型的方法

以上仅为平时常用的内容,还有其他许多写法,如:args、@args、target、@target等

一次实际应用

需求:

  • 基于AOP + 自定义注解的方式实现三个系统的接口请求参数的记录。
  • 需实现就近原则:优先判断方法上日志注解,若无在判断方法上的注解。类上添加日志注解时,意味着类的全部方法都需要打印请求参数。
@Pointcut("execution(* life.cqq..controller.*.*(..))")
private void log() {}
@Pointcut("@within(life.cqq.common.newlog.annotation.AppOpnLog) || @annotation(life.cqq.common.newlog.annotation.AppOpnLog)")
public void appOpnLog() {
}
@Pointcut("@within(life.cqq.common.newlog.annotation.EsOpnLog) || @annotation(life.cqq.common.newlog.annotation.EsOpnLog)")
public void esOpnLog() {
}
@Pointcut("@within(life.cqq.common.newlog.annotation.WEBOpnLog) || @annotation(life.cqq.common.newlog.annotation.WebOpnLog)")
public void webOpnLog() {
}
@Around("appOpnLog() || esOpnLog() || webOpnLog()")
public Object opnLogAround(ProceedingJoinPoint point) throws Throwable {
    // ......
    return point.proceed();
}
  • 因为是三个系统,log切点表达式中的controller前需要使用通配符"…"。因为每个系统的controller包名都是不一致的,但可以确定都符合格式: life.cqq.xxx.controller。
  • 基于注解的形式,且实现就近原则,那么既要匹配类上的日志注解也要匹配方法上的日志注解,故使用@within 与 @annotation 并用逻辑或连接。具体是在方法还是在类上添加的注解,在Around方法中解析处理。

到此这篇关于spring基于常用AspectJ切点表达式使用介绍的文章就介绍到这了,更多相关Spring AspectJ内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring基于常用AspectJ切点表达式使用介绍

本文链接: https://www.lsjlt.com/news/175309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring基于常用AspectJ切点表达式使用介绍
    execution (常用,方法级别的匹配) 语法: execution(modifiers-pattern ret-type-pattern declaring-type-patt...
    99+
    2022-12-20
    Spring AspectJ AspectJ切点表达式
  • C++lambda表达式使用介绍
    目录前言lambda表达式格式一些语法走进底层前言 C++98中的一个例子。 #include <iostream> #include <vector> #i...
    99+
    2024-04-02
  • 详解Spring 框架中切入点 pointcut 表达式的常用写法
    自从使用 AspectJ 风格切面配置,使得 spring 的切面配置大大简化,但是 AspectJ 是另外一个开源项目,其规则表达式的语法也稍稍有些怪异。下面给出一些常见示例的写法,例如,下面是一个对 Service 包上所有方法的切面配...
    99+
    2023-05-31
    spring tc
  • CSS表达式attr()的用法介绍
    本篇内容主要讲解“CSS表达式attr()的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS表达式attr()的用法介绍”吧!CSS表达式 attr...
    99+
    2024-04-02
  • Java中Lambda表达式用法介绍
    Lambda lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码。 lambda简明的地将代码或方法作为参数传递进去执行。 “函数式...
    99+
    2024-04-02
  • Kotlin方法与Lambda表达式实践使用介绍
    目录前言一、Kotlin的方法1、方法声明2、方法参数3、方法作用域二、Lambda表达式1、Lambda表达式的特点2、Lambda实践总结前言 经过前面对 Kotlin 的介绍,...
    99+
    2024-04-02
  • 正则表达式基础与常用验证表达式
    目录一、正则元字符1、 字符元字符2、重复元字符(量词)3、定位元字符4、分组和替换字符5、特殊字符6、需要转义的字符7、贪婪与非贪婪匹配8、常见正则表达式二、正则表达式应用举例1、...
    99+
    2024-04-02
  • Spring使用AspectJ的注解式实现AOP面向切面编程
    目录1、认识Spring AOP1.1 AOP的简介1.2 AOP中的概念 切入点(pointcut):2、认识AspectJ 2.1 AspectJ的简介2.2 Spring AO...
    99+
    2024-04-02
  • 基于springEL表达式详解及应用
    目录基于springEL表达式详解及应用什么是SpringEL?为什么要使用SpringEL?如何使用SpringEL?使用SpringEL注入简单值使用SpringEL调用方法Sp...
    99+
    2024-04-02
  • Spring中常用的9种设计模式介绍
    这篇文章主要介绍“Spring中常用的9种设计模式介绍”,在日常操作中,相信很多人在Spring中常用的9种设计模式介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中常用的9种设计模式介绍”的疑...
    99+
    2023-06-02
  • web正则表达式基础与常用验证表达式是什么
    这篇文章主要介绍了web正则表达式基础与常用验证表达式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web正则表达式基础与常用验证表达式是什么文章都会有所收获,下面我们一起来看看吧。一、正则元字符是一些在...
    99+
    2023-07-02
  • Verilog语言表达式基本使用
    目录表达式操作数操作符算术操作符关系操作符等价操作符逻辑操作符按位操作符归约操作符移位操作符拼接操作符条件操作符表达式 表达式由操作符和操作数构成,其目的是根据操作符的意义得到一个...
    99+
    2023-05-15
    Verilog语言表达式 Verilog 表达式
  • VBS正则表达式后向引用的详细介绍
    本篇内容介绍了“VBS正则表达式后向引用的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!后向引用正则表达式一个最重要的特性就是将匹配...
    99+
    2023-06-09
  • Spring spel表达式使用方法示例
    spring in action第三版读书笔记spring3.0引入了spring expression language(spel)语言,通过spel我们可以实现通过bean的id对bean进行引用调用方法以及引用对象中的属性计算表达式的...
    99+
    2023-05-31
    spring spel表达式
  • Python中lambda表达式的简要介绍和详细使用方法
    Python中lambda函数的简介与用法详解 在Python中,lambda函数是一种特殊的匿名函数,它可以在需要函数对象的任何地方使用。lambda函数通常用来定义一些简单的函数,它们可以只有一个表达式,并且返回结果。本文将...
    99+
    2024-02-02
    简介 用法详解
  • 基于常用json框架介绍和Jackson返回结果处理方式
    目录json框架介绍,Jackson返回结果处理1、常用框架 阿里 fastjson,谷歌gson等2、jackson处理相关自动使用jackson返回json数据1、SpringM...
    99+
    2024-04-02
  • Spring Cache抽象-使用SpEL表达式解析
    目录Spring Cache抽象-使用SpEL表达式概述SpEl表达式如何让自定义注解支持SpEL表达式使用方法使用案例1.准备2.自定义注解3.定义AOP拦截注解对方法增强进行读写...
    99+
    2024-04-02
  • C++11-20 常量表达式的使用
    目录C++98时代C++11时代C++14时代C++17时代C++20时代参考资料C++98时代 C++98编译器对int常量情有独钟,因为这是少数它能直接识别的东西。因为这个有限...
    99+
    2024-04-02
  • 【Java基础】Java正则表达式的使用
    文章目录 一、正则表达式规则1.字符类(只匹配一个字符)2.预定义字符(只匹配一个字符)3.数量词 二、使用方法三、例题演示 一、正则表达式规则 1.字符类(只匹配一个字符) [a...
    99+
    2023-09-29
    正则表达式 java jvm
  • C++中的常量表达式怎么使用
    常量表达式是指在编译时就可以确定值的表达式,使用常量表达式可以在编译时进行优化,提高程序的性能。在C++中,常量表达式可以通过关键字...
    99+
    2024-03-11
    C++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作