概念:为其他对象提供一种代理,以控制对这个对象的访问(火车票代售处)类似中介,去掉一些服务或者增加一些功能
AOP:再不改变原有类的一些方法的基础上,增加一些额外的业务逻辑
代理模式的几种:
1.远程代理:为不同地理的对象提供局域网代表对象
2.虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建(加载今日头条时,文字先加载出来,图片过大而加载缓慢,会出现一个虚拟图片)
3.保护代理:控制用户的访问权限(只有注册了才能发帖,评论等)
4.智能引用代理:提供对目标对象额外服务
代理实现的两种方式:
静态代理:(使用聚合方式)
代理和被代理对象在代理之前时确定的,他们都实现相同的接口或者都继承相同的抽象类
动态代理:动态产生代理,实现对不同类,不同方法的代理
使用动态代理,必须实现InvocationHandle接口
InvocationHandle是事务处理器
代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by lxq on 2017/9/4.
*/
public class TimeHandle implements InvocationHandler{
private Object object;
public TimeHandle(Object object) {
super();
this.object = object;
}
/**
*
* @param proxy 被代理对象
* @param method 被代理对象的方法
* @param args 方法的参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
处理业务的逻辑
*/
method.invoke(object);//传递过来的对象
/*
处理业务的逻辑
*/
return null;
}
}
测试代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* Created by lxq on 2017/9/4.
*/
public class Test1 {
public static void main(String[] args){
// Car car = new Car();
Object object = new Object();
Class<?> cls = object.getClass();
InvocationHandler h = new TimeHandle(object);
/**
* @param loader 被代理类的类加载器
* @param interfaces 实现接口
* @param h InvocationHandle
*/
//Moveable moveable = (Moveable)
Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),h);
//moveable.move();
}
}
JDK动态代理和CGLIB代理的区别:
1.jdk动态代理只能代理实现了接口的类,没有实现接口的类不能实现JDK的动态代理
2.CGLIB是针对类来实现代理的:对制定目标类产生子类(通过继承方式final),通过对方法的重写