1.9 spring中的代理模式

Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB) 代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理。如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理;如果目标对象没有实现任何接口,则会创建CGLIB动态代理。CGLIB是第三方包,从Spring4.3开始就无需再次导入包了。 注意 客户端直接调用与目标类相对应的代理类的功能,为了保证代理类与目标类具有相同功能,代理类与目标类必须实现相同的接口 代理是实现AOP的核心和关键技术。只要是AOP,就一定会涉及代理技术 . 代理技术的分类 按照是否 阅读详情


1.概念

代理模式是二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。

在这里插入图片描述

使用代理之后:
在这里插入图片描述

生活中的代理

  • 广告商找大明星拍广告需要经过经纪人
  • 合作伙伴找大老板谈合作要约见面时间需要经过秘书
  • 房产中介是买卖双方的代理

相关术语

  • 代理:将非核心逻辑剥离出来以后,封装这些非核心逻辑的类、对象、方法。
  • 目标:被代理“套用”了非核心逻辑代码的类、对象、方法。

2.静态代理机制

2.1 静态代理业务调用

在这里插入图片描述

2.2 静态代理实现

package com.atguigu;

public class CalculatorProxy implements Calculator{

    private Calculator target;

    public CalculatorProxy(Calculator target) {
        this.target = target;
    }

    @Override
    public int add(int i, int j) {
        System.out.println("[日志] add方式开始执行:  参数1:"+i+"~~"+ "参数2:"+j);
        int result = target.add(i,j);
        System.out.println("[日志] add方式结束执行:  结果是"+result);
        return result;
    }

    @Override
    public int sub(int i, int j) {
        System.out.println("[日志] sub方式开始执行:  参数1:"+i+"~~"+ "参数2:"+j);
        int result = target.sub(i,j);
        System.out.println("[日志] sub方式结束执行:  结果是"+result);
        return result;
    }

    @Override
    public int mul(int i, int j) {
        System.out.println("[日志] mul方式开始执行:  参数1:"+i+"~~"+ "参数2:"+j);
        int result = target.mul(i,j);
        System.out.println("[日志] mul方式结束执行:  结果是"+result);
        return result;
    }

    @Override
    public int div(int i, int j) {
        System.out.println("[日志] div方式开始执行:  参数1:"+1+"~~"+ "参数2:"+j);
        int result = target.div(i,j);
        System.out.println("[日志] div方式结束执行:  结果是"+result);
        return result;
    }
}

2.3 测试静态代理代码

@Test
public void testUser() throws SQLException {
    CalculatorImpl target = new CalculatorImpl();
    Calculator calculator = new CalculatorProxy(target);
    int add = calculator.add(100, 100);
    int div = calculator.div(100, 10);
    System.out.println("求和结果:"+add);
    System.out.println("商的结果:"+div);
}

3.动态代理机制

3.1 动态代理介绍

在这里插入图片描述

3.2 创建代理对象

package com.atguigu;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy {

    public static Object getProxy(Object target){

        /**
         * 参数介绍
         *  1.类加载器
         *  2.目标对象的接口
         *  3.业务执行回调函数InvocationHandler  handler对象
         */
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        try {
                            System.out.println("[日志]"+method.getName()+"方式开始执行:  参数1:"+args[0]+"~~"+ "参数2:"+args[1]);
                            result = method.invoke(target,args);
                            System.out.println("[日志]"+method.getName()+"方式开始结束:  返回值:"+result);
                        }catch (Exception e){
                            System.out.println("[日志]"+method.getName()+"|异常信息:"+e.getMessage());
                        }finally {
                            System.out.println("[日志]动态代理执行完成: 返回值结果:"+result);
                        }
                        return result;
                    }
                });
    }
}

3.3 测试结果显示

在这里插入图片描述

4.Cglib动态代理

4.1 编辑代理类

public class CglibProxy {

    public static Object getProxy(Object target){

        //1.定义增强器对象
        Enhancer enhancer = new Enhancer();
        //2.为属性赋值
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object result = null;
                try {
                    System.out.println("[日志]"+method.getName()+"方式开始执行:  参数1:"+objects[0]+"~~"+ "参数2:"+objects[1]);
                    result = method.invoke(target,objects);
                    System.out.println("[日志]"+method.getName()+"方式开始结束:  返回值:"+result);
                }catch (Exception e){
                    System.out.println("[日志]"+method.getName()+"|异常信息:"+e.getMessage());
                }finally {
                    System.out.println("[日志]动态代理执行完成: 返回值结果:"+result);
                }
                return result;
            }
        });

        return enhancer.create();
    }
}

