JDK 动态代理
动态代理的原理:使用代理对象将原对象包裹起来,代替原对象,然后任何对原对象的调用都通过代理对象来完成。
JDK 动态开发
代理类:
package spring.aop.normal;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ObjectProxy implements InvocationHandler{
private Object target;
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("method start:"+method.getName()+"\nargs:");
for(Object o:args) {
System.out.println(o);
}
return method.invoke(target, args);
}
public Object creatProxyInstances(Object target) {
this.target = target;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
}
}
通过反射机制完成对被代理对象的调用
AOP 简介
AOP(Aspect-Oriented Programming: 面向切面编程): 是一种一种编程范式,一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
AOP(Aspect-Oriented Programming: 面向切面编程): 是一种一种编程范式,一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充.
AOP编程的好处:
- 降低模块耦合度
- 提高代码复用性
- 是系统易于扩展
AOP 术语
- 切面:一个横切关注点的模块化,这个关注点可能会横切多个对象。它是横切关注点的另一种表达方式。
- 连接点:在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。
- 切入点:匹配连接点的断言。它通常是一个表达式,有专门的语法,用于指明在哪里(或者说在哪些方法调用上)嵌入横切逻辑
- 通知(Advice):在切面的某个特定的连接点上执行的动作,也就是我们前面提到的横切逻辑,如日志处理逻辑,事务处理逻辑。
- 目标对象(Target Object):被一个或者多个切面所通知的对象,也被称作被通知对象
- 代理对象(Proxy Object):AOP框架创建的对象,它和目标对象遵循同样的接口,使用它的方式和使用目标对象的方式是一样的,但是它是目标对象的增强版,“通知”中的代码执行将会被代理对象的方法调用触发。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。