Java:什么是静态代理?什么是动态代理?二者有何区别?

本文介绍了代理模式的概念,以及Java中的静态代理和动态代理。静态代理在编译时确定,需要为每个目标类创建对应的代理类。动态代理则分为JDK动态代理和Cglib动态代理,前者基于接口,后者基于继承,能在运行时动态生成代理类。JDK代理速度快但仅适用于接口,Cglib代理速度慢但能处理未实现接口的类。
摘要由CSDN通过智能技术生成

一、代理模式

代理模式(Proxy Pattern)是程序设计中的一种设计模式,它的特征是代理类和委托类实现有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类对象与一个委托类对象(目标对象)关联,代理类对象本身并不真正实现服务,而是通过调用委托类对象的相关方法,来提供特定的服务。

即通过代理对象访问目标对象,这样我们可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

以最近很火的贵州茅台为例子,假如我们要买1箱茅台,我们不是直接跟茅台公司买的,而是通过代理商(例如沃尔玛,京东等)进行购买。茅台公司就是一个目标对象,它只负责生产茅台,而其他如何销售,寄快递等琐碎的事交由代理商(代理对象)来处理。

二、静态代理

代理对象与目标对象一起实现相同的接口或者继承相同父类,由程序员创建或特定工具自动生成源代码,即在编译时就已经确定了接口,目标类,代理类等。在程序运行之前,代理类 的 .class 文件就已经生成。

你可以简单认为代理对象写死持有目标对象。

package com.nobody.staticproxy;

/**
 * @Description 白酒厂商
 * @Author Mr.nobody
 * @Date 2021/2/12
 * @Version 1.0
 */
public interface WhileWineCompany {
    // 生产酒 (演示才写一个方法,实际多个方法都是能被代理的)
    void product();
}
package com.nobody.staticproxy;

/**
 * @Description 委托类,贵州茅台
 * @Author Mr.nobody
 * @Date 2021/2/12
 * @Version 1.0
 */
public class Moutai implements WhileWineCompany {
    public void product() {
        System.out.println("生产贵州茅台...");
    }
}
package com.nobody.staticproxy;

/**
 * @Description 代理类,京东代理商
 * @Author Mr.nobody
 * @Date 2021/2/12
 * @Version 1.0
 */
public class JDProxy implements WhileWineCompany {

    // 被代理的贵州茅台公司
    private Moutai moutai;

    public JDProxy(Moutai moutai) {
        this.moutai = moutai;
    }

    public void product() {
        System.out.println("京东商城下订单购买");
        // 实际调用目标对象的方法
        moutai.product();
        System.out.println("京东商城发快递");
    }
}
package com.nobody.staticproxy;

/**
 * @Description
 * @Author Mr.nobody
 * @Date 2021/2/12
 * @Version 1.0
 */
public class Main {
    public static void main(String[] args) {
        // 生成代理对象,并传入被代理对象
        WhileWineCompany proxy = new JDProxy(new Moutai());
        proxy.product();
    }
}

// 输出结果
京东商城下订单购买
生产贵州茅台...
京东商城发快递

静态代理的优缺点:

  • 优点:在不修改目标对象的功能前提下,可以对目标功能扩展。
  • 缺点:假如又有一个目标类,也要做增强,则还需要新增相对应的代理类,导致我们要手动编写很多代理类。同时,一旦接口增加方法,目标对象与代理对象都要维护。

三、动态代理

代理类在程序运行时才创建的代理方式被称为动态代理。

静态代理中,代理类(JDProxy)是我们程序员定义的,在程序运行之前就已经编译完成。而动态代理中的代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。

在 Java 中,有2种动态代理实现方式,JDK动态代理和CGLIB动态代理。

Spring 中的 AOP 是依靠动态代理来实现切面编程的。

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Java中的动态代理是一种机制,它允许在运行时创建代理对象,代理对象可以在不改变原始对象的情况下,拦截并处理方法调用。动态代理通常用于实现AOP(面向切面编程)和RPC(远程过程调用)等功能。 动态代理的应用包括: 1. AOP:通过动态代理,可以在不修改原始代码的情况下,实现对方法的增强,如日志记录、性能监控等。 2. RPC:通过动态代理,可以实现远程方法调用,将方法调用转化为网络请求,从而实现分布式系统的通信。 3. 框架:许多框架都使用动态代理来实现某些功能,如Spring框架中的事务管理、MyBatis框架中的SQL映射等。 总之,动态代理Java中非常重要的一种机制,它可以帮助我们实现许多有用的功能,提高代码的可维护性和可扩展性。 ### 回答2: Java中的动态代理是一种在运行时动态创建代理对象的机制。它能够在不修改原始类代码的情况下,为它们提供额外的功能,使得原始类在不改变自身结构的情况下得以扩展功能。动态代理是基于反射机制实现的,它可以在运行时生成代理类的字节码,并在内存中创建代理对象。 动态代理在实际开发中有很多应用,例如: 1. AOP编程:动态代理是 AOP 编程的重要实现方式之一。通过动态代理实现对方法调用的拦截,可以在方法调用之前或之后执行其他附加操作,比如安全检查、事务处理等。 2. RPC框架:RPC(远程过程调用)框架基于动态代理实现。通过动态代理可以将远程服务映射到本地接口中,通过调用本地接口就可以实现远程方法的调用。这种方式使得远程方法调用像本地方法调用一样简单。 3. 单元测试:在单元测试中,可以使用动态代理模拟实现某些依赖关系,以便实现单元测试的隔离性。例如,可以通过动态代理实现对 DAO 层的 mock,使得测试代码不需要真的去访问数据库。 4. 延迟加载:使用动态代理可以实现延迟加载。当访问一个对象的某个方法时,如果这个方法对于当前对象来说非常耗时和昂贵,那么可以使用动态代理实现延迟加载,一旦访问到这个方法时再加载对象,避免了不必要的开销。 总之,动态代理是一种十分强大和灵活的机制,它可以大大提高代码的可扩展性、可维护性和可测试性,是 Java 开发中一个重要的概念。 ### 回答3: Java 中的动态代理是一种机制,它允许在运行时创建代理对象,用于代替实际对象进行一些操作,而实际对象的操作会被动态代理对象拦截并进行额外的处理。动态代理机制利用 Java 的反射机制在运行时生成代理对象,根据接口类型动态创建一个实现该接口的代理类。这个代理类拥有和被代理对象相同的方法,同时可以添加额外的逻辑,如增强某些方法的功能或者进行权限控制等操作。动态代理被广泛使用于 AOP(面向切面编程)、RPC(远程过程调用)等场景中。 动态代理可以应用在多种场景中,其中一些典型的应用如下: 1. AOP:动态代理可以在运行时为被代理的对象添加新的逻辑,从而实现 AOP 编程,比如添加事务、日志等方面的处理。在 Spring 框架就广泛使用了动态代理机制。 2. RPC:动态代理可以用来实现远程方法调用(RPC)。客户端通过远程代理对象对服务器端的服务进行调用,然后代理对象将调用的方法和参数序列化后发送给服务端,等待服务端返回处理结果。 3. 桥接模式:动态代理可以用于实现桥接模式,通过代理对象来实现接口和实现类之间的耦合。 4. 代理服务器:动态代理可以用于在服务器端代理客户端请求的代理服务器,在代理服务器中可以添加额外的逻辑,在处理客户端请求的同时还能进行额外的处理,如负载均衡等。 总之,动态代理Java 中的一种强大机制,它可以帮助我们实现许多复杂的编程任务,并通过添加逻辑来增强代码的可用性和可维护性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值