AspectJ
AspectJ 是一个基于 Java 语言的 AOP 框架,提供了强大的 AOP 功能,其他很多 AOP 框架都借鉴或采纳其中的一些思想。
AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分:第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地用 AOP 来解决 Java 语言中存在的交叉关注点问题;另一个部分是工具部分,包括编译器、调试工具等。
AspectJ 是最早、功能比较强大的 AOP 实现之一,对整套 AOP 机制都有较好的实现,很多其他语言的 AOP 实现,也借鉴或采纳了 AspectJ 中很多设计。在 Java 领域,AspectJ 中的很多语法结构基本上已成为 AOP 领域的标准。
安装AspectJ
下载AspectJ
安装 AspectJ 首先要到 AspectJ官网下载一个可执行的Jar包。
使用 java -jar aspectj-1.8.14.jar 命令
在安装了 AspectJ 之后,在其安装目录下,可以看到如下的文件结构:
├─bin // 该路径下存放了 aj、aj5、ajc、ajdoc、ajbrowser 等命令。
│ ├─aj.bat
│ ├─aj5.bat
│ ├─ajbrowser
│ ├─ajbrowser.bat
│ ├─ajc // 其中 ajc 命令最常用,它的作用类似于 javac,用于对普通 Java 类进行编译时增强。
│ ├─ajc.bat
│ ├─ajdoc
│ ├─ajdoc.bat
├─doc // 该路径下存放了AspectJ的使用说明、参考手册、API文档等文档。
├─lib // 该路径下的4个Jar文件是AspectJ的核心类库
│ ├─aspectjrt.jar
│ ├─aspectjtools.jar
│ ├─aspectjweaver.jar
│ ├─org.aspectj.matcher.jar
├─LICENSE-AspectJ.html 相关授权文件
└─README-AspectJ.html
用法
- aspectjrt.jar包主要是提供运行时的一些注解,静态方法等等东西,通常我们要使用aspectJ的时候都要使用这个包。
- aspectjtools.jar包主要是提供赫赫有名的ajc编译器,可以在编译期将将java文件或者class文件或者aspect文件定义的切面织入到业务代码中。通常这个东西会被封装进各种IDE插件或者自动化插件中。
- aspectjweaverjar包主要是提供了一个java agent用于在类加载期间织入切面(Load time
weaving)。并且提供了对切面语法的相关处理等基础方法,供ajc使用或者供第三方开发使用。这个包一般我们不需要显式引用,除非需要使用LTW。
上面的说明其实也就指出了aspectJ的几种标准的使用方法(参考文档):
- 编译时织入,利用ajc编译器替代javac编译器,直接将源文件(java或者aspect文件)编译成class文件并将切面织入进代码。
- 编译后织入,利用ajc编译器向javac编译期编译后的class文件或jar文件织入切面代码。
- 加载时织入,不使用ajc编译器,利用aspectjweaver.jar工具,使用java agent代理在类加载期将切面织入进代码。
两个类
Dog.java
public class Dog {
public void bark(){
System.out.println("wang wang ~~~~");
}
}
DogAspect.java
@Aspect
public class DogAspect {
long startTime;
@Pointcut("execution(* cn.com.hanru.booking.Dog.bark(..))")
public void joinPoint(){}
@Before("joinPoint()")
public void preBark(){
startTime = System.currentTimeMillis();
}
@After("joinPoint()")
public void postBark(){
long endTime = System.currentTimeMillis();
System.out.println("旺财一口气叫了 " + (endTime - startTime) + ":ms");
}
}
命令行编译和运行,windows环境
编译时织入
java -jar E:/aspectj1.8/lib/aspectjtools.jar -cp E:/aspectj1.8/lib/aspectjrt.jar -source 1.5 -sourceroots src/main/java/ -d target/classes
java -cp "E:/aspectj1.8/lib/aspectjrt.jar;target/classes/" cn.com.hanru.booking.AopApp
使用javac编译源文件,再使用java agent在运行时织入:
为了实现LTW,我们需要在资源目录下配置META-INF/aop.xml文件,来告知类加载器我们当前注册的切面,在上面的项目中,我们其实只需要创建src/main/resources/META-INF/aop.xml:
<aspectj>
<aspects>
<aspect name="cn.com.hanru.booking.DogAspect"/>
</aspects>
</aspectj>
命令行运行,windows环境
java -javaagent:"E:/aspectj1.8/lib/aspectjweaver.jar" -cp "E:/aspectj1.8/lib/aspectjrt.jar;target/classes/" cn.com.hanru.booking.AopApp
ideal 环境
编译运行
wang wang ~~~~
旺财一口气叫了 0:ms