什么是AOP?为什么需要AOP
需求
image.pngimage.png
代码实现片段
image.png问题
1.代码混乱
越来越多的非业务需求(日志和验证等)加入后, 原有的业务方法急剧膨胀.
每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点.
2.代码分散
以日志需求为例, 只是为了满足这个单一需求, 就不得不在多个模块(方法)
里多次重复相同的日志代码. 如果日志需求发生变化, 必须修改所有模块.
使用动态代理解决上述问题
代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.
任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上.
接口
public interface Calculator {
int add(int i,int j);
}
实现类
public class CalculatorImpl implements Calculator{
@Override
public int add(int i, int j) {
// TODO Auto-generated method stub
return i+j;
}
}
代理类
public class ProxyLogCalculator {
private Calculator target;
public ProxyLogCalculator(Calculator target) {
// TODO Auto-generated constructor stub
this.target = target;
}
public Calculator getLogProxy(){
Calculator proxy = null;
// 代理对象由哪个类加载器负责
ClassLoader loader = target.getClass().getClassLoader();
// 代理对象的类型,即其中有哪些方法
Class[] interfaces = target.getClass().getInterfaces();
// 调用代理对象其中的方法
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("before method");
Object result = method.invoke(target, args);
System.out.println("after method");
return result;
}
};
proxy = (Calculator) Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
public static void main(String[] args) {
Calculator calculator = new CalculatorImpl();
Calculator proxy = new ProxyLogCalculator(calculator).getLogProxy();
System.out.println(proxy.add(1, 4));
}
}
AOP
1.AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论,
是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
2.AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.
3.在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能
在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就
被模块化到特殊的对象(切面)里.
4.AOP 的好处:
每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
业务模块更简洁, 只包含核心业务代码.
image.png
1.横切关注点是指(不划分功能)3个:验证参数,前置日志、后置日志
2.切面(按照功能划分)2个:(日志模块:前置日志、后置日志)(验证模块:验证参数)
3.从上往下拆分功能称为:抽取横切关注点,AOP往回为面向切面编程
网友评论