`
wenlong342
  • 浏览: 62337 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

AspectJ初解

阅读更多
2006/10/30
AspectJ入門 AspectJ入门
入門-利用Eclipse編譯AspectJ入门-利用Eclipse编译AspectJ
http://www.matrix.org.cn/resource/article/44/44423_Eclipse+AspectJ.html
如何使用AspectJ Compiler開發AspectJ程式如何使用AspectJ Compiler开发AspectJ程式
http://swanky.hsiao.googlepages.com/aspectj-with-ajc


以下出處: http://www-128.ibm.com/developerworks/cn/java/l-aspectJ/以下出处: http://www-128.ibm.com/developerworks/cn/java/l-aspectJ/
1. 序: 1.序:
AspectJ是一個代碼生成工具(Code Generator)。 AspectJ是一个代码生成工具(Code Generator)。
AspectJ語法就是用來定義代碼生成規則的語法。 AspectJ语法就是用来定义代码生成规则的语法。 您如果使用過Java Compiler Compiler (JavaCC),您會發現,兩者的代碼生成規則的理念驚人相似。您如果使用过Java Compiler Compiler (JavaCC),您会发现,两者的代码生成规则的理念惊人相似。
AspectJ有自己的語法編譯工具,編譯的結果是Java Class文件,運行的時候,classpath需要包含AspectJ的一個jar文件(Runtime lib)。 AspectJ有自己的语法编译工具,编译的结果是Java Class文件,运行的时候,classpath需要包含AspectJ的一个jar文件(Runtime lib)。

2. Aspect Oriented Programming (AOP) 2. Aspect Oriented Programming (AOP)
class Bank class Bank
{
public float deposit(AccountInfo account, float money) public float deposit(AccountInfo account, float money)
{
// 驗證account是否為合法用戶    // Begin Transaction //验证account是否为合法用户// Begin Transaction
// 增加account賬戶的錢數,返回賬戶裡當前的錢數   // End Transaction //增加account账户的钱数,返回账户里当前的钱数// End Transaction
}

public float withdraw(AccountInfo account, float money) public float withdraw(AccountInfo account, float money)
{
// 驗證account是否為合法用戶    // Begin Transaction //验证account是否为合法用户// Begin Transaction
// 減少account賬戶的錢數,返回取出的錢數    // End Transaction //减少account账户的钱数,返回取出的钱数// End Transaction
}
};
以上程式內含有商業邏輯和與系統無關的邏輯(驗證),程式碼不單單只負責一件事情,增加複雜度,減少可用性.而認證,事務等方面,就是AOP所關心的Aspect。以上程式内含有商业逻辑和与系统无关的逻辑(验证),程式码不单单只负责一件事情,增加复杂度,减少可用性.而认证,事务等方面,就是AOP所关心的Aspect。 AOP就是為瞭解決這種問題而出現的。 AOP就是为了解决这种问题而出现的。 AOP的目的就是--Separation of Aspects (or Separation of Concerns). AOP的目的就是--Separation of Aspects (or Separation of Concerns).

3.AspectJ
使用AspectJ,我們不用對原有的代碼做任何修改,就可以為代碼提供不同的Aspect(方面)--比如,認證,事務等。使用AspectJ,我们不用对原有的代码做任何修改,就可以为代码提供不同的Aspect(方面)--比如,认证,事务等。 我們只需要提供兩個不同的Aspect--認證Aspect和事務Aspect。我们只需要提供两个不同的Aspect--认证Aspect和事务Aspect。
Code 4.1 AuthAspect.java Code 4.1 AuthAspect.java
aspect AuthAspect aspect AuthAspect
{
pointcut bankMethods() : execution (* Bank.deposit(…)) || execution (* Bank. withdraw (…)); pointcut bankMethods() : execution (* Bank.deposit(…)) || execution (* Bank. withdraw (…));

Object around(): bankMethods() Object around(): bankMethods()
{
// 驗證account是否為合法用戶 //验证account是否为合法用户

return proceed(); return proceed();
}
};

Code 4.2 TransactionAspect.java Code 4.2 TransactionAspect.java
aspect TransactionAspect aspect TransactionAspect
{
pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…)); pointcut bankMethods() : execution(* Bank.deposit(…)) || execution (* Bank. withdraw (…));

Object around(): bankMethods() Object around(): bankMethods()
{
// Begin Transaction // Begin Transaction
Object result = proceed(); Object result = proceed();
// End Transaction // End Transaction
return result; return result;
}
};
這些aspect的定義,不過是定義了一些代碼生成規則。这些aspect的定义,不过是定义了一些代码生成规则。
我們來看看,AspectJ編譯器為我們做了什麼事情。我们来看看,AspectJ编译器为我们做了什么事情。

1. 首先,AspectJ從文件列表裡取出所有的文件名,然後讀取這些文件,進行分析。 1.首先,AspectJ从文件列表里取出所有的文件名,然后读取这些文件,进行分析。
2. AspectJ發現一些文件含有aspect的定義,在這個例子裡,就是AuthAspect和TransactionAspect的定義;這些aspect就是代碼生成規則。 2. AspectJ发现一些文件含有aspect的定义,在这个例子里,就是AuthAspect和TransactionAspect的定义;这些aspect就是代码生成规则。
3. AspectJ根據這些aspect代碼生成規則,修改添加你的源代碼。 3. AspectJ根据这些aspect代码生成规则,修改添加你的源代码。 在這個例子裡,就是修改添加Bank文件。在这个例子里,就是修改添加Bank文件。
4. AspectJ 讀取AuthAspect的定義,發現了一個pointcut--bankMethods();這個pointcut的定義是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有對Bank類的deposit和withdraw方法的執行點。 4. AspectJ读取AuthAspect的定义,发现了一个pointcut--bankMethods();这个pointcut的定义是execution(* Bank.deposit(…)) || execution(* Bank. withdraw (…)),表示所有对Bank类的deposit和withdraw方法的执行点。
5. AspectJ繼續讀取AuthAspect的定義,發現了一個around(),這在AspectJ中叫做Advice,我不明白為什麼叫這個名字,不過沒關係,我們只要知道它是干什麼的就行了。 5. AspectJ继续读取AuthAspect的定义,发现了一个around(),这在AspectJ中叫做Advice,我不明白为什么叫这个名字,不过没关系,我们只要知道它是干什么的就行了。 Advice允許你在某個類的方法的調用之前或調用之後,加入另外的代碼。 Advice允许你在某个类的方法的调用之前或调用之后,加入另外的代码。 Code 4.1所示代碼中的around()的" // 驗證account是否為合法用戶"部分,就是要加入的代碼。 Code 4.1所示代码中的around()的" //验证account是否为合法用户"部分,就是要加入的代码。 這段代碼要加在哪裡呢?这段代码要加在哪里呢? around()後面跟了一個pointcut-- bankMethods()。 around()后面跟了一个pointcut-- bankMethods()。 根據這個pointcut,AspectJ會把這段代碼加入到Bank.deposit和Bank.withdraw兩個方法的執行之前。根据这个pointcut,AspectJ会把这段代码加入到Bank.deposit和Bank.withdraw两个方法的执行之前。 達到的效果就如同Code 2.2所示。达到的效果就如同Code 2.2所示。
6. AspectJ讀取TransactionAspect的定義,象第(4)步一樣,發現了發現了一個pointcut--bankMethods()。 6. AspectJ读取TransactionAspect的定义,象第(4)步一样,发现了发现了一个pointcut--bankMethods()。
7. AspectJ 繼續讀取AuthAspect的定義,發現了一個around()。 7. AspectJ继续读取AuthAspect的定义,发现了一个around()。 這次AspectJ把"Begin Transaction"和"End Transaction"兩段代碼加在Bank.deposit和Bank. withdraw兩個方法的執行前後。这次AspectJ把"Begin Transaction"和"End Transaction"两段代码加在Bank.deposit和Bank. withdraw两个方法的执行前后。 達到的效果就如同Code 2.3所示。达到的效果就如同Code 2.3所示。

如何驗證這一點?如何验证这一点? 您可以到http://www.eclipse.org/aspectj/下載安裝AspectJ,編譯裡面的Sample,把編譯結果反編譯一下,就可以看到AspetJ自動生成的代碼。您可以到http://www.eclipse.org/aspectj/下载安装AspectJ,编译里面的Sample,把编译结果反编译一下,就可以看到AspetJ自动生成的代码。

我們看到,AspectJ是一種代碼自動生成工具。我们看到,AspectJ是一种代码自动生成工具。 你編寫一段通用的代碼,比如認證方面的代碼,事務方面的代碼,然後根據AspectJ語法定義一套代碼生成規則(aspect定義),AspectJ就會幫助你自動把這段通用代碼分佈到對應的代碼裡面去,簡單快捷,算無遺策。你编写一段通用的代码,比如认证方面的代码,事务方面的代码,然后根据AspectJ语法定义一套代码生成规则(aspect定义),AspectJ就会帮助你自动把这段通用代码分布到对应的代码里面去,简单快捷,算无遗策。
我們用AspectJ編譯器編譯Bank文件和含有aspect的這個文件,出來的結果就是帶有安全認證和事務處理的Bank類。我们用AspectJ编译器编译Bank文件和含有aspect的这个文件,出来的结果就是带有安全认证和事务处理的Bank类。 編譯出來的這個Bank 類調用了AspectJ Runtime Lib,所以,如果你要運行這個Bank類,你需要把AspectJ Runtime Lib設置在你的classpath裡面。编译出来的这个Bank类调用了AspectJ Runtime Lib,所以,如果你要运行这个Bank类,你需要把AspectJ Runtime Lib设置在你的classpath里面
分享到:
评论

相关推荐

    Aspectj

    AspectJ是一种广泛使用的Java语言的面向切面编程(AOP)扩展。它允许开发者将关注点模块化,使得系统中的交叉切面(如日志、事务管理、安全性等)可以独立于核心业务逻辑进行处理。本指南将深入探讨AspectJ的核心概念...

    aspectj-1.9.6.jar

    《AspectJ 1.9.6.jar:Java AOP编程的基石》 AspectJ是Java平台上的一种面向切面编程(AOP)框架,它允许开发者将关注点分离,提高代码的可维护性和可复用性。AspectJ 1.9.6.jar文件是AspectJ库的核心组成部分,它...

    aspectJ

    AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更有效地处理横切关注点,即那些跨越多个类或方法,不易封装的传统OOP难以处理的问题,如日志、事务管理、性能监控等。在本资料中...

    aspectj-1.7.0.jar

    aspectj-1.7.0.jar aspectj的包

    精通AspectJ_源代码

    AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更方便地处理系统中的横切关注点,如日志、事务管理、安全性等。本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,...

    aspectj-1.6.9.jar

    AspectJ 是一个强大的面向切面编程(AOP)的框架,它允许开发者在Java应用程序中分离关注点,将横切逻辑(如日志、事务管理、安全性等)与核心业务逻辑相分离。`aspectj-1.6.9.jar` 是AspectJ框架的一个特定版本,即...

    aspectj jar

    AspectJ和Spring的整合在Java开发中扮演着重要的角色,特别是在实现面向切面编程(AOP)时。AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑...

    AspectJ的JAR包

    AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许开发者在不改变原有代码结构的情况下,插入关注点代码。在Spring AOP框架中,AspectJ被广泛用于实现更精细粒度的切面逻辑,提供比Spring默认的...

    org.aspectj,aspectj项目库(org.aspectj).zip

    【标题】"org.aspectj,aspectj项目库(org.aspectj).zip" 提供的是开源项目AspectJ的源码库。AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许程序员以声明式方式处理系统的横切关注点,如日志...

    aspectj,aspectjrt,weaver等

    AspectJ、AspectJRT 和 AspectWeaver 是三个与面向切面编程(AOP)相关的关键组件,它们在Spring框架中有着重要应用,尤其对于初学者来说,理解这些概念是掌握Spring AOP的基础。 AspectJ 是一个强大的Java语言的...

    Aop之AspectJ详解解读demo

    **Aop之AspectJ详解解读** 在软件开发中,面向切面编程(AOP)是一种设计模式,它允许程序员将关注点分离到不同的模块,从而提高代码的可维护性和复用性。AspectJ是Java平台上的一个开源AOP框架,它提供了一种强大...

    AspectJ面向切面的例子

    AspectJ是Java平台上的一个开源框架,它为Java开发者提供了强大的AOP支持,使我们能够方便地定义和实现切面。 标题"AspectJ面向切面的例子"指的是通过AspectJ实现的一个实际项目,这个例子是一个名为"Spacewar"的小...

    aspectj-1.9.5.jar

    aspectj-1.9.5.jar 官网下载地址:https://www.eclipse.org/aspectj/downloads.php

    book :aspectj in action

    《AspectJ in Action》是一本深入探讨面向切面编程(Aspect-Oriented Programming, AOP)的权威书籍,由Eric Evans和Manning Publications在2003年出版。该书详细介绍了AspectJ这一强大的Java语言扩展,它允许开发者...

    AspectJ_Cookbook_English_edition

    《AspectJ Cookbook》是一本专为开发者准备的指南,它深入介绍了AspectJ这一强大的面向切面编程(AOP)框架。面向切面编程是一种编程范式,旨在提高软件的可维护性和可重用性,通过将关注点分离,使得业务逻辑与系统...

    AspectJ 文档

    AspectJ是一个功能强大的面向切面编程(AOP)框架,它允许开发者以声明的方式在Java程序中定义横切关注点(cross-cutting concerns),如日志记录、事务管理等。AOP通过引入切面(aspects)来模块化这些关注点,而切...

    spring aspectj.jar

    《Spring AOP与AspectJ深度解析》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring的面向切面编程(AOP)特性极大地简化了代码的维护和扩展。AspectJ是Spring AOP的重要组成部分,...

    AspectJ经典实例详解

    AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志、事务管理等模块化,实现代码的解耦。AOP的核心理念是将横切关注点(如日志、异常处理等)与业务逻辑...

    Android Studio AspectJ技术1

    AspectJ 在 Android Studio 中的应用 AspectJ 是一种面向 Aspect 编程语言,用于在 Java 语言中实现面向方面编程。AspectJ 可以帮助开发者更好地理解和优化 Android 应用程序的性能和行为。在 Android Studio 中...

Global site tag (gtag.js) - Google Analytics