4.2 编辑测试类

@Test
    public void testCglibProxy(){
        CalculatorImpl target = new CalculatorImpl();
        Calculator calculator = (Calculator) CglibProxy.getProxy(target);
        System.out.println(calculator.getClass());
        int add = calculator.add(100, 200);
        System.out.println("返回值结果:"+add);
    }

5.总结

  1. 代理方式不同

    • JDK代理使用的是反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
    • CGLIB代理使用字节码处理框架asm,对代理对象类的class文件加载进来,通过修改字节码生成子类。
  2. 效率不同

    • JDK创建代理对象效率较高,执行效率较低;
    • CGLIB创建代理对象效率较低,执行效率高。
  3. 生成方式不同

    • JDK动态代理机制是委托机制,只能对实现接口的类生成代理,通过反射动态实现接口类;
    • CGLIB则使用的继承机制,针对类实现代理,被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,因为是继承机制,不能代理final修饰的类。
  4. 是否需要第三方类库

    • JDK代理是不需要依赖第三方的库,只要JDK环境就可以进行代理,需要满足以下要求:

      1. 实现InvocationHandler接口,重写invoke()
      2. 使用Proxy.newProxyInstance()产生代理对象
      3. 被代理的对象必须要实现接口
    • CGLib 必须依赖于CGLib的类库,需要满足以下要求:

      1. 实现MethodInterceptor接口,重写intercept()
      2. 使用Enhancer对象.create()产生代理对象
代理模式(Proxy Pattern) 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象(称为"被代理对象"或"目标对象")的访问。代理对象充当了客户端和目标对象之间的中介,拦截对目标对象的所有调用。封装性:客户端与目标对象之间的中间层可以起到保护目标对象的作用扩展性:符合开闭原则,可以在不修改目标对象的前提下扩展目标对象的功能灵活性:可以通过代理控制对目标对象的访问,并增加额外的业务逻辑解耦性:可以将与目标对象无关的功能抽离出来,保持目标对象的纯粹性。 阅读详情

相关推荐

基于FFT的阵列方向图快速计算公式推导

因为自己毕设涉及到阵列方向图综合相关知识,最近阅读了关于方向图综合的相关文献,就其中关于使用FFT计算阵列方向图的方法进行了公式推导。 简介: 自从1965年Colley-Tukey发表快速傅里叶变换[1]论文以来,FFT在许多科学技术领域获得了广泛和成功的应用。在阵列信号处理与雷达信号处理领域,随着科技的发展,对于电尺寸较大的相控阵天线,使用公式按照级数求和计算天线阵列方向图的方法效率甚低,...

qq_38151438的博客 4284

静态代理与动态代理的区别

静态代理 什么是代理? 举个栗子,生活中的外卖平台,店铺是制作外卖的,然后放到平台上售卖。这里的店铺就是真实角色,为了能够让店铺不用担心销售等问题,从而能够更加专注做外卖,所以店铺的外卖都会放到平台上面。这里平台就是代理。平台代店家出售,而店家只需要做外卖就好了。 例子2 再比如程序中,当程序做出了一个操作的时候,应该要写一个相应的日志,代理的作用就是负责如日志...

u012777599的博客 1239

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 872

Spring AOP理论 +代理模式详解

面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。那么AOP为何那么重要呢?在我们的程序中,经常存在一些系统性的需求,比如权限校验、日志记录、统计等,这些代码会散落穿插在各个业务逻辑中,非常冗余且不利于维护。例如下面这个示意图:有多少业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。

weixin_45080272的博客 3588

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 723

AOSP Android14 Launcher3——动画核心类QuickstepTransitionManager详解

是一个复杂但核心的动画管理器。它利用 Android 的远程动画机制,拦截系统默认的窗口切换,并替换为高度定制、与 Launcher UI 深度集成的平滑过渡动画。当用户从一个应用程序通过手势或按键返回到 Launcher (桌面) 时,它负责创建和运行动画,使得应用程序窗口能够平滑地过渡(通常是缩小)到 Launcher 上的对应目标(图标、小部件或屏幕中心),同时 Launcher 界面元素(工作区、背景等)恢复显示。计算动画所需的各种参数,如窗口的起始/结束位置、缩放比例、透明度、圆角、裁剪区域等。

Micheal_Yang's Blog 2658

Spring框架中的代理模式

代理模式

YiGeiGiaoGiao的博客 1521

silvaco例子库学习—mos1ex02

