一、简介
本教程是对 AspectJ 的快速实用的介绍。
首先,我们将演示如何启用面向方面的编程,然后我们将重点关注编译时、编译后和加载时编织之间的差异。
我们首先简单介绍一下面向方面编程(AOP)和 AspectJ 的基础知识。
2. 概述
AOP 是一种编程范式,旨在通过允许分离横切关注点来提高模块化性。它通过向现有代码添加附加行为而不修改代码本身来实现这一点。相反,我们单独声明要修改哪些代码。
AspectJ使用 Java 编程语言的扩展来实现关注点和横切关注点的编织。
3.Maven依赖
AspectJ 根据其用途提供不同的库。我们可以在 Maven 中央存储库的org.aspectj组下找到 Maven 依赖项。
在本文中,我们将重点关注使用编译时、编译后和加载时 Weaver 创建方面和 Weaver 所需的依赖项。
3.1. AspectJ 运行时
运行 AspectJ 程序时,类路径应包含类和方面,以及 AspectJ 运行时库aspectjrt.jar :
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.20.1</version> </dependency>复制
此依赖项可在Maven Central上找到。
3.2. AspectJWeaver
除了 AspectJ 运行时依赖项之外,我们还需要包含方面jweaver.jar以在加载时向 Java 类引入建议:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.20.1</version> </dependency>复制
此依赖项在Maven Central上也可用。
4. 方面创建AspectJ提供了AOP的实现,具有三个核心概念:
- 加入点
- 切入点
- 建议
我们将通过创建一个简单的程序来验证用户帐户余额来演示这些概念。
首先,让我们创建一个具有给定余额的Account类和提款方法:
public class Account { int balance = 20; public boolean withdraw(int amount) { if (balance < amount) { return false; } balance = balance - amount; return true; } }复制
我们将创建一个AccountAspect.aj文件来记录帐户信息并验证帐户余额(请注意,AspectJ 文件以“ .aj ”文件扩展名结尾):
public aspect AccountAspect { final int MIN_BALANCE = 10; pointcut callWithDraw(int amount, Account acc) : call(boolean Account.withdraw(int)) && args(amount) && target(acc); before(int amount, Account acc) : callWithDraw(amount, acc) { } boolean around(int amount, Account acc) : callWithDraw(amount, acc) { if (acc.balance < amount) { return false; } return proceed(amount, acc); } after(int amount, Account balance) : callWithDraw(amount, balance) { } }复制
正如我们所看到的,我们已经向提款方法添加了一个切入点,并创建了三个引用定义的切入点的建议。
为了理解以下内容,我们将引入以下定义:
- 方面:跨多个对象的关注点的模块化。每个方面都侧重于特定的横切功能。
- 连接点:脚本执行过程中的点,例如方法或属性访问的执行。
- 建议:某个方面在特定连接点采取的操作
- Pointcut:匹配连接点的正则表达式。通知与切入点表达式关联,并在与切入点匹配的任何连接点运行。
有关这些概念及其具体语义的更多详细信息,我们可能需要查看以下链接。
接下来,我们需要将这些方面编织到我们的代码中。以下各节介绍了三种不同类型的编织:AspectJ 中的编译时编织、编译后编织和加载时编织。
5. 编译时编织最简单的编织方法是编译时编织。当我们同时拥有切面的源代码和我们在其中使用切面的代码时,AspectJ 编译器将从源代码进行编译,并生成编织类文件作为输出。之后,在执行我们的代码时,编织过程输出类将作为普通 Java 类加载到 JVM 中。
我们可以下载AspectJ Development Tools,因为它包含捆绑的 AspectJ 编译器。AJDT 最重要的功能之一是横切关注点可视化工具,这有助于调试切入点规范。我们甚至可以在部署代码之前直观地看到组合效果。
我们将使用 Mojo 的 AspectJ Maven 插件,使用 AspectJ 编译器将 AspectJ 方面编织到我们的类中:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.14.0</version> <configuration> <complianceLevel>1.8</complianceLevel> <source>1.8</source> <target>1.8</target> <showWeaveInfo>true</showWeaveInfo> <verbose>true</verbose> <Xlint>ignore</Xlint> <encoding>UTF-8 </encoding> </configuration> <executions> <execution> <goals> <!-- use this goal to weave all your main classes --> <goal>compile</goal> <!-- use this goal to weave all your test classes --> <goal>test-compile</goal> </goals> </execution> </executions> </plugin>复制
有关 AspectJ 编译器的选项参考的更多详细信息,我们可能需要查看以下链接。