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

  为了能够灵活定义切入点位置,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))

  

  

时间: 2024-12-14 10:15:53

Spring 学习笔记(七)—— 切入点表达式的相关文章

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

Spring学习笔记(三)

Spring学习笔记(三) AOP 一.使用Annotation方式实现AOP.步骤: xml里加入配置:<aop:aspectj-autoproxy /> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org

Swift学习笔记七:闭包

闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. Swift 会为您管理在 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个可以捕获其上下文中变量或常量值的没有名字的闭包 一.闭包表达式 闭包函数类似于Objective-C中的block.下面我们用事实说话: let counts =

Spring学习笔记(一)

Spring学习笔记(一) Spring核心思想: IOC:  Inversion Of Control (控制反转) / DI: Dependency Injection (依赖注入) AOP: Aspect Oriented Programming (面向切面编程) IOC 1. 简单的应用 Model package com.wangj.spring.model; public class User { private String username; private String pas

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

马哥学习笔记七——LAMP编译安装之MYSQL

1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录. 2.新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3.安装并初始化my

Struts2学习笔记(OGNL表达式)

Struts2学习笔记(OGNL表达式) Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言: Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python.Ruby和Smarttalk等)的一些起特性: Velocity,严格来说不是表达式语言,它是一种基于Ja

swift学习笔记(七)自动引用计数

与Object-c一样,swift使用自动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例,因为struct和enumeration属于值类型,也就不牵涉引用,所以其存储和管理方式并不是引用计数. 当一个实例被初始化时,系统会自动分配一定的内存空间,用于管理属性和方法.当实例对象不再被使用时,其内存空间被收回. swift中的引用类型分为三种,即Strong强引用,weak弱引用和无主引用unw