代理模式是指为其他对象提供一种代理,一控制对这个对象的访问
在客服端和目标对象之间气到中介作用
静态代理
硬编码
动态代理
通过生成字节码,重新组成一个新的类
动态代理demo
guoqiang给liqi找小姑娘
public class Liqi implements Iperson {
public void findLove() {
System.out.println("找小姑娘");
}
}
public class Guoqiang implements InvocationHandler {
private Object liqi;
public Object getInstance(Object target){
this.liqi = target;
Class<?> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打车找地方去");
method.invoke(liqi,args);
System.out.println("事后付钱");
return null;
}
}
public class Test {
public static void main(String[] args) throws Throwable {
dynamicproxy.Guoqiang guoqiang = new dynamicproxy.Guoqiang();
Iperson instance = (Iperson)guoqiang.getInstance(new Liqi());
instance.findLove();
}
}
jdk
实现invacationHandler接口;需要拿到被代理类的接口,一定要有接口;调用更复杂
生成逻辑简单,效率低,用反射
cglib
实现methodIntercepter接口
不需要用户持有接口等前置条件;直接继承拿到被代理类的class重写
效率更高,没用反射;目标代理类没有final修饰方法‘
优缺点
代理对象和真实调用的目标对象分离,解耦
增加类复杂度,请求速度变慢
spring判断bean有接口实现时,用jdk,没有则用cglib;默认用jdk代理,可以更改配置使用cglib;
[图片上传失败...(image-34dec5-1583072484300)]