aspectj是java语言的一个AOP实现,aspectj不一定要在spring中使用,单独也可以用,本文通过一个简单的例子来说明如果通过独立使用aspectj来实现aop,本文不会介绍aop的相关概念,只给出一个简单的例子。
1. 下载安装aspectj
https://www.eclipse.org/aspectj/downloads.php
通过上面的网站下载aspectj的jar包,我下载的是aspectj-1.8.0.jar
2. 安装aspectj
下载好jar包后,在放jar的目录下打开命令行窗口,可以在目录下按shift+右键,选择“在此处打开Powershell窗口”来打开命令行窗口,如下图。
打开后输入如下命令,就会弹出安装窗口
java -jar aspectj-1.8.0.jar
安装过程基本一路next就可以,其中有一步如下图,让选择jre,一般会自动找到jre安装路径,如果没有找到,就手动选择一下。
安装完后的目录如下
3. 添加环境变量
其实上面安装过程的最后一步提示会将安装目录下的bin目录加到环境变量里,不过不知道为什么我的没有加进去,所以我就手动加了一下,就是在path环境变量里加上aspectj安装目录下的bin目录。这样我们就能在任意目录下使用ajc命令了(ajc命令是aspectj编译java文件的命令)
4. 创建测试类
创建如下3个测试类。其中AOPTest类是主类,用来进行代码测试,Hello类是待增强的类,一会我们要对这个类的say方法进行增强。
AuthAspect类是切面类,大家可能注意到这个类不是public class,而是public aspect,public aspect并不是java的语法,而是aspectj的语法,所以一会我们不能用javac来编译这些文件,而是用ajc命令来编译这些文件。
//主类,用于测试
public class AOPTest{
public static void main(String[] args){
Hello h = new Hello();
h.say();
}
}
//待增强的类
public class Hello{
public void say(){
System.out.println("Hello say hello");
}
}
//切面类
public aspect AuthAspect{
//before()说明这是一个前置增强
//execution(* Hello.say())表明我们要增强Hello类的say()方法
before(): execution(* Hello.say()){
System.out.println("auth");
}
}
5. 编译测试类
将上面三个测试类放在同一文件夹下,然后在此文件下打开命令行窗口,输入如下命令。
其中-d表示指定编译后生成的class文件放在哪里, -d . (-d加一点)表示我们把生成的class文件放在当前目录下。-cp指定classpath,因为我们要用到aspectj的jar来编译,所以指定一下classpath,aspectjrt.jar这个jar包就在aspectj安装目录下的lib目录下。*.java表示我们要编译此目录下所有以.java结尾的文件。
如果输入命令时提示找不到ajc命令,说明你环境变量没有添加正确,请检查一下环境变量配置。
ajc -d . -cp 'C:\aspectj1.8\lib\aspectjrt.jar' *.java
6. 测试
编译完成后,上面三个java文件会分别生成三个class文件,然后继续在命令行输入以下命令运行主类进行测试。
同样,我们运行时需要aspectjrt.jar,所以要指定一下classpath。注意这个classpath和上面指定classpath略有不同,就是要加上;.(分号+ 一点),不然运行时会提示找不到主类的错误(为什么要强调这个,因为我一开始就是忘了,搞得我找了好久的错误,气!)
java -cp 'C:\aspectj1.8\lib\aspectjrt.jar;.' AOPTest
可以看到我们的say方法本来只输出Hello say hello,经过上面操作后在say之前先输出了auth,说明对say方法增强成功。