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

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

静态代理

什么是代理?

       举个栗子,生活中的外卖平台,店铺是制作外卖的,然后放到平台上售卖。这里的店铺就是真实角色,为了能够让店铺不用担心销售等问题,从而能够更加专注做外卖,所以店铺的外卖都会放到平台上面。这里平台就是代理。平台代店家出售,而店家只需要做外卖就好了。

例子2

       再比如程序中,当程序做出了一个操作的时候,应该要写一个相应的日志,代理的作用就是负责如日志相关的公共类业务,而程序本身自需要负责自身的业务就可以了,不必关心日志等公共业务的问题。

 

使用静态代理的优点:

  1. 使真实角色的业务更加简洁,没有多余的公共类业务,真实角色只负责本身的业务。
  2. 公共类业务全部由代理完成,使真实角色和代理类分工合作。
  3. 当公共类业务发生改变只需要改变代理类而不用去改变真实角色的代码。有利于程序的维护。

缺点:

  1. 每个真实角色都需要相应的代理类---类的数量变多。
  2. 编写代理类的数量多开发效率降低了。

 

编写一个静态代理

       Interface

      

public void sellRice();

       真实对象—SellRiceImpl

/*店铺类---真实对象*/

public class SellRiceImpl implements SellRice{

   public SellRiceImpl() {

      // TODO Auto-generated constructor stub

   }

   public void sellRice() {

      System.out.println("店铺出售快餐");

   }

}

代理类—MeiTuan

public class MeiTuan implements SellRice {

  

   SellRiceImpl sr=new SellRiceImpl();

  

   public void sellRice()

   {

      getNeed();

      sr.sellRice();

      shouFei();

   }

  

   public void getNeed() {

      System.out.println("接收用户订单");

   }

   public void shouFei()

   {

      System.out.println("向店铺收取提成");

   }

}

客户使用平台

public class KeHu {

   public static void main(String[] args) {

      MeiTuan mt=new MeiTuan();

      mt.sellRice();

   }

}

 

如上不更改真实对象的代码的情况下,使用代理实现了真实对象的功能,还实现了真实对象所不具备的功能。

 

 

 

动态代理

  1. 动态代理与静态代理的角色是一样的。
  2. 动态代理的代理类是动态生成的
  3. 动态代理有静态代理的好处,没有静态代理那样庞大的工作量
  4. 动态代理分为两类一类基于接口的动态代理一类基于类的动态代理
    1. 基于接口动态代理————jdk动态代理
    2. 基于类的动态代理————cglib

      

 

 

 

Jdk的动态代理 Proxy类和InvocatioHandler接口

以下是JDK API中相关的描述

  • Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

为某个接口创建代理Foo :

  InvocationHandler handler = new MyInvocationHandler(...);

     Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);

     Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).

                     newInstance(handler);

或更简单地:

  Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),

                                          new Class<?>[] { Foo.class },

                                          handler);

动态代理类 (以下简称为代理类 )是一个实现在类创建时在运行时指定的接口列表的类,具有如下所述的行为。 代理接口是由代理类实现的接口。 代理实例是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序对象,它实现了接口InvocationHandler 。 通过其代理接口之一的代理实例上的方法调用将被分派到实例调用处理程序的invoke方法,传递代理实例, java.lang.reflect.Method被调用方法的java.lang.reflect.Method对象以及包含参数的类型Object Object的数组。 调用处理程序适当地处理编码方法调用,并且返回的结果将作为方法在代理实例上调用的结果返回。

 

 

创建一个动态代理类的实例

       这里将会用到文章开头提到的例子2的情况

首先创建操作数据库的接口

      

/*数据库的增删改方法*/

public interface Database {

   public void add();

   public void delete();

   public void update();

}

 

真实对象---DatabaseImp

/*真实对象*/

public class DatabaseImp implements Database{

   @Override

   public void add() {

      System.out.println("insert into");

   }

   @Override

   public void delete() {

      System.out.println("delete");

   }

   @Override

   public void update() {

      System.out.println("update");

   }

}

Proxy动态代理类

public class ProxyinvocationHandler implements InvocationHandler {

   private Database db;

  

   public void setDb(Database db) {

      this.db = db;

   }

  

   /*

    生成代理类 */

   public Object getProxy() {

      return Proxy.newProxyInstance

            (this.getClass().getClassLoader(),

                   db.getClass().getInterfaces(), this);

   }

   /*

    * proxy是代理类

    * method是代理类的调用处理程序的方法对象

    * */

   @Override

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

      Object request=method.invoke(db, args);

      return request;

   }

}

Test—通过代理类实现真实对象的功能

public static void main(String[] args) {

      DatabaseImp dbi=new DatabaseImp();

      ProxyinvocationHandler pih=new ProxyinvocationHandler();

      pih.setDb(dbi);

      Database db=(Database)pih.getProxy();

      db.add();

      db.delete();

      db.update();

   }

运行:

动态代理实现添加日志操作

       再代理类中添加日志的方法

