文章目录
  1. 1. 介绍
  2. 2. AOP 应用
  3. 3. 实现代码
    1. 3.1. 业务接口
    2. 3.2. 业务实现
    3. 3.3. 实现 InvocationHandler
    4. 3.4. 调用
    5. 3.5. 运行结果
  4. 4. 源码下载

上文 通过三方库 CGLIB 动态代理实现的 AOP,其实 JDK 动态代理也可以实现 AOP。JDK 动态代理实现面向切面编程,不需要依赖外部的库。

介绍

JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和InvocationHandler。InvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。 Proxy 利用 InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代理对象。

AOP 应用

AOP 很强大,现在用的比较广泛的有如下:

  1. 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警。
  2. 缓存代理,缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
  3. 软件破解,使用 AOP 修改软件的验证类的判断逻辑。
  4. 记录日志,在方法执行前后记录系统日志。
  5. 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用 AOP 将其分离,并动态挂接业务。
  6. 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉。

实现代码

业务接口

Calculator.java

1
2
3
4
5
public interface Calculator {

public int calculate(int a, int b);

}

业务实现

CalculatorImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CalculatorImpl implements Calculator {

@Override
public int calculate(int a, int b) {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return a + b;
}

}

实现 InvocationHandler

LogHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class LogHandler implements InvocationHandler {

private Object target;

public LogHandler(Object target) {
this.target = target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;

System.out.println("start");
long start = System.currentTimeMillis();

result = method.invoke(target, args);

long end = System.currentTimeMillis();
System.out.println("end time cost : " + (end - start));

return result;
}

}

调用

Client.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {

public static void main(String[] args) {
System.out.println("JDK 动态代理");

Calculator target = new CalculatorImpl();
LogHandler logHandler = new LogHandler(target);

Calculator proxy = (Calculator) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
logHandler);

int result = proxy.calculate(5, 8);
System.out.println("result : " + result);
}

}

运行结果

1
2
3
4
JDK 动态代理
start
end time cost : 2295
result : 13

源码下载

源码下载:https://github.com/jingle1267/aop.git


本文地址 http://94275.cn/2016/12/26/AOP-JDK/ 作者为 Zhenguo

author:Zhenguo
Author: Zhenguo      Blog: 94275.cn/     Email: jinzhenguo1990@gmail.com
I have almost 10 years of application development experience and have a keen interested in the latest emerging technologies. I use my spare time to turn my experience, ideas and love for IT tech into informative articles, tutorials and more in hope to help others and learn more.
文章目录
  1. 1. 介绍
  2. 2. AOP 应用
  3. 3. 实现代码
    1. 3.1. 业务接口
    2. 3.2. 业务实现
    3. 3.3. 实现 InvocationHandler
    4. 3.4. 调用
    5. 3.5. 运行结果
  4. 4. 源码下载
返回顶部