23种设计模式—代理模式

信奥赛csp初赛高频考点【位运算】(详细解析) 阅读详情

Spring使用JDK与CGLIB两种动态代理

JDK动态代理:
有接口的类使用JDK的动态代理(JDK动态代理不支持没有接口的类)
如果有n个接口,必然有n个实现,只用写1个代理类JDKProxy就可以对所有有接口进行处理
如果有代理主题角色存在,必须修改调用方才能实现代理
CGLIB动态代理:
没有接口的类使用CGLIB动态代理(类有没有接口都可以支持)
只用写1个代理类CglibProxy就可以对所有没有接口的不能是final类都进行处理
如果有代理主题角色存在,必须修改调用方才能实现代理

静态代理

抽象主体

//抽象主体
public interface IUserService {
    //买虾方法
    public void rend();
}

真实主体

//真实的主体
public class UserServiceImpl  implements IUserService{

    public void rend() {
        System.out.println("皮皮虾真正卖大龙虾...........");
    }
}

代理主体角色

//代理主体角色
public class UserServiceImplProxy implements IUserService{

    private IUserService userService;
    public UserServiceImplProxy(IUserService userService){
        this.userService = userService;
    }

    public void rend() {

        try {
            System.out.println("签买卖合同");
            userService.rend();
            System.out.println("打款");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("发放大龙虾");
        }
    }
}

测试

@Test
public void testStaticProxy()throws Exception{
    //真实主体
    UserServiceImpl userService = new UserServiceImpl();
    //代理主体
    UserServiceImplProxy userServiceImplProxy = new UserServiceImplProxy(userService);
    userServiceImplProxy.rend();
}

动态代理

抽象主体

//抽象主体
public interface IUserService {
    //买虾方法
    void rend();
    //查询方法
    void find();
}

真实主体

//真实主体角色
public class UserServiceImple implements IUserService{

    public void rend() {
        System.out.println("皮皮虾卖大龙虾..............");
    }

    public void find() {
        System.out.println("查询皮皮虾有几斤大龙虾...............");
    }
}

事物管理器TxManager

public class TxManager {

    public void begin(){
        System.out.println("开启事物...");
    }
    public void commit(){
        System.out.println("提交事物...");
    }
    public void close(){
        System.out.println("关闭事物...");
    }
    public void rollback(Throwable e){
        System.out.println("回滚事物..." + e);
    }
}

JDK动态代理