mos1ex02相比于第一个例子,主要进行了mos的输出特性仿真,工艺结构是一样的,所以就只简单讨论一下atlas特性仿真的部分。

weixin_61913839的博客 844

spring的代理模式

1、何为代理模式 如何实现在不修改源码的基础上实现代码功能的增强呢?spring为我们提供了代理模式。所谓的代理模式通俗来说就是一个中介,它给某一个对象提供一个代理对象,并由代理对象控制原对象的引用,从而实现在不修改源码的基础上实现代码功能的增强。2、分类 按照代理创建的时期进行分类,可以分为两类:静态代理、动态代理。 静态代理的代理类=原始类+增强(额外功能)+和原始类实现同一个接口,即基于接口的代理。 动态代理又分为jdk动态代理,其也是基于接口的

weixin_43723296的博客 3919

行政数据分析大屏实战:用Tableau从Excel到看板的完整搭建流程(含数据连接与字段计算避坑)

本文详细介绍了如何利用Tableau从Excel数据源搭建行政数据分析大屏的完整流程,涵盖数据准备、连接技巧、计算字段优化、看板设计及动态交互部署。通过五阶工作流,帮助用户高效处理多源异构数据,实现业务洞察与可视化呈现,提升行政数据分析效率。

weixin_29696711的博客 333

手把手教你用ROS2控制PX4无人机画个圆:从C++代码到Gazebo仿真全流程解析

本文详细解析了如何使用ROS2控制PX4无人机实现圆形轨迹飞行,涵盖从C++代码编写到Gazebo仿真的全流程。重点介绍了Offboard模式下的控制算法实现、圆形轨迹生成的数学原理,以及解决通信延迟和坐标系转换等常见问题的实用技巧。通过实战案例,帮助开发者快速掌握无人机轨迹跟踪仿真的核心技术。

weixin_30839881的博客 92

Spring AOP面向切面编程9:AOP中的代理模式一:Spring AOP底层基于代理模式实现;代理模式简介;静态代理代码演示;静态代理缺点分析;

说明: (1) 一:SpringAOP底层实现原理简介:底层基于代理模式来实现; 了解【SpringAOP底层的实现原理】有较大必要性; (1)Spring是基于【设计模式中的代理模式】实现功能动态扩展; (2)对于SpringAOP来说,其包含两种情况: ●如果目标类实现了接口,那么【SpringAOP】底层是通过【JDK动态代理】来实现功能的扩展; ●如果目标类没有实现了接口,那么【SpringAOP】底层是通过【CGLib这个第...

小枯林的博客 804

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1561

Spring的核心AOP及代理模式(“最易懂得Spring学习”)

