Aspectj的一些知识

1、起源

    AspectJ项目起源于帕洛阿尔托(Palo Alto)研究中心(缩写为PARC)。该中心由Xerox集团资助,Gregor Kiczales领导,从1997年开始致力于AspectJ的开发,1998年第一次发布给外部用户,2001年发布1.0 release。为了推动AspectJ技术和社团的发展,PARC在2003年3月正式将AspectJ项目移交给了Eclipse组织。

2、AspectJ是个啥

    AspectJ 是一个基于 Java 语言的 AOP 框架,提供了强大的 AOP 功能,其他很多 AOP 框架都借鉴或采纳其中的一些思想。AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分:第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地用 AOP 来解决 Java 语言中存在的交叉关注点问题;另一个部分是工具部分,包括编译器、调试工具等。AspectJ 是最早、功能比较强大的 AOP 实现之一,对整套 AOP 机制都有较好的实现,很多其他语言的 AOP 实现,也借鉴或采纳了 AspectJ 中很多设计。在 Java 领域,AspectJ 中的很多语法结构基本上已成为 AOP 领域的标准。AspectJ会扫描源代码文件,找到符合aspectj自身语法的文件(对什么时候,在什么地方,做什么工作操作的定义文件,也就是对aspect的定义),对文件进行解析,然后修改目标类的代码,最终形成修改后的目标类的.class文件。因此,可以认为,aspectj是一种静态的AOP实现方式(因为编译器已经经aspect写入到目标类的class文件中)。

3、简单用法示例
1)业务类:Bank.java
class Bank
{
public float deposit(AccountInfo account, float money)
{
  
// 验证account是否为合法用户
  
// Begin Transaction
  
// 增加account账户的钱数,返回账户里当前的钱数
  
// End Transaction
}

public float withdraw(AccountInfo account, float money)
{
  
// 验证account是否为合法用户
  
// Begin Transaction
  
// 减少account账户的钱数,返回取出的钱数
  
// End Transaction
}

}
;
2)aspectj定义类:AuthAspect.java:
aspect AuthAspect
{
  pointcut bankMethods() : execution (
* Bank.deposit(…)) || execution (* Bank. withdraw (…));
  Object around(): bankMethods()
  
{
    
// 验证account是否为合法用户
    return proceed();
  }

}
;
AspectJ编译器将做一下事情:
    首先,AspectJ从文件列表里取出所有的文件名,然后读取这些文件,进行分析;
    AspectJ发现一些文件含有aspect的定义,在这个例子里,就是AuthAspect;
    AspectJ根据这些aspect代码生成规则,修改添加Bank文件。 AspectJ读取AuthAspect的定义,发现了一个pointcut--bankMethods();这个pointcut的定义是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示对Bank类的deposit和withdraw方法要执行拦截。 
    AspectJ继续读取AuthAspect的定义,发现了一个around(),这在AspectJ中叫做Advice。Advice允许你在某个类的方法的调用之前或调用之后,加入另外的代码。代码中的around(),就是要加入的代码。这段代码要加在哪里呢?around()后面跟了一个pointcut--bankMethods()。根据这个pointcut,AspectJ会把这段代码加入到Bank.deposit和Bank.withdraw两个方法的执行的前后。

发布了18 篇原创文章 · 获赞 1 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章