代码示例
//目标对象/被代理对象
public class TeacherDao{
public void teach() {
System.out.println("老师授课中... < cglib代理不需要实现接口 > ");
}
}
//-------------------------------------------------------------------------
//代理对象工厂
public class ProxyFactory implements MethodInterceptor {
/**维护一个目标对象*/
private Object target;
/**传入被代理的对象*/
public ProxyFactory(Object target) {
this.target = target;
}
/**返回当前维护的目标对象(target)的代理对象*/
public Object getProxyInstance(){
//1.创建一个工具类
Enhancer enhancer = new Enhancer();
//2.设置父类
enhancer.setSuperclass(target.getClass());
//3.设置回调函数 this反过来调自己
enhancer.setCallback(this);
//4.创建子类对象 即代理对象
return enhancer.create();
}
/**
* 重写 intercept方法,会调用目标对象的方法
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("Cglib代理模式...开始");
Object result = method.invoke(target, objects);
System.out.println("Cglib代理提交...");
return result;
}
}
//-------------------------------------------------------------------------
//测试
public class Client {
public static void main(String[] args) {
//创建目标对象
TeacherDao teacherDao = new TeacherDao();
//获取到代理对象,并且将目标对象传递给代理对象
TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(teacherDao).getProxyInstance();
//执行代理对象的方法 触发intercept方法 从而实现对目标对象的调用
proxyInstance.teach();
}
}
代理模式(Proxy)的变体
防火墙代理:内网通过代理穿透防火墙,实现对公网的访问。
缓存代理:比如:当请求图片文件等资源时,先到缓存代理取,如果取到资源则ok,如果取不到资源, 再到公网或者数据库取,然后缓存。
远程代理:远程对象的本地代表,通过它可以把远程对象当本地对象来调用。远程代理通过网络和 真正的远程对象沟通信息。