????哇咔咔:\textcolor{blue}{哇咔咔:}哇咔咔:在前两篇中我们了解了IOC\textcolor{green}{在前两篇中我们了解了IOC}在前两篇中我们了解了IOC ????接下来就接触一下另一个核心AOP\textcolor{pink}{接下来就接触一下另一个核心AOP}接下来就接触一下另一个核心AOP ????所用到的代码都可以在这里找到???? ????博主也在学习阶段,如若发现问题,请告知,非常感谢\textcolor{Orange}{博主也在学习阶段,如若发现问题,请告知,非常

奔走的王木木Sir的博客 1316

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式学习总结(9) 代理模式

本系列主要记录设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代码;能够想到至少两个它的应用实例,一个生活中的,一个软件中的;这个模式的优缺点是什么,其有哪些使用场景,在使用时要注意什么。 9.代理模式 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机

hacke2' Blog 5331

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java 实现代理模式以及通过Spring AOP 实现代理模式

什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品。关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,“委托者”对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就相当于为厂家做了一次对客户群体的“过滤”。我们把微商代理和厂家进一步抽象,前者可抽象为代理类,后者可抽象为目标类(被代理类)。通过使用代理,通常有两...

zamaochick的博客 366

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spring09、代理模式

/args -包含的方法调用传递代理实例的参数值的对象的阵列,或null如果接口方法没有参数。分析: 在这个过程中,你直接接触的就是中介,就如同现实生活中的样子,你看不到房东,但是你依旧租到了房东的房子通过代理,这就是所谓的代理模式,程序源自于生活,所以学编程的人,一般能够更加抽象的看待生活中发生的事情。方法对象的声明类将是该方法声明的接口,它可以是代理类继承该方法的代理接口的超级接口。我们也可以编写一个通用的动态代理实现的类!我们想要静态代理的好处,又不想要静态代理的缺点,所以 , 就有了动态代理!

林知屿的博客 1146

spring设计模式_代理模式

代理模式应该是Spring核心设计模式之一了 先说下代理模式特性:   1.有代理人和被代理人   2.对于被代理的人来说,这件事情是一定要做的,但是我又不想做,所有就找代理人来做。   3.需要获取到被代理人的个人资料。 Spring中的代理模式是声明式事务 (AOP) 代理模式代码中的使用   1.日志监听   2.开启,关闭事务   3.等等 现实中的例...

weixin_30314631的博客 124

Spring系列 【9、代理模式】

Spring系列 99、代理模式9.1、静态代理9.2、加深理解9.3、动态代理9.3.1、Proxy9.3.2、InvocationHandler 9、代理模式 为什么要学习代理模式呢? 因为这就是SpringAOP的底层。【SpringAOP和SpringMVC】 代理模式的分类: 静态代理 动态代理 9.1、静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来接解决 真是角色:被代理的角色 代理角色:代理真是角色,代理真是角色后,我们一般会做一些附属操作 客户:访问代理对象的人 代

weixin_39379635的博客 212

Spring学习代理模式

首先我们先说下,为什么要学习代理模式?因为这就是SpringAOP底层。【SpringAOP和SpringMVC】 代理模式的分类 静态代理 动态代理 10.1,静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 代码步骤: 接口: //租房 public interface Rent { public void rent(); } 2.真..

dingtianliang的专栏 101

三种代理模式详解

文章目录二、代理模式(Proxy Pattern)1、常见的几种代理模式:2、静态代理3、JDK动态代理4、CGLib代理5、CGLib和JDK动态代理的区别 二、代理模式(Proxy Pattern) 根据B站狂神视频整理:https://www.bilibili.com/video/BV1mc411h719?p=9 参考1:https://blog.csdn.net/kongsanjin/article/details/105419414 参考2:https://www.cnblogs.com/cen

java知识整理 5251

spring的代理模式、AOP、spring-mybatis、声明式事务

Spring 代理模式 为什么要学习代理模式?因为这就是SpringAOP的底层!【SpringAOP和SpringMVC】 代理模式的分类: 静态代理 动态代理 静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理后一般会做一些附属操作 客户:访问代理对象的人 代码步骤: 接口 真实角色 代理角色 客户端访问代理角色 Rent.java /** * @author zhuxianglong * @version

ZXLzhuzhu的博客 191

Spring系列学习-AOP之代理模式在AOP中的运用

在Spring中,AOP(面向切面编程)通过代理模式来实现横切关注点的织入。代理模式是AOP的核心机制之一,它允许在目标对象的方法执行前、执行后或异常抛出时插入额外的逻辑,而无需修改目标对象的源代码。所谓代理模式其实就是二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不...

weixin_26963033的博客 136

Spring学习 使用注解开发,代理模式

8. 使用注解开发 说明 在spring4之后,想要使用注解形式,必须先导入aop的包 在配置文件中,还要引入一个context的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context

vv的博客 382

Spring AOP原理深度解析:代理模式、JDK动态代理与CGLIB

本文深入解析Spring AOP的实现原理与技术选型。首先介绍了AOP的核心概念与设计理念,通过对比传统OOP与AOP的代码结构,展示AOP在解耦横切关注点方面的优势。随后详细剖析了JDK动态代理与CGLIB字节码增强两种代理机制,包括实现原理、性能对比和适用场景。在Spring AOP实现部分,重点分析了拦截器链的设计和执行流程,以及不同通知类型的执行顺序。文章还提供了企业级应用场景下的实战案例,如分布式链路追踪和多数据源事务管理,并针对常见问题给出了解决方案。最后从性能优化、技术选型和未来发展趋势等维度

七夜zippoe的博客 1671

设计模式之代理模式详解和应用

目录 1 代理模式定义 2 代理模式的应用场景 3 代理模式的通用写法 4 从静态代理到动态代理 5 静态模式在业务中的应用 6 动态代理在业务中的应用 7 手写JDK动态代理实现原理 7.1 JDK动态代理的实现原理 7.2 CGLib动态代理容易踩的坑 8 CGLib代理调用API及原理分析 9 CGLib和JDK动态代理对比 10 代理模式与Spring生态 10 静态代理和动态代理的本质区别 11 代理模式的优缺点 12 Spring中的代理选择原则

赵广陆 1451
上一篇: 1.8 spring中的自动装配
下一篇: 1.10 spring中的AOP面向切面编程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值