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

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

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

Subject:抽象主题类,通过接口或抽象类声明主题和代理对象实现的业务方法

RealSubject:真实主题类,实现Subject中的具体业务,是代理对象所代表的真实对象

Proxy:代理类,其内部含有对真实主题的引用,它可以访问、控制或扩展RealSubject的功能

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接口就可拥有动态代理能力。

相关文章
|
9月前
|
人工智能 JavaScript 前端开发
CodeBuddy重构开发:程序员的懒人进化论
本书讲述了2025年一位程序员与CodeBuddy的邂逅,开启编程新时代的故事。Craft智能体实现对话式编程,大幅缩短开发周期;MCP协议打通工具链,提升全链路效率;DeepSeek V3深度理解业务并传承编码风格。在AI辅助下,开发者从工匠转型为指挥家,技术债管理更加高效。书中指出,未来编程大师是善用AI的人,CodeBuddy成为放大人类编程理想的棱镜,展现代码优雅与智慧无限可能。
386 10
|
搜索推荐
百科营销与传统营销方式的异同
有些企业把百科营销看的很重,把企业、品牌、高管、产品等统统创建了几套百科词条,投资几万元。但也有的企业认为百科词条不带来流量,创建百度百科、360百科、头条百科或者维基百科等只是在做无用功,都没有什么价值,一个百科词条也不想建。小马识途营销顾问想问下屏幕前的你怎么看?评论区打出来你的看法吧。
160 0
|
Shell Linux 网络安全
【Shell 命令集合 系统管理 】Linux 注销当前登录的用户 logout命令 使用指南
【Shell 命令集合 系统管理 】Linux 注销当前登录的用户 logout命令 使用指南
593 0
|
存储 Unix Linux
分布式文件系统协议:NFS(Network File System)网络文件系统
NFS(Network File System)网络文件系统是一种分布式文件系统协议,最初由Sun Microsystems开发,并在1984年首次发布。 NFS允许不同计算机通过网络共享资源,特别是文件和目录,就像它们是本地存储的一部分一样。使用NFS的客户端可以挂载远程服务器上的文件系统,使得用户能够以透明的方式访问远程数据,实现跨多个系统的文件共享。
5619 1
|
机器学习/深度学习 XML SQL
|
存储 编译器 测试技术
C++:list增删查改模拟实现
C++:list增删查改模拟实现
210 0
|
XML JSON 前端开发
Spring MVC 系列之拦截器 Interceptor 最全总结
理解拦截器 Interceptor 拦截器 Interceptor 在 Spring MVC 中的地位等同于 Servlet 规范中的过滤器 Filter,拦截的是处理器的执行,由于是全局行为,因此常用于做一些通用的功能,如请求日志打印、权限控制等。
2552 0
Spring MVC 系列之拦截器 Interceptor 最全总结
|
人工智能 JavaScript
Vue中为对象添加字段两种方法
Vue中为对象添加字段两种方法
|
存储 Android开发 iOS开发
三分钟了解Studio One6最新版二十项功能介绍及下载
Studio One是一款音乐编曲软件,是音乐工作者必不可少的创作工具,用于创建、录制、混合和掌握音乐和其他音频。无论你是第一次接触数字音乐工作站(DAW),还是第一次尝试制作属于自己的音乐,Studio One 6都能给你非凡的体验!Studio One 6新功能包括智能模板、乐谱支持歌词,全局视频轨,还有全新的声码器插件。万众期待的2022新版 Studio One 终于来了!在广受好评的5系列基础上,Studio One 6 又将给喜欢创作音乐的爱好者,带来哪些惊喜功能呢?请跟随 Studio One 中文来一探究竟!抢先体验20项全新功能吧!
2477 0
|
缓存 前端开发 搜索推荐
二级医院检验系统源码,SaaS模式.Net Core版云LIS系统源码
云LIS系统是医院信息管理的重要组成部分之一,集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。云LIS系统不仅是自动接收检验数据,打印检验报告,系统保存检验信息的工具,而且也是医生科研、诊疗的重要参考指标。
315 0
二级医院检验系统源码,SaaS模式.Net Core版云LIS系统源码