Java代理模式

简介: 代理模式 23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式


代理模式

 23中(Gof)中代理模式中的一种,AOP本身就是基于动态代理实现的,所以掌握了代理模式对AOP的学习很有帮助,所以先讲下代理模式

1.静态代理模式

 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静态代理中的代理类和目标类会实现同一接口或是派生自相同的父类。

1.1 创建接口

/**
* 定义公共接口
* @author dpb[波波烤鸭]
*
*/
public interface SomeService {
   String doSome();
}

1.2 创建接口实现类

/**
* 静态代理模式的实现类
* @author dpb[波波烤鸭]
*
*/
public class SomeServiceImpl implements SomeService{
   @Override
   public String doSome() {
    // TODO Auto-generated method stub
    return "hello";
   }
}

1.3 创建静态代理类

/**
* 代理类
*    增强实现类
*    和实现类实现同一个接口
* @author dpb[波波烤鸭]
*
*/
public class SomeProxy implements SomeService{
   private SomeService target;
   public SomeProxy(SomeService target) {
    super();
    this.target = target;
   }
   /**
    * 增强方法
    *    将返回结果转换为大写
    */
   @Override
   public String doSome() {
    return target.doSome().toUpperCase();
   }
}

1.4 测试实现

   public static void main(String[] args) {
    SomeService some = new SomeServiceImpl();
    // 获取静态代理对象
    SomeProxy proxy = new SomeProxy(some);
    System.out.println(proxy.doSome());
   }

image.png

2.动态代理模式

 代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。

image.png

2.1.JDK动态代理

声明接口

/**
 * 定义公共接口
 * @author dpb[波波烤鸭]
 *
 */
public interface SomeService {
  String doSome();
}

创建实现类

/**
 * 静态代理模式的实现类
 * @author dpb[波波烤鸭]
 *
 */
public class SomeServiceImpl implements SomeService{
  @Override
  public String doSome() {
    // TODO Auto-generated method stub
    return "hello";
  }
}

JDK代理实现

public static void main(String[] args) {
  SomeService some = new SomeServiceImpl();
  // 获取静态代理对象
  SomeService proxy = (SomeService) Proxy.newProxyInstance(
      some.getClass().getClassLoader() // 实现类的类加载器
      , some.getClass().getInterfaces() // 实现类 实现的所有的接口
      , new InvocationHandler()  // 处理器
      {
        /**
         * proxy 代理对象
         * method 目标的方法
         * args 目标方法的参数
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          String msg = (String) method.invoke(some, args);
          return msg.toUpperCase();
        }
      });
  System.out.println(proxy.doSome());
}

image.png

2.2CGLIB动态代理

导入cglib的jar包

image.png

创建目标类

/**
 * 静态代理模式的实现类
 * @author dpb[波波烤鸭]
 *
 */
public class SomeServiceImpl {
  public String doSome() {
    // TODO Auto-generated method stub
    return "hello";
  }
}

创建cglib工厂

/**
 * cglib代理类
 * @author dpb[波波烤鸭]
 *
 */
public class CglibProxy implements MethodInterceptor{
  private SomeServiceImpl target;
  public CglibProxy(SomeServiceImpl target) {
    this.target = target;
  }
  /**
   * 创建cglib代理对象的方法
   * @return
   */
  public SomeServiceImpl createProxy(){
    // 创建增强器
    Enhancer e = new Enhancer();
    // 指定父类
    e.setSuperclass(SomeServiceImpl.class);
    // 指定回调接口对象
    e.setCallback(this);
    // 创建cglib代理对象
    return (SomeServiceImpl) e.create();
  }
  /**
   * 拦截方法
   */
  @Override
  public Object intercept(Object obj, Method method, Object[] agrs, MethodProxy proxy) throws Throwable {
    String msg = (String)method.invoke(target, agrs);
    return msg.toUpperCase();
  }
}

测试

public static void main(String[] args) {
  // 定义目标对象
  SomeServiceImpl some = new SomeServiceImpl();
  // 获取代理对象
  SomeServiceImpl proxy = new CglibProxy(some).createProxy();
  System.out.println(proxy.doSome());
}

image.png


相关文章
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
67 1
|
2月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
3月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
60 2
|
4月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
64 0
|
4月前
|
设计模式 监控 Java
深入理解Java中的代理模式及其实现
深入理解Java中的代理模式及其实现
|
4月前
|
设计模式 监控 Java
深入理解Java中的代理模式及其实现
深入理解Java中的代理模式及其实现
|
5月前
|
设计模式 监控 安全
设计模式之代理模式(Java)
设计模式之代理模式(Java)
|
5月前
|
设计模式 安全 Java
Java设计模式:代理模式的静态和动态之分(八)
Java设计模式:代理模式的静态和动态之分(八)
下一篇
无影云桌面