修改以下代码(新增和修改的地方为红色字体)

@Override

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

      Object request=method.invoke(db, args);

      log(method.getName());

      return request;

   }

  

   public void log(String methodName)

   {

      System.out.println("日志:"+new Date()+"执行"+methodName+"方法");

   }

修改动态代理类后的运行结果

      

如果使用静态代理类实现以上结果就需要在静态代理中写下每个方法

 StaticProxy

public class StaticProx implements Database{

   DatabaseImp dbi=new DatabaseImp();

   public void add() {

      dbi.add();

      System.out.println("日志:"+new Date()+"执行add方法");

   }

  

   public void delete() {

      dbi.delete();

      System.out.println("日志:"+new Date()+"执行delete方法");

   }

  

   public void update() {

      dbi.update();

      System.out.println("日志:"+new Date()+"执行update方法");

   }

}

对比上面的动态代理,静态代理工作量就显得庞大。

Spring事务五种不同的代理配置 Spring事务配置的五种方式 ,根据代理机制的不同,总结了五种Spring事务的配置方式. 立即下载

相关推荐

【数电课程设计】---出租车计价器

文章目录1、任务要求2、方案3、收获 1、任务要求 2、方案 3、收获

LZY 1万+

Spring AOP理论 +代理模式详解

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

weixin_45080272的博客 3588

abaqus热力耦合模拟教程学习笔记

学习资源:BV1je4y1a7Ku软件:abaqus2016以m为单位制。

qq_41900477的博客 2万+

spring的代理模式

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

weixin_43723296的博客 3919

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6379

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 938

Spring框架中的代理模式

代理模式

YiGeiGiaoGiao的博客 1521

【PCIe硬件】PCIe引脚PRSNT与热插拔

热插拔的基本目的是要让PCIe设备按照规定的顺序、原则,从系统中移除或插入到系统中来,并能正常的工作,且不影响系统的正常运行。事实上,PCIe“热插拔”的关键目的就是为前面面所提到的系统RAS服务的,是提升系统RAS能力的非常重要的手段!注意,这里有两个相关概念,前面我们讲的热插拔,其实是广义的“热插拔”。这里的Hot-Plug,为了方便,我们叫做PCIe热插拔,也就是我们现在及后面将要讨论的内容。

smartvxworks的博客 2783

动态代理与静态代理区别

一、代理概念  为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。  图1:代理模式    从图中可以看出,代理接口(Subject)、代理类(ProxySubject)、委托类(RealSubject)形成一个

ikownyou的博客 2万+

Vue和Vue-Element-Admin(六):集成中的CORS(跨域资源共享)问题

在vue-element-admin登录集成时候碰到跨域资源共享问题,CORS(Cross-origin resource sharing)是浏览器的技术规范,浏览器可以发起跨域请求但Javascript脚本不能,传统的ajax只能获取在同域名下的资源,但Html5允许ajax发起跨域请求,解决方案有:JSONP、Flash、IFrame、CORS。 一、CORS(跨域资源共享)问题 针对vue-element-admin的登录模块的后端接口完成后,前端调用时候出现报错,因为前端的端口是9527而后.

叶子叶来 9605

灰度图像采集显示

灰度图像采集显示 在FPGA内部,采集到的视频数据线通过一个FIFO,将原本与25MHZ时钟同步的数据流转换到FPGA内部50MHZ的时钟。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会被写入DDR3中。于此同时,使用另一异步FIFO缓存从DDR3读出的图像数据;LCD驱动模块不断地发出读图像数据请求给到这个FIFO,从中读取图像数据并送给VGA显示器进行实时图像的显示。 ...

小柚子的博客 482

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

静态代理和动态代理的区别 按照代理的创建时期,代理类可以分为两种: 静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。 动态:在程序运行时运用反射机制动态创建而成。 静态代理类优缺点 优点: 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,newUserManagerImpl()可以应用工厂将它隐藏。 缺点: 1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大

亦疏爱吃肉 3252

《派出你的AI同事:WorkBuddy案例实战》055:客服工单自动分类与话术生成

客服工单自动分类与话术生成 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 265

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

1. 静态代理与动态代理区别静态代理:需要编写批量代理类动态代理:不需要编写批量代理类2.静态代理静态代理结构如下:编写测试接口:public interface TestInteface { /** * 测试方法 */ String runNow(String param);}//end编写测试类:public class TestProxy implements TestInteface { ...

weixin_39777497的博客 156

Statistics and Machine Learning Toolbox

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

静态代理和动态代理的区别及命名原因

静态代理和动态代理是两种常用的代理模式,尽管它们的实现方式不同,但本质都是通过代理类控制对目标对象的访问。静态代理的代理类在编译期生成,比较简单易懂,但缺乏灵活性;而动态代理则是在运行时生成代理类,提供了更强的灵活性,适合于代理多个类或接口的场景。因此,它们被称为“静态”和“动态”主要取决于代理类的生成时机。静态代理在编译时生成,表现为“静态”;而动态代理在运行时生成,表现为“动态”。

