前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 学习笔记(七)—— 切入点表达式

Spring 学习笔记(七)—— 切入点表达式

作者头像
Rekent
发布2018-09-04 15:23:35
1680
发布2018-09-04 15:23:35
举报
文章被收录于专栏:日常分享日常分享

  为了能够灵活定义切入点位置,Spring AOP提供了多种切入点指示符。


execution———用来匹配执行方法的连接点

  语法结构:   execution(   方法修饰符  方法返回值  方法所属类 匹配方法名 (  方法中的形参表 )  方法申明抛出的异常  )

其中红色字体的部分时不能省略的,各部分都支持通配符 “*” 来匹配全部。

  比较特殊的为形参表部分,其支持两种通配符

  •   "*":代表一个任意类型的参数;
  •   “..”:代表零个或多个任意类型的参数。

  例如:

    ()匹配一个无参方法

    (..)匹配一个可接受任意数量参数和类型的方法

    (*)匹配一个接受一个任意类型参数的方法

    (*,Integer)匹配一个接受两个参数的方法,第一个可以为任意类型,第二个必须为Integer。

  下面举一些execution的使用实例:

分类

示例

描述

通过方法签名定义切入点

execution(public * * (..))

匹配所有目标类的public方法,第一个*为返回类型,第二个*为方法名

execution(* save* (..))

匹配所有目标类以save开头的方法,第一个*代表返回类型

execution(**product(*,String))

匹配目标类所有以product结尾的方法,并且其方法的参数表第一个参数可为任意类型,第二个参数必须为String

通过类定义切入点

execution(* aop_part.Demo1.service.*(..))

匹配service接口及其实现子类中的所有方法

通过包定义切入点

execution(* aop_part.*(..))

匹配aop_part包下的所有类的所有方法,但不包括子包

execution(* aop_part..*(..))

匹配aop_part包下的所有类的所有方法,包括子包。(当".."出现再类名中时,后面必须跟“*”,表示包、子孙包下的所有类)

execution(* aop_part..*.*service.find*(..))

匹配aop_part包及其子包下的所有后缀名为service的类中,所有方法名必须以find为前缀的方法

通过方法形参定义切入点

execution(*foo(String,int))

匹配所有方法名为foo,且有两个参数,其中,第一个的类型为String,第二个的类型为int

execution(* foo(String,..))

匹配所有方法名为foo,且至少含有一个参数,并且第一个参数为String的方法(后面可以有任意个类型不限的形参)


within————通过类匹配模式申明切入点(只能通过类型匹配连接点)

    例如:within(aop_part..*)             表示匹配包aop_part以及子包的所有方法

由于execution可以匹配包、类、方法,而within只能匹配包、类,因此execution完全可以代替within的功能。


this————限定AOP代理必须时指定类型的实例,用于匹配该对象的所有连接点

    例如:this(aop_part.service.GodService)        表示匹配了GodService接口的代理对象的所有连接点


target————通过判断目标类的类型确定判断的是否匹配

    this通过判断代理类的类型来决定是否和切入点匹配,两者限定的对象都是指定类型的实例

    例如: target(aop_part.service.GodService)      表示匹配实现了GodService接口的目标对象的所有连接点


args————用于对连接点的参数类型进行限制,要求参数类型时指定类型的实例

    例如:args(aop_part.service)                     表示匹配时,出入的参数类型时service的方法

    其与execution(**(aop_part.service))的区别为,execution针对的时方法签名,而args针对的是运行时的实际参数类型。

    例:

    args既匹配buyGoods(service newService),也匹配buyGoods(Buyservice newService)   <Buyservice为service的子类>

    execution只匹配buyGoods(service newService)


组合切入点

    支持 &&、 || 、!

    与其他语言所代表的意思相同

    例:args(aop_part.service)  &&execution(**(aop_part.service))

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • execution———用来匹配执行方法的连接点
  • within————通过类匹配模式申明切入点(只能通过类型匹配连接点)
  • this————限定AOP代理必须时指定类型的实例,用于匹配该对象的所有连接点
  • target————通过判断目标类的类型确定判断的是否匹配
  • args————用于对连接点的参数类型进行限制,要求参数类型时指定类型的实例
  • 组合切入点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档