PointCut语法介绍

转载 2011年01月11日 16:29:00

pointcut ,从字面的意思说的是切面的意思。也就是横切的时候,会有哪些执行点会被识别。只有先识别了,才能执行相应的Advice。
基本的定义如下:

public pointcut accountOperations:call(* Account.*(..))

1.通配符和pointcut 操作符

* 表示任何数量的字符,除了(.)
.. 表示任何数量的字符包括任何数量的(.)
+ 描述指定类型的任何子类或者子接口
同java一样,提供了一元和二元的条件表达操作符。
一元操作符:!
二元操作符:||和&&
优先权同java

2.签名语法

类型签名样式

主要的例子:
Account 类型Account
*Account 使用Account名称结束的类型,如SavingsAccount和CheckingAccount
java.*.Date 类型Date在任何直接的java子包中,如java.util.Date和java.sql.Date
java..* 任何在java包或者所有子包中的类型,如java.awt和java.util或者java.awt.event 和java.util.logging
javax..*Model+ 所有javax包或者子包中以Model结尾的类型和其所有子类,如TableModel,TreeModel。
!vector 所有除了Vector的类型
Vector|| Hashtable Vector或者Hashtable类型
java.util.RandomAccess+ 实现RandomAccess和List的所有子类
&& java.util.List+

方法和构造器签名模式

public void Collection.clear():
在Collection中同样签名的clear方法

public void Account.debit(float) throws InsufficientBalanceException:
Account中同样签名的debit方法

public void Account.set*(*)
Account中以set开头,并且只有一个参数类型的方法

public void Account.*()
Account中所有的没有参数的public void 方法

public * Account.*()
Account中所有没有参数的public 方法

public * Account.*(..)
Account中所有的public 方法

* Account.*(..)
Account中的所有方法,包括private方法

!public * Account.*(..)
所有的非public 方法

* Account+.*(..)
所有的方法,包括子类的方法

* java.io.Reader.read(..)
所有的read方法

* java.io.Reader.read(char[],..)
所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)

* javax..*.add*Listener(EventListener+)
命名以add开始,以Listener结尾的方法,参数中为EventListener或子类

* *.*(..) throws RemoteException
抛出RemoteException的所有方法

构造器,同上面
public Account.new()
没有参数的构造器方法

属性签名模式
同方法一样,属性也查不多
* Account.*
所有的Account属性

!public static * banking..*.*
所有的非public static 属性,在banking的包或者子包中

3.主要的pointcuts类型

分类pointcuts
遵循特定的语法用于捕获每一个种类的可使用连接点。
主要的种类:

方法执行:execution(MethodSignature)
方法调用:call(MethodSignature)
构造器执行:execution(ConstructorSignature)
构造器调用:call(ConstructorSignature)
类初始化:staticinitialization(TypeSignature)
属性读操作:get(FieldSignature)
属性写操作:set(FieldSignature)
例外处理执行:handler(TypeSignature)
对象初始化:initialization(ConstructorSignature)
对象预先初始化:preinitialization(ConstructorSignature)
Advice执行:adviceexecution()
基于控制流的pointcuts
主要包括两种类型的控制流:
cflow(Pointcut ),捕获所有的连接点在指定的方法执行中,包括执行方法本身。
cflowbelow(Pointcut ),捕获所有的连接点在指定的方法执行中,除了执行方法本身。

如以下的例子:
cflow(call(* Account.debit(..))
所有的debit方法中的连接点,包括debit方法本身
cflowbelow(call(* Account.debit(..))
所有debit方法中的连接点,除了debit方法本身
cflow(transactedOperations())
所有由transactedOperations捕获的连接点
cflowbelow(execution(Account.new(..))
所有在Account 构造器中执行的连接点

基于词汇结构的连接点
源代码片断。,如within()和withincode()
within :捕获在指定类或者方面中的程序体中的所有连接点,包括内部类。
Withincode:用于捕获在构造器或者方法中的所有连接点,包括在其中的本地类

执行对象连接点
匹配this,和target对象,作为方法被调用的对象。
this(Account),所有Account的实例的执行点,匹配所有的连接点,如方法调用,属性设置,当前的执行对象为Account,或者其子类。
target(Account):匹配所有的连接点,目标对象为Account或其子类。

必须执行相应的类型,不能使用*,或者..通配符。当前静态方法,不能被匹配。

在within()和this()中的区别:
一个是程序体,而另一个为对象执行。

参数pointcuts
用于捕获参数类型的连接点。
args(String,..,int)
args(RemoteException)

条件检测pointcuts
if(System.currentTimeMillis()>triggerTime)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/remote_roamer/archive/2009/12/15/5011390.aspx

相关文章推荐

Spring事务管理—aop:pointcut expression解析

先来看看这个spring的配置文件的配置:          class="org.springframework.orm.hibernate3.HibernateTransactionMan...

@Pointcut的用法

在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature)。让我们先看看execution表示式的格式: ...
  • Java18
  • Java18
  • 2012-05-03 01:11
  • 36283

Spring 运用 pointcut 和 advisor 对特定的方法进行切面编程

上一个例子演示了对特定的bean中的所有的方法进行面向切面编程,包括了 before , after , after throwing, around 几种形式: 如果想对一个bean中的特定方法进...
  • topwqp
  • topwqp
  • 2013-03-20 17:32
  • 9953

MyBatis之动态SQL语句

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysq...

Spring AOP中pointcut expression表达式解析

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. arg...

使用Aspect中的annotation标签的方法来截获所有的Exception,进行控制台打印

功能点的主要目的是:截获所有service层面的类中的Exception,然后在服务器控制台打印。这样就不用显式的在service类中去try exception,然后在打印。可以避免在前台Flex这...

程序员的八重境界

看到一篇有趣的文章The Eight Levels of Programmers。以前似乎看过不少这种程序员的多少个级别、境界,但这篇语言很风趣,而且分类比较细化,让人觉得挺合情合理、无法反驳的。绝大...
  • dc_726
  • dc_726
  • 2017-08-31 04:58
  • 25907

利用SpringMVC下载不同类型文件

网上有看到使用SpringMVC来下载图片,pdf等等,但是仅限于规定文件类型的下载,查找了一下文档,写一个统一下载各种类型文件的Controller。 文件存放路径: 下载请求uri:htt...

使用Spring AOP使用注解记录用户操作日志

1.自定义注解,记录操作日志 1.自定义注解 package com.jay.demo3.aop1.myannotation; import java.lang.annotation.Docum...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)