weixin_54574094的博客 1031

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

码海浮生,一个乐于分享的全栈工程师! 1298

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

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

JDK静态代理、JDK动态代理、Cglib动态代理区别

一、代理模式介绍 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。说白了经纪人懂吧,整不好就绿你的那种。 二、JDK静态代理 场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理呀,然后就绿了大郎。。。 第一步:定义一种类...

Coding Farmer的博客 1481

java经典问题——静态代理和动态代理的区别

静态代理就是按照代理模式书写的代码,如《代理模式》一节中的示例,其特点是代理类和目标类在代码中是确定的,因此称为静态。静态代理可以在不修改目标对象功能的前提下,对目标功能进行扩展。 但是静态代理显然不够灵活,这时就需要动态代理。 动态代理也叫 JDK 代理或接口代理,有以下特点: 代理对象不需要实现接口 代理对象的生成是利用 JDK 的 API 动态的在内存中构建代理对象 能在代码运行时动态地改变某个对象的代理,并且能为代理对象动态地增加方法、增加行为 一般情况下,动态代理的底层不用我们亲自去实现,可以

Itmastergo的博客 1731

Spring中静态代理与动态代理的实现及区别

代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的。代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强。 一般使用代理模式我们需要先定义一个接口,静态代理只是一种简单的java代码功能扩展。而动态代理利用了反射机制,使用更简单。

weixin_43005654的博客 1988

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理模式在 Java 开发中是一种比较常见的设计模式。设计目的旨在为服务类与客户类之间插入其他功能,插入的功能对于调用者是透明的,起到伪装控制的作用。如租房的例子: 房客、中介、房东。对应于代理模式中即:客户类、代理类 、委托类 (被代理类)为某一个对象(委托类)提供一个代理 (代理类),用来控制对这个对象的访问。委托类和代理类有个共同的父类或父接口。代理类会对请求做预处理、过滤,将请求分配给指定对象。//目标对象//通过构造器传入目标对象/*** 获取代理对象* @return*/

来都来了 1136

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

代理模式的目的是在不修改原有类方法设计的基础上,对方法行为进行增强。 为了好理解,举个实际场景,我们业务场景中经常有限流的需求,常规操作是在需要限流的接口代码前加入调用次数判断的代码,但是这样每个需要限流的方法都需要加,工作量大不说,一方面不好维护,不能很清晰的知道每个接口限流值,另一方面,限流代码和业务代码堆叠在一起,也影响代码阅读。解法是做一套统一限流,一般好点的会有专门的接口限流平台,配置对应的接口名,设置限流值,直接就可以限流,实现方式就可以用动态代理。不修改原接口的实现,对接口进行增强。 动.

weixin_43831204的博客 563

静态代理和动态代理的区别是什么

​ 相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。3、动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。4、还有一种动态代理CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。2、静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。...

LiZhen314的博客 2339

Java中动态代理如何实现,以及与静态代理的区别

Java中 的动态代理, 基本是我们都会用到, 但其实感知不会那么明显, 主要的应用层面是SSM那一套比较熟悉, 例如AOP Servlter中的过滤器(MVC中的拦截器其实关系并不大,他更像是一种中间件),.mybatis中的分页插件, 或者说是我们针对分页参数的初始化操作, 事务,日志,权限,都离不开动态代理的身影子JDK动态代理片段

m0_68723562的博客 661

静态代理与动态代理区别

由于代理类在编译时就已经确定,一旦需要增加新的代理逻辑或者修改代理行为,通常需要手动修改代理类。:静态代理是在编译时就确定了代理类的实现,通常通过手动编写代理类或者由工具在编译期生成。:适用于需要根据不同的需求生成不同的代理类,或者代理的类的数量较大,且不可能在编译时知道具体的代理类的场景。静态代理需要提前确定好所有代理的类,因此比较适合代理逻辑相对简单,且代理类不需要太多变化的场景。:如果有多个接口或多个实现类需要代理,则每个接口或实现类都需要创建一个对应的代理类,可能会导致大量的代码重复。

午夜后是黎明,风雨后是骄阳 1304

动态代理和静态代理的区别:

目标对象不固定,通过反射机制在应用程序执行时动态创建目标对象,代理对象会增强目标对象的行为。①JDK动态代理是Java官方提供的工具,不需要引入其它依赖;②JDK基于接口实现动态代理,要求被代理类必须实现接口;静态代理对于代理的角色是固定的,代理类和被代理类有共同的父类 ,在。动态代理的代理类是在运行时生成,需要通过反射的机制调用代理类的方法。② 静态代理的代理类在编译时就已经存在,直接调用代理类的方法;而动态代理是在运行时动态生成代理类的代码。① 静态代理是在编译时就已经确定代理类的代码;

2301_77434036的博客 490
上一篇: Spring --Bean的自动装配
下一篇: Spring AOP学习笔记
rokento
博客等级 码龄13年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值