文章目录
  1. 1. 简单介绍
  2. 2. 实现代码
    1. 2.1. Client.java
    2. 2.2. Calculator.java
    3. 2.3. CalculatorImpl.java
    4. 2.4. CalculatorInterceptor.java
    5. 2.5. 执行效果
  3. 3. AOP 与 OOP 的区别
  4. 4. 源码下载
  5. 5. 其它

AOP 为 Aspect Oriented Programming 的缩写,意为面向切面编程。所谓的面向 切面编程其实是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来做成一种服务,从而实现代码复用。

简单介绍

利用 AOP 可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度降低。

比较常见的有日志记录,性能统计,安全验证等。

Java 中实现 AOP 有多种方式,下文介绍基于 cglib 的 AOP 的例子。

实现代码

以下四个类实现了,在不改变原 CalculatorImpl 代码的基础上,实现了对 calculate 执行时间的统计。

Client.java

1
2
3
4
5
6
7
8
public static void main(String[] args) {
CalculatorInterceptor calculatorInterceptor = new CalculatorInterceptor();
trueCalculatorImpl calculatorImpl = new CalculatorImpl();

trueCalculator calculator = (Calculator) calculatorInterceptor.createProxyObject(calculatorImpl);
trueint result = calculator.calculate(5, 8);
trueSystem.out.println("result : " + result);
}

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;
}

}

CalculatorInterceptor.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
25
26
27
public class CalculatorInterceptor implements MethodInterceptor {

Object targetObject;

public Object createProxyObject(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}

@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object result = null;

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

result = method.invoke(targetObject, objects);

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

return result;
}
}

执行效果

执行 Client 的 main 方法,结果如下:

1
2
3
4
CGLIB 动态代理
start
end time cost : 2262
result : 13

最终实现的效果是:在不破坏原来代码逻辑的基础上,对原来的逻辑添加了前置和后置操作。例子中实现的统计代码的执行时间,我们还可以做日志记录,性能统计,安全验证等。

AOP 与 OOP 的区别

AOP、OOP 在字面上虽然非常类似,但却是面向不同领域的两种设计思想。

  1. OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
  2. AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

源码下载

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

其它

实现 AOP 方法的其它方式介绍:AOP JDK动态代理


本文地址 http://94275.cn/2016/12/24/aop/ 作者为 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. 实现代码
    1. 2.1. Client.java
    2. 2.2. Calculator.java
    3. 2.3. CalculatorImpl.java
    4. 2.4. CalculatorInterceptor.java
    5. 2.5. 执行效果
  3. 3. AOP 与 OOP 的区别
  4. 4. 源码下载
  5. 5. 其它
返回顶部