public class JdkProxy implements InvocationHandler {
    //真实主体角色
    private Object target;
    //事物管理者
    private TxManager txManager;
    public JdkProxy(Object target, TxManager txManager) {
        this.target = target;
        this.txManager = txManager;
    }
    /**
     * @param proxy  代理对象
     * @param method 代理方法
     * @param args   参数
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            if(method.getName().startsWith("find")){
                method.invoke(target);
            }else {
                txManager.begin();
                method.invoke(target);
                txManager.commit();
            }
        } catch (Throwable e) {
            e.printStackTrace();
            txManager.rollback(e);
        } finally {
            if(method.getName().startsWith("find")){
            }else {
                txManager.close();
            }
        }
        return null;
    }
    //提供方法来得到代理对象
    public Object createProxy(){
        //第一个参数:目标类的类加载器
        //第二个参数:Class实例
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
}

CGLIB动态代理

public class CglibProxy implements MethodInterceptor {
    //真实主体角色
    private Object target;
    //事物管理者
    private TxManager txManager;
    public CglibProxy(Object target, TxManager txManager) {
        this.target = target;
        this.txManager = txManager;
    }
    /**
     *
     * @param o
     * @param method
     * @param objects
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        try {
            if(method.getName().startsWith("find")){
                method.invoke(target);
            }else {
                txManager.begin();
                method.invoke(target);
                txManager.commit();
            }
        } catch (Throwable e) {
            e.printStackTrace();
            txManager.rollback(e);
        } finally {
            if(method.getName().startsWith("find")){
            }else {
                txManager.close();
            }
        }
        return null;
    }
    //创建代理的时候  不一样
    public Object createProxy(){
        //通过这个增强类
        Enhancer enhancer = new Enhancer();
        //设置代理类
        enhancer.setSuperclass(target.getClass());
        //回调到intercept方法
        enhancer.setCallback(this);
        return enhancer.create();
    }
}

测试

@Test
public void testJdkProxy() throws Exception {
    //真实主体角色
    IUserService userService = new UserServiceImple();
    TxManager txManager = new TxManager();
    //代理类对象
    CglibProxy cglibProxy = new CglibProxy(userService, txManager);
    //得到代理对象
    IUserService proxy = (IUserService)cglibProxy.createProxy();
    proxy.rend();
}
米哈游运维面试题及参考答案 Linux 系统运行级别是用于定义系统启动时所需要达到的功能状态。运行级别 0:表示系统停机状态,用于关闭系统,是系统的关机级别。当系统切换到这个级别时,会停止所有的服务和进程,然后关闭系统。运行级别 1:也称为单用户模式。在这个级别下,系统只启动基本的系统服务和必要的进程,仅允许 root 用户登录系统进行维护操作,常用于系统出现故障需要紧急修复的情况,比如修复文件系统错误、重置 root 密码等。运行级别 2:多用户模式,但不支持网络文件系统(NFS)。 阅读详情

相关推荐

利用ArcGIS快速生成等高线边界,完成地形图拼图

地形图边界一般在CAD中手动绘制,然而,一幅边缘复杂的地形图边界的绘制需要花费大量时间和精力,为了减少重复性工作,提高效率,用ArcGIS软件可以自动生成实测地形图的边界

yl14774636230的博客 9068

【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解代理模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 3063

【向量数据库】Milvus向量数据库 ① 从入门到实战

Milvus是专为海量高维向量设计的开源数据库,支持AI搜索、图像识别、推荐系统等场景。相比传统关系型数据库(如PostgreSQL),它更高效处理语义检索、非结构化数据存储,可毫秒级响应亿级向量查询。单机场景下,推荐配置8GB内存/32GB硬盘,支持FAISS/HNSW等索引算法,支持GPU加速。本文涵盖优快云专属部署教程(CentOS脚本/配置调优),提供避坑指南与扩展资源,并对比分析与传统数据库差异。适合算法工程师、AI开发人员快速上手,附官方下载与性能测试技巧,手把手教你搭建高效向量检索系统!

xiezhiyi007的专栏 1585

【软件设计】常用设计模式--代理模式

与真实对象和代理对象共享相同的接口,以便客户端可以通过代理访问。与之前相同,定义一个公共接口。代理模式在控制对象访问和增强系统功能方面提供了很大的灵活性,且每种变体都有其独特的用处,需要根据需求进行选择和实施。

分享自己学习过程获得的一些知识 1399

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇) 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了修改环节和相应参数。 垂直起降固定翼 中文教程-参数设置 垂直起降固定翼是由 多轴+...

u011322358的博客 2万+

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 383

23种设计模式——(4) 代理模式

代理模式

Mary~fighting的博客 230

MATLAB 与 STK 互联的两种连接方式详解

批量仿真推荐使用方法一;交互分析推荐使用方法二。可以根据具体任务灵活切换,也可以同时使用两种方式,提升建模与仿真的效率。

weixin_52370774的博客 1564

23种设计模式之代理模式

代理模式属于结构型设计模式,其核心思想是为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用,并可以在不改变客户端代码的情况下增强或控制对象的访问。

JAVA开发区的博客 3764

【FF-A】第二章 Introduction

Armv8.4 架构引入了在安全状态下的虚拟化扩展。Arm® SMMU v3.2 架构[1]为安全流添加了对第2阶段翻译的支持,以补充在 Armv8.4 处理器状态下的安全 EL2 翻译制度。这些架构特性使得在安全状态下,彼此不信任的软件组件能够相互隔离。关于在安全状态下引入虚拟化扩展以及固件框架目标的更多理念可在名为《在安全世界使用虚拟化进行隔离》的白皮书[3]中找到。软件组件只能访问物理地址空间和系统资源的区域,例如 GIC 中对其正确运行必要的中断。

baron-周贺贺-代码改变世界ctw 528

4.3 Langfuse 集成实战:追踪 OpenAI、LangChain 和 LangGraph 应用

本文介绍了如何将Langfuse集成到不同类型的AI应用中,包括原生OpenAI、LangChain和LangGraph应用。主要内容包括: 两种集成模式:手动追踪(精确控制)和自动追踪(通过回调机制) 三种应用场景的集成方案: 原生OpenAI应用:使用langfuse.trace()手动记录对话流程、LLM调用和工具执行 LangChain应用:通过LangfuseCallbackHandler自动追踪Agent执行过程 LangGraph应用:与LangChain相同的自动追踪方式,可可视化节点和状态

yonggeit的博客 3300

java23种设计模式-代理模式

结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。通过引入代理对象,在客户端和目标对象之间起到中介作用。

专注后端开发 1163

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

GOF23设计模式之代理模式

GOF23设计模式之代理模式 核心作用:通过代理,控制对对象的访问。可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理(即:AOP的微观实现) AOP(Aspect Oriented Programming 面向切面编程)的核心实现机制 核心角色: 1)抽象角色:定义代理角色和真实角色的公共对外方法 2)真实角色:实现抽象角色,定义真实角色索要实...

weixin_30352645的博客 101

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

23种设计模式——代理模式:代码世界的幕后操盘

代理模式是一种结构型设计模式,通过创建代理对象控制对真实对象的访问。核心价值在于实现访问控制、延迟加载和附加逻辑(如权限验证、日志记录)。主要代理类型包括虚拟代理(延迟创建)、保护代理(权限控制)、远程代理(网络通信)和智能引用代理。典型应用场景包括Spring AOP、Hibernate延迟加载、RPC框架和安全系统。与装饰器模式不同,代理侧重访问控制而非功能增强。模式优点在于解耦客户端与真实对象,但可能带来性能开销和调试复杂度。动态代理(如JDK Proxy)相比静态代理更具灵活性,可在运行时生成代理类

qq_52077555的博客 1391

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

瑞_23种设计模式_代理模式

本文章为瑞_系列专栏之《23种设计模式》的代理模式篇。在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2395

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java23种设计模式之代理模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 代理模式(proxy pattern) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种..

weixin_43246215的博客 2202

23种设计模式——代理模式

代理模式(结构型模式) 代理模式(Proxy Pattern):所谓代理模式,就是为A提供一个B对象以控制对A的访问。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,并执行现有对象的相关方法,以便向外界提供功能接口。一般代理模式主要解决直接访问对象不合适的情形。比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某...

Silly 326

C++23种设计模式之代理模式

以下内容全部来自传智播客的设计模式讲义: 3.1代理模式 概念 Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。 类图角色和职责 ...

qq_15054345的博客 370

23种设计模式详解_23种设计模式--代理模式

前言:Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理。1.代理模式的定义 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,...

weixin_31139479的博客 159

23种设计模式-代理模式

在java中可能有的对象创建起来十分负责且浪费空间,这种情况下频繁的创建对象可能会出现内存溢出的情况,使用代理就可以减少对象的频繁创建何时使用:想在访问一个类时做一些控制。

三横同学的博客 622

23设计模式—代理模式

代理模式学习加案例!

a12jggfdd的博客 447

Java中23种设计模式之代理模式

代理模式通过代理对象控制对目标对象的访问,分静态与动态代理。静态代理需手动编写代理类,存在类爆炸问题;动态代理在运行时生成代理类,JDK 代理基于接口,CGLIB 代理基于类继承,解决无接口场景代理。二者核心区别在于代理基础(接口 vs 类)、性能及适用场景,JDK 适合有接口场景,CGLIB 弥补无接口局限。动态代理是 AOP 的核心实现,掌握其原理可提升代码扩展性,合理选择代理方式能应对不同设计需求。

m0_73941339的博客 2126
上一篇: JPA乐观锁&jpql_day04
下一篇: Spring_构造注入&注解注入&代理模式&AOP
虞铭轩、
博客等级 码龄7年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值