AOP前奏
2019-07-15 本文已影响3人
逗比寨主
AOP前奏 项目Note2
1.动态代理模式
动态代理模式:使用一个代理将对象包装起来,然后用该代理对象获取原始对象,任何对原始对象的调用都通过代理,代理对象觉得是否将方法调用转移到原始对象上。
Java代码:
AtithmeticCalculator.java
public interface AtithmeticCalculator {
int add(int i, int j);
int sub(int i, int j);
int mul(int i, int j);
int div(int i, int j);
}
AtithmeticCalculatorImpl.java
public class AtithmeticCalculatorImpl implements AtithmeticCalculator {
@Override
public int add(int i, int j) {
int result = i + j;
return result;
}
@Override
public int sub(int i, int j) {
int result = i - j;
return result;
}
@Override
public int mul(int i, int j) {
int result = i * j;
return result;
}
@Override
public int div(int i, int j) {
int result = i / j;
return result;
}
}
AtithmeticCalculatorLogginProxy.java:代理类
public class AtithmeticCalculatorLogginProxy {
private AtithmeticCalculator target;
public AtithmeticCalculatorLogginProxy(AtithmeticCalculator target) {
this.target = target;
}
public AtithmeticCalculator getLogginProxy() {
//代理对象由哪一个加载器负责加载
ClassLoader loader = target.getClass().getClassLoader();
//代理对象中有哪些方法
Class[] interfaces = new Class[]{AtithmeticCalculator.class};
//当代理对象中的方法执行时,执行代码
InvocationHandler handler = new InvocationHandler() {
/**
*
* @param proxy 正在返回的代理对象,在invoke中一般不使用该对象
* @param method 调用的方法
* @param args 调用的方法使用的呃参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("The method " + method.getName() + " begins with " + Arrays.asList(args));
//执行方法
Object result = method.invoke(target, args);
System.out.println("The method " + method.getName() + " ends with " + result);
return result;
}
};
AtithmeticCalculator proxy = (AtithmeticCalculator) Proxy.newProxyInstance(loader, interfaces, handler);
return proxy;
}
}
简单调用:
AtithmeticCalculator proxy = (new AtithmeticCalculatorLogginProxy(new AtithmeticCalculatorImpl())).getLogginProxy();
2.什么是AOP?
1.AOP面向切面编程,OOP是面向对象编程,AOP是对OOP的补充
2.AOP是切面模块化横切关注点
3.AOP编程时,仍需要定义公共功能,不不必修改受影响的类。
3.AOP术语
Lark20190715181232.png1.切面:横切关注点被模块化的特殊对象
2.通知:切面必须要完成的工作(切面的每一个通知都称之为通知)
3.目标:被通知的对象
4.代理:向目标对象应用通知之后创建的对象
5.连接点:程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后。
连接点有两个信息确定:
a.方法表示的程序执行点
b.相对点标识的方位
如:
连接点为AtithmeticCalculator#add()方法执行前
执行点为AtithmeticCalculator#add()
方位为该方法执行前的位置。
6.切点:每个类都拥有多个连接点,AtithmeticCalculator的所有的方法实际上都是连接点,即连接点是客观存在的事物,有实体,AOP通过切点定位到特定的连接点。
eg:连接点相当于数据库中的记录,切点相当于查询条件
切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件。