多个切点 boot spring_spring基于aspectJ的切点表示
在上一文中,我们初步了解并使用了aspectJ的切面定义方式,本文我们重点介绍下aspectJ的切点表示函数和相关的语法。
在spring中aspectJ支持9种切点表达函数,三种通配符,分别是*、..、+。其中*和..和正则表达式的类似。
*:代表匹配任意一个字符,但只能是上下文中的一个元素
..:代表匹配任意字符,可以匹配上下文多个元素,表示类时需要和*联合使用,表示入参时可以单独使用
+:代表按照类型匹配指定类型的所有类,必须跟在类名后面
分别有四种类型:
方法类:execution() 支持所有通配符,@annotation() 不支持通配符
目标类:within() 支持所有通配符,target() 只支持+,@within() 不支持,@target() 不支持
代理类:this() 只支持+
入参类:args() 只支持+,@args() 不支持
Spring还支持逻辑运算符来组成复合切点,分别是 &&(与)、||(或)、 !(非)。
下面我们就详细看下这些切点函数的作用:
@annotation :表示标注了某个注解的所有方法会得到增强。例如下面的定义会使得加了Test注解的方法获取注解并且使用方法得到增强。
1. import org.aspectj.lang.annotation.Aspect;
2. import org.aspectj.lang.annotation.Before;
3. @Aspect
4. public class BeforePrintAdvice {
5.
6. @Before("@annotation(test)")
7. public void before(Test test) {
8. System.out.println(String.format("before test is %s",test.isTest()));//获取注解的内容
9. }
10. }
execution():表示匹配某些特定的函数,也是最常用的切点函数。参数格式如下:execution(<权限修饰符>? <返回类型> <方法名> <参数名> <异常类型>? )
举几个例子如下:
execution(public * *(..))// 匹配所有目标类的public方法,第一个*代表返回值为任意类型,第二个*代表任意方法,..代表参数类型为任意,异常类型省略
execution(* *print(..))//匹配目标类所有以print为后缀的方法,第一个*代表返回值为任意类型,第二个*print代表以print为后缀的方法,..代表参数类型为任意,修饰符和异常是可以省略的
args():表示入参是某个类(包含子类)时,切点匹配。比如args(com.spring.learn.AopTarget)表示的是入参是该类的时候起作用。所以args(com.spring.learn.AopTarget)==execution(* *(com.spring.learn.AopTarget+)),因为com.spring.learn.AopTarget+代表匹配该类及其子类,所以args可以使用execution替换,当然了+也可以使用在args上,但是使用和不使用其实都一样。
@args():表示入参是某个注解类的时候,切点匹配。这个在类继承的关系图有如下表示:C2继承C1,C1继承C0,方法签名fun2在注解类C1之后,fun2切点失效,fun1方法签名在注解类C1之前,fun1的切点生效。
within():和execution一样,是针对目标类的,但是其最小范围是类级别,而execution就涵盖了包到入参一条路上所有的功能。所以execution()函数的功能包含了within()函数的功能。within()的语法:within(<类模式匹配>)。我们稍微举个例子,实际上常用execution替换。
within(com.spring.learn.*):匹配com.spring.learn包中的所有类,但不包括子孙包中的类。
within(com.spring.learn..*):匹配com.spring.learn包中的所有类,包括子孙包中的类。
@within():和其他@一样,只接受注解,@within(C)匹配所有标注了@C的类及其子类。具体如下图表示:
@target():和其他@一样,只接受注解,@within(C)匹配所有标注了@C的类,不涉及到子类。具体如上图表示。
target():判断目标类是否按照类型匹配指定类,比如target(C),则C中的所有方法都生效。
this():如果不是引介切面产生的话,和target()是一样的,如果是引介切面的话,this()会匹配代理类所有的方法,包括引介产生的新的方法,而target()的话,不匹配引介产生的代理对象。
以上是所有的切点函数的使用方法,下面我们开始使用这些切点函数命名切点,一般切点的定义有两种:匿名切点和声明切点。匿名切点一般是定义切面的时候在一个类中直接使用,比如下面的切点定义:
1. @After("execution(* com.springframework.learn.aspectJ.ForTest(..))")//匿名切点定义
2. public void after(){
3. //增强的实体方法
4. }
命名起点的定义:
1. @Pointcut("execution(* com.springframework.learn.aspectJ.ForTest(..))")
2. private void testPointCut(){}//切点的函数名
有了命名切点之后,就可以在定义切面的地方引用了:
1. @Pointcut("execution(* com.springframework.learn.aspectJ.ForTest(..))")
2. private void testPointCut(){}//切点的函数名,private:只能在本类中使用
3. @After("testPointCut()")//使用testPointCut切点
4. public void after0(){
5. //增强的实体方法
6. }
值得注意的是:如果一个连接点有配置多个切点,那么这些切点是怎么执行的顺序呢?我们要分几种情况讨论下:
1、在同一个切面内,按照定义的先后顺序执行
2、在不同切面内但是实现了Order接口,按照order顺序从小到大增强
3、在不同的切面且没有实现order接口,那顺序是不确定的。
Ok,到这里,我们介绍了切点的表示方法,在后续的文章中,我们会进一步介绍增强和切面的表示方法。
多个切点 boot spring_spring基于aspectJ的切点表示相关推荐
- 基于@AspectJ配置Spring AOP之一--转
原文地址:http://tech.it168.com/j/2007-08-30/200708302209432.shtml 概述 在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的接口,并 ...
- Spring-aop 基于Aspectj 表达式配置AOP
基于Aspectj 表达式配置AOP(推荐使用) 基于配置文件 1.添加切面对象(aspect对象) 2.把切面对象交给spring 3.配置文件 <?xml version="1.0 ...
- AOP的自动代理(基于AspectJ框架)
AOP的通知类型: aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持. AOP 联盟不是Spring的,先是AOP联盟定义了一个接口org.springframework.aop ...
- Spring Boot之基于Redis实现MyBatis查询缓存解决方案
转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...
- Spring Boot之基于Dubbo和Seata的分布式事务解决方案
转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 1. 分布式事务初探 一般来说,目前市面上的数据库都支持本地事务,也就是在你的应用程序中,在一个数据库连接下的操作,可以 ...
- Spring AOP技术(基于AspectJ)的Annotation开发
Spring AOP技术(基于AspectJ)的Annotation开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring ...
- Spring AOP技术(基于AspectJ)的XML开发
Spring AOP技术(基于AspectJ)的XML开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring AOP技术基 ...
- Spring Aop(四)——基于Aspectj注解的Advice介绍
4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.after return.after throwing.after(finally)和arou ...
- Spring基于AspectJ实现AOP操作
基于AspectJ实现AOP操作 准备工作 在项目工程里面引入 AOP 相关依赖. 如果是maven项目,使用pom.xml代替引入jar包的过程(注意) 学会使用切入点表达式 AOP 操作(Aspe ...
- AspectJ的切点表达式语言
AspectJ5.0的切点表达式由关键字和操作参数组成. 如 execution(* greetTo(..)), excution是关键字, "* greetTo(..)"为操作函 ...
最新文章
- 高效整洁CSS代码原则
- 【markdown】图片的处理
- 传华西村将斥资亿元涉足网游业
- 一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- 非常适合小白的 Asyncio 教程
- 雪儿--北京欢迎你!!!
- SAP Spartacus b2b表格的cell配置解析逻辑
- 让孩子见世面,到底有多重要
- html5液体效果,HTML5/CSS3/SVG实现的液体掉落(滑落)动画
- CodeForces - 948C(前缀和 + 二分)
- 数字图像处理与python实现 岳亚伟_数字图像处理与Python实现
- html动态绑定树形菜单,jQuery ztree实现动态树形多选菜单
- ​突破数据存储瓶颈,Aibee实现场景化AI的有效落地
- (附源码)ssm网上购物系统 毕业设计 123361
- 腾讯cdn设置 php,教你利用腾讯云 cdn 加速网站静态资源
- 双因素方差分析和单因素方差分析
- Java对接苹果账号授权登录
- 获取iOS设备唯一标识
- python备份文件代码_python实现文件的备份流程详解