AspectJ语法

  看了很多AOP的文章了,AOP这两年发展的很慢,没有什么新意,现在到处都是SOA,SCA了,不过研究了一下,觉得还是很有帮助的。尤其是增加系统的契约性和模块的独立性来说,很有帮助。
  当然,学东西,基础很重要,下面就说说AspectJ中的基本语法。
  先来说说pointcut,从字面的意思说的是切点的意思。也就是横切的时候,会有哪些执行点会被识别。只有先识别了,才能执行相应的Advice。
  基本的定义如下:
  

  1. 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+ && java.util.List+   实现RandomAccess和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)

基本的语法就这些,不过AspectJ5 已经增加了不少语法,主要关于Annotation 的,不过这部分还没有仔细研究,以后再讲解吧。希望能有所帮助

AspectJ语法的更多相关文章

  1. (转)实例简述Spring AOP之间对AspectJ语法的支持(转)

    Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...

  2. Spring的AOP AspectJ切入点语法详解(转)

    一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示 ...

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

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

  4. AspectJ本质剖析

    AOP一共有两种方式,spring默认使用的是动态代理(JDK自带的动态代理或者使用cglib的动态代理)和静态代理(ASPECTJ) http://blog.csdn.net/zhao9tian/a ...

  5. Aspectj是什么

    转载自:http://www.cnblogs.com/sunwke/articles/2568875.html 网上出现了很多讲解 AspectJ 的资料,但大多是从讲解 AspectJ 语法开始,然 ...

  6. Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面

    1.@AspectJ的JDK必须是JDK 5.0+ 基于@AspectJ配置切面 @AspectJ采用注解描述切点.增强,两者只是表达式方式不同,效果相同. @AspectJ语法基础-----切点表达 ...

  7. 第三章 AOP 基于@AspectJ的AOP

    在前面,我们分别使用Pointcut.Advice.Advisor接口来描述切点.增强.切面.而现在我们使用@AdpectJ注解来描述. 在下面的例子中,我们是使用Spring自动扫描和管理Bean. ...

  8. Java AOP - Aspectj

    1. 序 Aspect Oriented Programming (AOP)是近来一个比较热门的话题. AspectJ是AOP的Java语言的实现,获得了Java程序员的广泛关注. 关于AspectJ ...

  9. AspectJ在Spring中的使用

    在上一篇AspectJ的入门中,简单的介绍了下AspectJ的使用,主要是以AspectJ的example作为例子.介绍完后也留下了几个问题:1)我们在spring中并没有看到需要aspectj之类的 ...

随机推荐

  1. 爬虫之xpath

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  2. sa learning

    后缀数组之前一直在给队友搞,但是这个类太大了,预感到青岛八成会有,于是自己也学习一下,记录一下做题的历程 所用的模板暂时来自于队友的倍增nlogn da算法 int t1[maxn] , t2[max ...

  3. u-boot-2015.07 make xxx_config 分析

    1.u-boot编译脚本:mk.sh #! /bin/sh export PATH=$PATH:/opt/ti-sdk-am335x-evm-08.00.00.00/linux-devkit/sysr ...

  4. 常见HTTP状态(304,)

    一.1XX(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示:已经收到请求的第一部分,正在等待其余部分. 101(切换协议) 请 ...

  5. 轻量级 HTTP(s) 代理 TinyProxy

      J CentOS 下安装 TinyProxy yum install -y tinyproxy 启动.停止.重启 # 启动service tinyproxy start# 停止service ti ...

  6. spring security3.1配置比较纠结的2个问题

    转自:http://www.iteye.com/topic/1122629 总论无疑问的,spring security在怎么保护网页应用安全上做得很强很周全,但有些地方还是很差强人意,比如对< ...

  7. javascript的几种使用多行字符串的方式

    JS里并没有标准的多行字符串的表示方法,但是在用模板的时候,为了保证模板的可阅读性,我们又不可避免的使用多行字符串,所以出现了各种搞法,这里以一段jade的模板作为示例,简单总结和对比一下. 字符串相 ...

  8. 5G信令(就是用户身份信息)——手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络。

    5G时代,跟IMSI-CATCHER SAY GOODBYE from:https://unicorn.360.com/blog/2018/04/18/GoodBye_5G_IMSI-Catcher/ ...

  9. python:小乌龟turtle

    turtle的意思是乌龟,也是python中自带的图形函数,使用turtle的方法也很形象,就好像在画布上有一个小乌龟(在画布上是一个箭头),然后你可以让它动来动去,它经过的地方就被留下了记号. 例如 ...

  10. 007PHP基础知识——类型转换 外部变量

    <?php /**类型转换 */ /*1.自由转换*/ /*2.强制转换:不改变原变量,生成新的变量*/ //转换为字符串: /*$a=100; $b=(string)$a; var_dump( ...