SpringAOP切点函数实现原理详解

 更新时间:2020年05月11日 10:31:57   作者:曾经那个少年  
这篇文章主要介绍了SpringAOP切点函数实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一:在函数入参中使用通配符

@AspectJ支持3种通配符

* :匹配任意字符,但它只能匹配上下文中的一个元素.

.. :匹配任意字符,可以匹配上下文中多个元素,但在表示类时,必须和*联合使用,而在表示入参时则单独使用

+ :表示按类型匹配指定类的所有类,必须跟在类名后面,如com.smart.Car+ ;继承或扩展指定类的所有类,同时还包括指定类本身.

@AspectJ函数按其是否支持通配符及支持的程度,可以分为以下3类.

1):支持所有的通配符:execution(),within()

2):仅支持“+”通配符:args(),this(),target()

3):不支持通配符:@args(),within(),target();@annotation()

此外,args(),this(),target(),@args(),@within(),@target()和@annotation()这7个函数除了可以指定类名外,也可以指定变量名,并将目标对象中的变量绑定到增强的方法中.

二:切点函数详解

[1]:@annotation()

@annotation()表示标注了某个注解的所有方法.

eg:

package com.springboot.test;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TestAspect {
  @AfterReturning("@annotation(com.springboot.anno.NeedTest)")
  public void needTestFun() {
    System.out.println("needTestFun() executed!");
  }
}

[2]:execution()

execution()是最常用的切点函数,其语法如下:

execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>) <异常模式>?)

除了返回类型模式,方法名模式,参数模式外,其他项都是可选的.

  (1):通过方法签名定义切点

  execution(public * *(..)):匹配所有目标类的public方法,第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法.

  execution(* *To(..)):匹配所有以To为后缀的方法,第一个*代表返回类型,而*To代表任意以To为后缀的方法.

  (2):通过类定义切点

  execution(* com.springboot.Waiter.*(..)):匹配Waiter接口的所有方法,第一个*代表返回任意类型;com.springboot.Waiter.*(..)代表Waiter接口的所有方法,

  (3):通过类包定义切点

  在类名模式串中,“.*”表示包下所有的类,而“..*”表示包,子孙包下的所有类.

  execution(* com.smart.*(..)):匹配com.smart包下的所有类的所有方法.

  execution(* com.smart..*(..)):匹配com.smart包.子孙包下所有的类的所有方法.

  execution(* com..*.*Dao.find*(..)):匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀.如:com.smart.UserDao#findByUserId(),   com.smart.dao.ForumDao#findById()等.

  (4):通过方法入参定义切点:

  切点表达式中的方法入参部分比较复杂,可以使用“*”,“..”通配符.其中“*”表示任意类型的参数;而“..”表示任意类型的参数且参数个数不限.

  execution(* joke(String,int)):匹配joke(String str,int d)方法.

  execution(* joke(String,*):匹配目标类中的joke(),但该方法的第一个入参为String类型,第二个入参可以是任意类型.

  execution(* joke(String,..)):匹配目标类中的joke(),该方法的第一个入参为String类型,后面可以有任意个入参,且入参类型不受限制.

  execution(* joke(Object+)):匹配目标类中的joke(),方法拥有一个入参,且入参是Object类型或该类的子类.

[3]:args()和@args()

args():该函数接收一个类名,表示目标类方法入参对象是指定类(包含字类)时,切点匹配

  1):args(com.smart.Waiter)表示运行时入参是Waiter类型的方法, 其等价于execution(* *(com.smart.Waiter+))当然也等价于args(com.smart.Waiter+).

  2):@args() 太啰嗦,不打字了...

[4]:within()

通过类匹配模式串声明切点,within()函数定义的连接点是针对目标类而言的,而非针对运行期对象的类型而言,这一点和execution()是相同的.但和execution()函数不同的是,within()所指定的连接点的最小范围只能是类,二execution()所指定的连接点可以大到包,小到方法入参.所以从某种意义上说,execution()函数的功能涵盖了within()函数的功能.within()函数语法如下:

within(<类匹配模式>)

  •   within(com.smart.NativeWaiter): 匹配目标类NativeWaiter的所有方法.
  •   within(com.smart.*):  匹配com.smart包中的所有类,但不包括子孙包,所以com.smart.service包中类的方法不匹配这个切点
  •   within(co.smart..*):  匹配com.smart包及子孙包中的类,所以com.smart.service,com.smart.dao,com.smart.service.forum等包中的所有类都匹配这个切点.

[5]@within() ,@target()

[6]target(),this()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合Mybatis注解开发的实现代码

    SpringBoot整合Mybatis注解开发的实现代码

    这篇文章主要介绍了SpringBoot整合Mybatis注解开发的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringMVC结合天气api实现天气查询

    SpringMVC结合天气api实现天气查询

    这篇文章主要为大家详细介绍了SpringMVC结合天气api实现天气查询,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java如何获取属性的注释信息详解

    Java如何获取属性的注释信息详解

    Java注解是从Java5开始添加到Java的,这篇文章主要给大家介绍了关于Java如何获取属性的注释信息的相关资料,文中介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java中正则表达式的语法以及matches方法的使用方法

    Java中正则表达式的语法以及matches方法的使用方法

    正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,这篇文章主要给大家介绍了关于Java中正则表达式的语法以及matches方法的使用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • mybatis类型处理器JSR310标准详解

    mybatis类型处理器JSR310标准详解

    这篇文章主要介绍了mybatis类型处理器JSR310标准详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring Cloud Config 使用本地配置文件方式

    Spring Cloud Config 使用本地配置文件方式

    这篇文章主要介绍了Spring Cloud Config 使用本地配置文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据

    SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据

    我们经常会遇到需要传递对象的场景,有时候,我们需要将一个对象的数据传递给另一个对象进行处理,但是又不希望直接暴露对象的内部结构和实现细节,所以本文给大家介绍了SpringMVC结合模板模式实现MyBatisPlus传递嵌套JSON数据,需要的朋友可以参考下
    2024-03-03
  • Spring Boot腾讯云短信申请与使用示例

    Spring Boot腾讯云短信申请与使用示例

    这篇文章主要介绍了Spring Boot腾讯云短信申请与使用,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Java加密解密工具(适用于JavaSE/JavaEE/Android)

    Java加密解密工具(适用于JavaSE/JavaEE/Android)

    这篇文章主要介绍了Java加密解密工具,适用于JavaSE/JavaEE/Android,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 通过openOffice将office文件转成pdf

    通过openOffice将office文件转成pdf

    这篇文章主要介绍了通过openOffice将office文件转成pdf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论