关于代理模式的相关配置方法

简介: 关于代理模式的相关配置方法

一、代理模式介绍 代理模式在不改变原始代理类的情况下,通过引入代理类来给原始类附加功能。 代理模式的主要结构如下:


  1. Subject:抽象主题类,通过接口或抽象类声明主题和代理对象实现的业务方法
  2. RealSubject:真实主题类,实现Subject中的具体业务,是代理对象所代表的真实对象
  3. Proxy:代理类,其内部含有对真实主题的引用,它可以访问、控制或扩展RealSubject的功能
  4. Client:客户端,通过使用代理类来访问真实的主题类按照上面的类图,可以实现如下代码:
//主题类接口
public interface Subject {
    void Request();
}
//真实的主题类
public class RealSubject implements Subject{
    @Override
    public void Request() {
        System.out.println("我是真实的主题类");
    }
}
//代理类
public class Proxy implements Subject{
    private RealSubject realSubject;
    @Override
    public void Request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.Request();
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.Request();
    }
}


代理模式有比较广泛的使用,比如Spring AOP、RPC、缓存等。在 Java 中,根据代理的创建时期,可以将代理模式分为静态代理和动态代理,下面就来分别阐述。


二、代理模式实现 动态代理和静态代理的区分就是语言类型是在运行时检查还是在编译期检查。


2.1 静态代理


静态代理是指在编译期,也就是在JVM运行之前就已经获取到了代理类的字节码信息。即Java源码生成.class文件时期。 由于在JVM运行前代理类和真实主题类已经是确定的,因此也被称为静态代理。 在实际使用中,通常需要定义一个公共接口及其方法,被代理对象(目标对象)与代理对象一起实现相同的接口或继承相同的父类。 2.2 动态代理


动态代理,也就是在JVM运行时期动态构建对象和动态调用代理方法。常用的实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及其中包含的属性及方法。比如JDK Proxy。 此外动态代理也可以通过ASM(Java 字节码操作框架)来实现。比如CGLib。 2.2.1 JDK Proxy


这种方式是JDK自身提供的一种方式,它的实现不需要引用第三方类,只需要实现InvocationHandler接口,重写invoke()方法即可。代码实现如下所示:


public class ProxyExample {
    static interface Car {
        void running();
    }
    static class Bus implements Car {
        @Override
        public void running() {
            System.out.println("bus is running");
        }
    }
    static class Taxi implements Car {
        @Override
        public void running() {
            System.out.println("taxi is runnig");
        }
    }
  //核心部分 JDK Proxy 代理类
    static class JDKProxy implements InvocationHandler {
        private Object target;
        public Object getInstance(Object target) {
            this.target = target;
            //获得代理对象
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
         }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(target, args);
            return result;
        }
    }
    public static void main(String[] args) {
        JDKProxy jdkProxy = new JDKProxy();
        Car instance = (Car) jdkProxy.getInstance(new Taxi());
        instance.running();
    }
}


实际上是通过invoke()方法来触发代理的执行方法。最终使得实现Invocation接口的类具有动态代理的能力。动态代理的好处在于不需要和静态代理一样提前写好公共的代理接口,只需要实现Invocation接口就可拥有动态代理能力。

相关文章
|
存储 监控 安全
深入解析Sysmon日志:增强网络安全与威胁应对的关键一环
在不断演进的网络安全领域中,保持对威胁的及时了解至关重要。Sysmon日志在这方面发挥了至关重要的作用,通过提供有价值的见解,使组织能够加强其安全姿态。Windows在企业环境中是主导的操作系统,因此深入了解Windows事件日志、它们的独特特性和局限性,并通过Sysmon进行增强,变得至关重要。
345 1
|
负载均衡 前端开发 API
深入理解微服务架构:从理论到实践
微服务架构已成为现代软件工程领域的热门话题。本文旨在通过具体案例分析,探讨微服务架构的理论基础、设计原则及实际应用。文章首先介绍微服务的基本概念和优势,随后深入探讨在实施过程中可能遇到的挑战与解决方案。最后,通过一个实际项目案例,展示如何将微服务架构从理论应用到实践中,以期为读者提供有价值的参考和启示。
221 31
|
数据采集 Web App开发 前端开发
不存在的!教你几招轻松绕过网站限制
不存在的!教你几招轻松绕过网站限制
3814 0
|
关系型数据库 MySQL 数据库
Python操作关系型数据库
Python是一种功能强大的编程语言,它有许多用于操作数据库的库。在本文中,我们将介绍如何使用Python连接、查询和操作关系型数据库(如MySQL、PostgreSQL和SQLite)。
211 3
|
存储 智能硬件
使用SwiftUI搭建一个智能家居的开关灯页面,我是有多无聊~
使用SwiftUI搭建一个智能家居的开关灯页面,我是有多无聊~
167 0
|
负载均衡 算法 网络协议
|
3天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
4天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
369 91