代理模式

什么是代理模式

哈喽,大家好,我是花臂,今天给大家聊一聊代理模式的使用方法。

代理模式就是为其他对象提供一种代理以控制对这个对象的访问。举个很简单的例子,我们买汽车不是直接去汽车制造厂买车,而是去4s店买车,这个4s店就相当于一个代理,找明星代言要找明星的经纪人,这个经纪人也是代理,懂了吧。

代理模式主要包含三个角色,即抽象主题角色(Subject)、委托类角色(被代理角色,Proxied)以及代理类角色(Proxy)

代理模式分为静态代理和动态代理,动态代理又分为jdk动态代理和cglib动态代理

代理模式的应用场景

SpringAop、日志收集、权限控制、过滤器、RPC远程调用

具体代码实现

静态代理

基于接口实现静态代理

!抽象主题角色
public interface OrderService {
 public void order();
}
! 委托类角色
public class OrderServiceImpl implements OrderService {

 public void order() {
  System.out.println("执行订单的业务逻辑");
 }
}
! 代理类
public class JdkProxy implements InvocationHandler {

 //目标代理对象
 private Object target;

 public JdkProxy(Object target) {
  this.target = target;
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  System.out.println("开始日志收集");
  //执行目标方法
  Object result = method.invoke(target, args);
  System.out.println("日志收集结束");
  return result;
 }
 /***
  * 获取动态代理对象接口
  */
 public <T> T getProxy() {
  return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

 }

}
! 测试
public class test {
 public static void main(String[] args) {

 JdkProxy jdkProxy=new JdkProxy(new OrderServiceImpl());
  OrderService proxy = jdkProxy.getProxy();
  proxy.order();
 }

cglib动态代理

! 被代理类
public class OrderServiceImpl {

 public void order() {
  System.out.println("执行订单的业务逻辑");
 }
}
! 代理类2
public class CglibProxy implements MethodInterceptor {
 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  System.out.println("开始日志收集");
  Object result = methodProxy.invokeSuper(o, objects);
  System.out.println("日志收集结束");
  return result;
 }
! 测试类
public class test {
 public static void main(String[] args) {
CglibProxy cglibProxy=new CglibProxy();
  Enhancer enhancer=new Enhancer();
  //设置代理类的父类
  enhancer.setSuperclass(OrderServiceImpl.class);
  //设置回调对象
  enhancer.setCallback(cglibProxy);
  //创建代理对象
  OrderServiceImpl orderService = (OrderServiceImpl) enhancer.create();
  orderService.order();
 }

静态代理就是自己手写的代理就是静态代理,动态代理时代码在运行其自动生成的代理类

jdk动态代理底层使用java的反射机制生成动态代理类,只能代理实现了接口的类,没有实现接口的不能实现动态代理
cglib动态代理通过继承被代理类形成一个子类,通过super去执行父类的方法,在方法前后去做处理,底层是通过ams字节码生成代理类的

jdk动态代理要求被代理的类必须实现接口,当需要代理的类没有实现接口的时候时cglib代理是一个很好的选择。另一个优点就是cglib动态代理比使用java反射机制的jdk动态代理要快

ok,本次教程就到这,又什么疑问欢迎下方评论区留言!

本文参考蚂蚁课堂

评论区



© [2020] · Powered by Typecho · Theme by Morecho
鄂ICP备20005123号