在上一文中,我们初步了解并使用了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的切点表示相关推荐

  1. 基于@AspectJ配置Spring AOP之一--转

    原文地址:http://tech.it168.com/j/2007-08-30/200708302209432.shtml 概述 在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的接口,并 ...

  2. Spring-aop 基于Aspectj 表达式配置AOP

    基于Aspectj 表达式配置AOP(推荐使用) 基于配置文件 1.添加切面对象(aspect对象) 2.把切面对象交给spring 3.配置文件 <?xml version="1.0 ...

  3. AOP的自动代理(基于AspectJ框架)

    AOP的通知类型: aop联盟 定义 aop通知类型,spring 对 aop联盟规范支持. AOP 联盟不是Spring的,先是AOP联盟定义了一个接口org.springframework.aop ...

  4. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  5. Spring Boot之基于Dubbo和Seata的分布式事务解决方案

    转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案 1. 分布式事务初探 一般来说,目前市面上的数据库都支持本地事务,也就是在你的应用程序中,在一个数据库连接下的操作,可以 ...

  6. Spring AOP技术(基于AspectJ)的Annotation开发

    Spring AOP技术(基于AspectJ)的Annotation开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring ...

  7. Spring AOP技术(基于AspectJ)的XML开发

    Spring AOP技术(基于AspectJ)的XML开发 @(Spring)[aop, spring, xml, Spring, annotation, aspectJ] Spring AOP技术基 ...

  8. Spring Aop(四)——基于Aspectj注解的Advice介绍

    4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.after return.after throwing.after(finally)和arou ...

  9. Spring基于AspectJ实现AOP操作

    基于AspectJ实现AOP操作 准备工作 在项目工程里面引入 AOP 相关依赖. 如果是maven项目,使用pom.xml代替引入jar包的过程(注意) 学会使用切入点表达式 AOP 操作(Aspe ...

  10. AspectJ的切点表达式语言

    AspectJ5.0的切点表达式由关键字和操作参数组成. 如 execution(* greetTo(..)), excution是关键字, "* greetTo(..)"为操作函 ...

最新文章

  1. 高效整洁CSS代码原则
  2. 【markdown】图片的处理
  3. 传华西村将斥资亿元涉足网游业
  4. 一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事
  5. VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
  6. 非常适合小白的 Asyncio 教程
  7. 雪儿--北京欢迎你!!!
  8. SAP Spartacus b2b表格的cell配置解析逻辑
  9. 让孩子见世面,到底有多重要
  10. html5液体效果,HTML5/CSS3/SVG实现的液体掉落(滑落)动画
  11. CodeForces - 948C(前缀和 + 二分)
  12. 数字图像处理与python实现 岳亚伟_数字图像处理与Python实现
  13. html动态绑定树形菜单,jQuery ztree实现动态树形多选菜单
  14. ​突破数据存储瓶颈,Aibee实现场景化AI的有效落地
  15. (附源码)ssm网上购物系统 毕业设计 123361
  16. 腾讯cdn设置 php,教你利用腾讯云 cdn 加速网站静态资源
  17. 双因素方差分析和单因素方差分析
  18. Java对接苹果账号授权登录
  19. 获取iOS设备唯一标识
  20. python备份文件代码_python实现文件的备份流程详解

热门文章

  1. codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)
  2. nginx开启密码认证
  3. 关于URL编码/javascript/js url 编码
  4. 11月国内网站流量统计:百度夺冠 360安全中心居亚
  5. WEB网页专业词汇 汇总
  6. 压力测试中需要掌握的几个基本概念
  7. 基于队列的锁:mcs lock简介
  8. SpringMVC入门实例及详细讲解
  9. Reset Image Size 2
  10. 非要自己开发一个测试工具不可