- 去官网下载aspectj的jar包,关注下自己使用的jdk的版本
https://www.eclipse.org/aspectj/downloads.php
java -jar aspectj-1.8.14.jar
vim ./.bash_profileexport PATH=${JAVA_HOME}/bin:$PATH:/Users/local/aspectj1.8/binexport CLASSPATH=${CLASSPATH}:/Users/local/aspectj1.8/lib/aspectjrt.jarsource ./.bash_profile
- 配置完成后,输入命令ajc,确定下是否安装成功,成功的话会提示相应的版本
- 首先编写一个简单的 Java 类,这个 Java 类用于模拟一个业务组件
public class Hello { public void sayHello() { System.out.println("Hello, AspectJ!"); } public static void main(String[] args) { Hello hello = new Hello(); hello.sayHello(); }}
- 假设现在客户需要在执行 sayHello() 方法之前启动事务,当该方法执行结束时关闭事务,在传统编程模式下,我们必须手动修改 sayHello() 方法
- 如果改为使用 AspectJ,则可以无须修改上面的 sayHello() 方法,使用AspectJ来创建一个特殊的类
public aspect TxAspect { void around():call(void Hello.sayHello()){ System.out.println("开始事务..."); proceed(); System.out.println("事务结束..."); }}
- TxAspect 不是一个 Java 类, aspect 也不是 Java 支持的关键字,它只是 AspectJ 才能识别的关键字,上面的代码中 proceed() 代表回调原来的 sayHello() 方法
- 接下来执行如下命令进行编译:
ajc -d . Hello.java TxAspect.aj
开始事务...Hello AspectJ!事务结束...
- 从上面运行结果来看,我们完全可以不对 Hello.java 类进行任何修改,同时又可以满足客户的需求,上面程序只是在控制台打印”开始事务 …”、”结束事务 …”来模拟了事务操作,实际上我们可用实际的事务操作代码来代替这两行简单的语句,这就可以满足客户需求了
- 通过使用 AspectJ 提供的 AOP 支持,我们可以为 sayHello() 方法不断增加新功能。
- 为什么在对 Hello 类没有任何修改的前提下,而 Hello 类能不断地、动态增加新功能,这看上去并不符合 Java 基本语法规则啊。实际上我们可以使用 Java 的反编译工具来反编译前面程序生成的 Hello.class 文件,发现 Hello.class 文件的代码如下:
import org.aspectj.runtime.internal.AroundClosure;public class Hello { public Hello() { } public void sayHello() { System.out.println("Hello, AspectJ!"); } public static void main(String[] args) { Hello hello = new Hello(); sayHello_aroundBody1$advice(hello, TxAspect.aspectOf(), (AroundClosure)null); }}
- 该 Hello.class 里新增了很多内容,这表明 AspectJ 在编译时”自动”编译得到了一个新类,这个新类增强了原有的 Hello.java 类的功能,因此 AspectJ 通常被称为编译时增强的 AOP 框架。
都看到这了,你是最棒的