动机
在后端编程中接触到了拦截器,用户权限的验证,统计一个函数的运行时间,这些都可以拦截器来实现,拦截器是AOP的一种实现形式。觉得这种东西是必不可少的。所以就升入了解一哈,顺便了解一哈设计模式,在将来的编程有大用。
什么是AOP
AOP:Aspect-Oriented Programming,可以理解为面向切面编程,是对OOP的一种补充。
首先先看看MVC模式,Model + Controller + View,在熟悉不过,其实在JavaWeb中可以细分为下面几层
- 最上层一层当然是View层了,没啥好说的
- 用户对View做出交互操作后,View传递一个Action给Controller层
- Controller层对Action继续进行分发,向下给Service层
- Service继续向下,给DAO层(Data Access Object)
注意以下几点:
- Service层与DAO层都是属于Model层的
- DAO层是对数据库最基本的操作,例如插入一条数据
- 如果把所有的业务逻辑操作(例如登陆这个操作)操作都放在Controller,就会使Controller臃肿,不易维护,所以Service就承当了一部分的任务,Controller基本就几行代码(显示最基本的逻辑),对DAO层的操作都会放在Service层中。
这时候,AOP就要登场了,它就像一个切面插在这些层面之间,进行你想进行的一系列操作。
动态代理(Dynamic Proxy)
首先看一段bad code
public interface Calculator {
void calculate(int a, int b);
}
public class CalculatorImpl implements Calculator {
@Override
public void calculate(int a, int b) {
before();
System.out.println(a + b);
after();
}
private void before() {
System.out.println("Before");
}
private void after() {
System.out.println("After");
}
}
为什么说这些代码写得差呢?把before()
与after()
方法写死在calculate()
里面,如果有许多方法要进行这样的before()``after()
,那每个函数都要改,显然是不可能的(例如统计一个函数运行时间)。
这样,比较简单就是动态代理。
这2个类还是不变的
public interface Calculator {
void calculate(int a, int b);
void calculate2(int a, int b); // 测试用啦,其实都一样
}
public class CalculatorImpl implements Calculator {
@Override
public void calculate(int a, int b) {
System.out.println(a + b);
}
@Override
public void calculate2(int a,