AspectJ

AOP静态代理-AspectJ
AspectJ官网
参考文章


1. AspectJ安装

    1. AspectJ下载下载aspectj-x.x.x.jar
    1. 点击直接安装:在我的Mac上安装到了/Users/user/aspectj1.9路径下面
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #tree命令查看aspectj安装后的部分文件
      $ tree -L 2 -I doc
      .
      ├── LICENSE-AspectJ.html
      ├── README-AspectJ.html
      ├── bin
      │   ├── aj
      │   ├── aj5
      │   ├── ajbrowser
      │   ├── ajc
      │   └── ajdoc
      └── lib
      ├── aspectjrt.jar
      ├── aspectjtools.jar
      ├── aspectjweaver.jar
      └── org.aspectj.matcher.jar
  • 3.【可选】将aspectj/bin加入环境变量


2. IDEA中使用AspectJ

参考配置文档

    1. 正常创建一个Java Project
    1. 创建Hello.java
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      package com.quantums;

      public class Hello {

      public void sayHello() {
      System.out.println("Hello AspectJ: "+this.getClass());
      }

      public void sayBye(){
      System.out.println("Goodbye: "+this.getClass());
      }

      public static void main(String[] args) {
      Hello h = new Hello();
      h.sayHello();
      h.sayBye();
      }
      }
    1. 创建一个AspectJ文件(Idea配置AspectJ支持后会弹出对应的aspect文件选项)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      package com.quantums;

      public aspect TxAspect {
      void around():call(void com.quantums.Hello.sayHello()){
      System.out.println("TxAspect: 程序开始...");
      proceed();
      System.out.println("TxAspect: 程序结束...");
      }
      }

再定义一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.quantums.aspect;

public aspect LogAspect {
// 定义一个 PointCut,其名为 logPointcut, 匹配Hello对象的所有say*方法
pointcut logPointcut():execution(void com.quantums.Hello.say*());

after():logPointcut(){
System.out.println("记录日志:方法结束");
}

before():logPointcut(){
System.out.println("记录日志:方法开始");
}
}

    1. 配置Idea环境: 首先选择将Preferences-Build-Java compiler-Use compiler: Ajc
    1. 配置Idea环境: 然后设置plugins: 打钩AspectJ Support和Sprign AOP/@AspectJ两个选项
    1. 导入aspectjrt依赖: aspectjrt.jar和aspectjtools.jar在安装目录lib中, Project Structure-Libraries-加号把这两个jar导入(jar包全路径)
    1. 编译执行
      1
      2
      3
      4
      5
      6
      7
      8
      TxAspect: 程序开始...
      记录日志:方法开始
      Hello AspectJ: class com.quantums.Hello
      记录日志:方法结束
      TxAspect: 程序结束...
      记录日志:方法开始
      Goodbye: class com.quantums.Hello
      记录日志:方法结束

查看反编译后的Hello.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.quantums;

import com.quantums.aspect.LogAspect;
import com.quantums.aspect.TxAspect;
import org.aspectj.runtime.internal.AroundClosure;

public class Hello {
public Hello() {
}

public void sayHello() {
LogAspect.aspectOf().ajc$before$com_quantums_aspect_LogAspect$2$9fd5dd97();

try {
System.out.println("Hello AspectJ: " + this.getClass());
} catch (Throwable var2) {
LogAspect.aspectOf().ajc$after$com_quantums_aspect_LogAspect$1$9fd5dd97();
throw var2;
}

LogAspect.aspectOf().ajc$after$com_quantums_aspect_LogAspect$1$9fd5dd97();
}

public void sayBye() {
LogAspect.aspectOf().ajc$before$com_quantums_aspect_LogAspect$2$9fd5dd97();

try {
System.out.println("Goodbye: " + this.getClass());
} catch (Throwable var2) {
LogAspect.aspectOf().ajc$after$com_quantums_aspect_LogAspect$1$9fd5dd97();
throw var2;
}

LogAspect.aspectOf().ajc$after$com_quantums_aspect_LogAspect$1$9fd5dd97();
}

public static void main(String[] args) {
Hello h = new Hello();
sayHello_aroundBody1$advice(h, TxAspect.aspectOf(), (AroundClosure)null);
h.sayBye();
}
}