AspectJ语法
AspectJ语法
看了很多AOP的文章了,AOP这两年发展的很慢,没有什么新意,现在到处都是SOA,SCA了,不过研究了一下,觉得还是很有帮助的。尤其是增加系统的契约性和模块的独立性来说,很有帮助。
当然,学东西,基础很重要,下面就说说AspectJ中的基本语法。
先来说说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+ && 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语法的更多相关文章
- (转)实例简述Spring AOP之间对AspectJ语法的支持(转)
Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...
- Spring的AOP AspectJ切入点语法详解(转)
一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示 ...
- 基于@AspectJ配置Spring AOP之一--转
原文地址:http://tech.it168.com/j/2007-08-30/200708302209432.shtml 概述 在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的接口,并 ...
- AspectJ本质剖析
AOP一共有两种方式,spring默认使用的是动态代理(JDK自带的动态代理或者使用cglib的动态代理)和静态代理(ASPECTJ) http://blog.csdn.net/zhao9tian/a ...
- Aspectj是什么
转载自:http://www.cnblogs.com/sunwke/articles/2568875.html 网上出现了很多讲解 AspectJ 的资料,但大多是从讲解 AspectJ 语法开始,然 ...
- Spring 3.x企业应用开发实战(11)----基于@AspectJ配置切面
1.@AspectJ的JDK必须是JDK 5.0+ 基于@AspectJ配置切面 @AspectJ采用注解描述切点.增强,两者只是表达式方式不同,效果相同. @AspectJ语法基础-----切点表达 ...
- 第三章 AOP 基于@AspectJ的AOP
在前面,我们分别使用Pointcut.Advice.Advisor接口来描述切点.增强.切面.而现在我们使用@AdpectJ注解来描述. 在下面的例子中,我们是使用Spring自动扫描和管理Bean. ...
- Java AOP - Aspectj
1. 序 Aspect Oriented Programming (AOP)是近来一个比较热门的话题. AspectJ是AOP的Java语言的实现,获得了Java程序员的广泛关注. 关于AspectJ ...
- AspectJ在Spring中的使用
在上一篇AspectJ的入门中,简单的介绍了下AspectJ的使用,主要是以AspectJ的example作为例子.介绍完后也留下了几个问题:1)我们在spring中并没有看到需要aspectj之类的 ...
随机推荐
- 爬虫之JSON案例
糗事百科实例: 爬取糗事百科段子,假设页面的URL是 http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath / re 做数 ...
- sql server 跨数据库调用存储过程
A库存储过程: create PROCEDURE [dbo].[spAAAForTest] ( ) =null , ) =null ) AS BEGIN select N'A' AS a , N'B' ...
- response.getWriter().write("中文");乱码问题
起初遇到这个问题,网上几乎所有的建议都是: response.setHeader("Content-type", "text/html;charset=UTF-8&quo ...
- SVN 与Eclipse 关联 || 安装beyond 插件
1.让本地svn代码与库建立联系 右击项目名称,Team - share project 2.本地svn版本一般与Eaclipse svn插件 版本一致!http://subclipse.tig ...
- 简单搭建FastDFS分布式文件系统(简单易懂)
一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...
- Spring Boot技术栈博客笔记(1)
要实现的核心功能 用户管理 安全设置 博客管理 评论管理 点赞管理 分类管理 标签管理 首页搜索 核心技术 数据存储 随着spring3发布以来,spring团队减少使用xml配置的使用,采用大量约定 ...
- Dev-C++添加代码格式化(format source code)工具Artistic Style
Dev-C++是一个轻便的C++ IDE开发环境,比起VS2010来轻巧得多.最新的版本是5.4.0是2013年2月14日发布的,下载地址如下: Dev-C++5.4.0 download 它是开源项 ...
- 搞懂分布式技术12:分布式ID生成方案
搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-i ...
- Docker总结
Docker总结 一.Docker简介 1.问题:为什么会有docker出现 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网 ...
- python报错:TypeError: 'int' object is not subscriptable
检查一遍报错的所在行,此报错一般是在整数上加了下标: 比如: a = 4 c=a[2] 报错:line 2, in <module> c=a[2] TypeError: 'i ...