java基础--动态代理的定义

Java动态代理实现自定义数据源连接池 连接池是一种用于管理多个数据库连接的技术,目的是为了复用已有的数据库连接,减少频繁创建和销毁数据库连接所带来的开销。它通常由一个连接池管理器来维护和管理数据库连接,当应用程序需要访问数据库时,连接池管理器会提供一个已经建立的数据库连接,操作完成后,再将连接返回到池中,而不是关闭它。连接池不仅提高了连接的利用率,还有助于控制连接的数量,从而保证应用程序的性能稳定。在多线程环境中,合理使用连接池可以避免线程安全问题,因为连接池会保证在任何时候只有一个线程可以使用同一个数据库连接。 阅读详情

经典总结

动态代理 是 Java 中的一种技术,它让程序在运行时能够自动创建代理对象,然后通过代理对象来拦截和增强你原本的方法。

1. 怎么实现

  • JDK 动态代理:它用的是 Java 反射,所以被代理的类必须实现接口。
  • CGLIB 动态代理:它通过 字节码操作,即使类没有实现接口也能代理。

2. 主要用途

  • 增强功能:你可以在方法运行前后加点额外的操作,比如记录日志、检查权限或者管理事务。
  • 解耦设计:把一些通用功能(比如日志、权限检查)和核心业务逻辑分开,让代码更清晰、更容易维护。

3. 应用场景

  • Spring AOP:动态代理用于实现一些功能,比如记录日志和事务管理,和核心代码分开。
  • MyBatis:通过动态代理自动生成接口的实现类,省去了手动编写代码的麻烦。

详情内容

1. 动态代理的核心原理

1.1 什么是代理?

在编程中,代理模式 是一种结构型设计模式。代理对象是对目标对象的替代或包装,它可以:

  • 在调用目标对象的方法前后执行自定义逻辑。
  • 控制对目标对象的访问。

静态代理 是预先定义好的代理类,而 动态代理 则是在运行时动态生成代理类。


1.2 动态代理的两种实现
(1) JDK 动态代理
  • 实现基础:基于反射(java.lang.reflect)。
  • 核心类:
    • Proxy:动态生成代理类。
    • InvocationHandler:定义方法拦截逻辑。
  • 适用场景:被代理对象实现了接口。

示例代码:JDK 动态代理

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

// 定义一个接口
interface UserService {
    void addUser(String name);
}

// 接口的具体实现类
class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("添加用户:" + name);
    }
}

// 动态代理处理器
class LoggingHandler implements InvocationHandler {
    private Object target;

    public LoggingHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("日志:调用方法 " + method.getName());
        Object result = method.invoke(target, args); // 调用实际方法
        System.out.println("日志:方法 " + method.getName() + " 执行完毕");
        return result;
    }
}

public class JDKProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        UserService userService = new UserServiceImpl();

        // 创建代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(
            userService.getClass().getClassLoader(),
            userService.getClass().getInterfaces(),
            new LoggingHandler(userService)
        );

        // 调用代理方法
        proxy.addUser("张三");
    }
}

输出结果:

日志:调用方法 addUser
添加用户:张三
日志:方法 addUser 执行完毕
解析
  1. Proxy.newProxyInstance 动态生成代理对象。
  2. LoggingHandler 是方法拦截器,定义了在方法调用前后要执行的逻辑。

(2) CGLIB 动态代理
  • 实现基础:基于字节码操作(ASM 框架)。

  • 核心类:

    • Enhancer:生成代理类。
    • MethodInterceptor:定义方法拦截逻辑。
  • 适用场景:目标类没有实现接口。

示例代码:CGLIB 动态代理

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

// 目标类
class ProductService {
    public void addProduct(String name) {
        System.out.println("添加产品:" + name);
    }
}

// 动态代理拦截器
class CglibLoggingInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("日志:调用方法 " + method.getName());
        Object result = proxy.invokeSuper(obj, args); // 调用实际方法
        System.out.println("日志:方法 " + method.getName() + " 执行完毕");
        return result;
    }
}

public class CGLIBProxyExample {
    public static void main(String[] args) {
        // 创建代理
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ProductService.class);
        enhancer.setCallback(new CglibLoggingInterceptor());

        ProductService proxy = (ProductService) enhancer.create();
        proxy.addProduct("手机");
    }
}

输出结果:

日志:调用方法 addProduct
添加产品:手机
日志:方法 addProduct 执行完毕
解析
  1. Enhancer 动态生成目标类的子类。
  2. CglibLoggingInterceptor 实现方法的拦截逻辑。

2. JDK 动态代理与 CGLIB 动态代理的对比

对比维度JDK 动态代理CGLIB 动态代理
实现方式基于反射机制基于字节码操作
代理对象要求目标类必须实现接口目标类无需实现接口
性能性能较低,反射开销较大性能更高,但生成字节码开销略大
典型应用Spring AOP 中对接口的增强Spring AOP 中对类的增强
限制无法代理没有接口的类无法代理被 final 修饰的类或方法

3. 动态代理的实际应用场景

(1) Spring AOP

动态代理是 Spring AOP 的核心技术,用于对方法调用进行增强。通过代理对象,Spring 可以在方法执行前后执行日志记录、事务管理等逻辑。

示例:Spring 中的事务管理
@Transactional
public void processOrder() {
    // 核心业务逻辑
}

Spring 使用动态代理在方法执行前后自动开启和提交事务。


(2) MyBatis Mapper 动态代理

在 MyBatis 中,Mapper 接口的实现类是在运行时通过动态代理生成的。

示例代码
// Mapper 接口
public interface UserMapper {
    User findUserById(int id);
}

// 动态代理生成的代理类
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);

解析:

  • getMapper 方法动态生成代理类。
  • 代理类负责执行 SQL 并将结果映射为实体对象。

知识拓展

1. ASM 框架与字节码操作

CGLIB 的底层实现依赖于 ASM 框架,通过直接操作字节码生成代理类。

  • 优势:性能优于反射。
  • 缺点:实现复杂,代码难以维护。

2. 动态代理的性能优化

性能瓶颈
  • JDK 动态代理 使用反射调用方法,性能略低。
  • CGLIB 动态代理 虽然性能更高,但生成字节码有一定开销。
优化方案
  1. JDK 11+ 引入了更高效的代理实现机制。
  2. 使用 ByteBuddy 替代 CGLIB,支持更复杂的字节码操作场景。

总结

  1. 动态代理的核心:
    • 运行时生成代理类,为方法调用添加增强逻辑。
    • JDK 动态代理基于反射,适用于接口。
    • CGLIB 动态代理基于字节码生成,适用于没有接口的类。
  2. 动态代理的优势:
    • 高度灵活,可动态增强方法。
    • 广泛应用于框架(Spring、MyBatis)。
  3. 扩展建议:
    • 深入研究字节码操作(如 ASM 和 ByteBuddy)。
    • 在实际项目中,根据场景选择合适的代理技术。

通过以上总结的内容,你是不是对 Java 动态代理有了更全面的理解?

如果还有疑问,欢迎评论区进一步交流!

C语言实现惯性导航初始对准全部核心代码 惯性导航初始对准包括间接粗对准和卡尔曼滤波精对准,其中。为基于卡尔曼滤波的精对准,其中。 阅读详情

相关推荐

VS配置RTKLIB(卫星定位开源代码)环境

@RTKlib代码调试教程-Visual Studio 2019 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ##RTKLIB-rtklib_2.4.3 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @RTKlib代码调试教程-Visual Studio 2019 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技

qq_42209977的博客 4486

Java笔试面试-反射和动态代理

反射   反射机制是 Java 语言提供的一种基础功能,赋予程序在运行时自省(introspect)的能力。简单来说就是通过反射,可以在运行期间获取、检测和调用对象的属性和方法。 反射的使用场景 1.编程工具 IDEA 或 Eclipse 等,在写代码时会有代码(属性或方法名)提示,就是因为使用了反射; 2.很多知名的框架,为了让程序更优雅更简洁,也会使用到反射。 例如,Spring 可以通过配置...

HenryLei的博客 5万+

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4353

java动态代理

"代理"这个词相信大家并不陌生,简单来说就是代替厂家来售卖商品,代理替代厂家售卖商品,顾客找代理购买商品。也就是说:1)顾客和厂家之间是不可见的,顾客不知道背后的厂家是谁。2)代理可以对顾客进行“定位”,更精确的售卖给需要的客户群体。代理模式:为其他对象提供一种代理以控制对这个对象的访问,也就是创建一个代理对象作为客户端和目标对象之间的中介,主要目的就是保护目标对象或增强目标对象通过使用代理模式,通常有以下两个优点:\1) 可以隐藏被代理类的实现\2) 可以实现客户与被代理类间的解耦,在不修改被代理类代码的

qq_43460095的博客 2470

ArcGIS+PLUS+InVEST三件套:从零搞定生态系统服务模拟预测(附完整数据包)

本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建一套完整的生态系统服务模拟预测工作流。内容涵盖从统一数据预处理、PLUS模型多情景模拟,到InVEST模型量化评估的全过程,并提供了关键脚本和避坑指南,旨在帮助研究者和从业者高效解决土地利用变化与生态系统服务评估结合的实际难题。

weixin_42522857的博客 139

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

一篇文章让你彻底读懂Java动态代理

Java动态代理是什么? 动态代理是23种设计模式中代理模式中的一种设计模式,它与静态代理不同的区别在于动态代理是在运行时创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。,是AOP编程的重要实现途径之一。为什么要使用动态代理? 相信了解了动态代理是什么后我们不禁有疑问,为什么要用动态代理?他有什么优点? 比如现在有这么几个需求,你需要打印每个业务方法的日志信息,你需要有一个统一的全局异常处理,或者多个业务方法都需要进行事务操作等功能,如果我们不用动态代理来实现aop编程也有很多方式,但

m0_54557822的博客 1158

Arduino ESP32S3开发环境搭建 ------ 在线下载安装包Failed解决方案

本文介绍了Arduino ESP32 S3开发环境搭建的离线解决方案。

张一西的博客 1018

java动态代理实现与原理详细分析

关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式–代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。 一、代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象

weixin_43232662的博客 217

PMP–一、二、三模–分类–13.干系人管理

A:确认是否已制定沟通管理计划,使业务干系人认识到项目的成功之处。B:让业务干系人参加冲刺回顾会议。C:与发起人和关键干系人一起确定产品待办事项列表中的优先要务,以便交付商业利益。D:为关键干系人开展收尾调研。C。

stqer的博客 1418

【CASS精品教程】006:CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总

在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无响应,提示roadpara,如下所示: 道路设计参数文件 解决办法有三种 第一种方法:Win+R (1)64位系统:输入regsvr32 C:\Windows\SysWOW64\CellCtrl5.ocx,回车 (2)32位系统输入regsvr32 C:...

智慧空间实验室 1万+

java自定义动态代理

java自定义动态代理,代码创建->编译->载入注:如ToolProvider.getSystemJavaCompiler() 返回 null则需JAVA_HOME由java\jdk改为Java\jre,同时将jdk\lib下将tools.jar复制到jre\lib下,改了JAVA_HOME后记得把path还是改成原来的,因为JAVA_HOME变了HRProxySourceCreato...

u012681635的博客 471

前拉后推计划逻辑适用于哪些行业和企业规模?

《前拉后推计划逻辑的行业适用性分析》摘要:前拉后推计划逻辑(需求端后推锚定交付、供应端前拉匹配资源)最适用于需求波动大且具规模效益的行业,包括家具制造(定制化需求+批量运输)、机械装备(非标设备+部件采购)、消费电子(短周期产品+核心部件备货)及汽车配套(交期绑定+批量生产)等领域。该模式要求企业具备:1)独立计划部门;2)ERP/MES等信息系统;3)资源冗余能力,故更适配中型(1-10亿营收)和大型企业(10亿+)。小型企业需简化应用,仅聚焦关键环节。不适配需求稳定(如快消品)、无规模效益或短周期生产的

追随内心 144

java动态代理机制之自定义实现动态代理

     Spring的开发方式之一就是面向切面编程即AOP,AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。而AOP的原理就是java的动态代理机制。   本篇主要通过自定义一个Proxy类,来更深刻的理解动态代理的机制和原理。   每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当...

weixin_30737363的博客 224

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

利用Java 动态代理,自定义注解 读取配置文件中的属性值

Java动态代理在一些中间件中经常用到,或者一些大型项目中都会用到。 这里顺带使用一下自定义注解方式,基于java 反射机制读取.properties格式文件。 demo的大致内容包含以下: 1.配置文件:config.properties url=http://www.hrsstd.com password= root username= zhanghuilong port = 8080 is...

Java_HuiLong的博客 4600

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

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

java高级:自定义注解,反射和动态代理

注解(Annotation)是 Java 5 引入的一种元数据机制,允许开发者为类、方法、字段等代码元素添加信息。编译器和运行时工具可以读取这些信息以执行特定逻辑。@Override​@Override​ 是一个标准注解,用于提示编译器该方法是重写父类方法。通过自定义注解,我们可以为代码元素打上业务相关的标签,并结合反射机制,在运行时解析注解内容,从而实现配置驱动或声明式编程。这在日志打印、权限控制、参数校验、事务处理等场景中尤为常见。​​:指定注解在运行时可被 JVM 读取。​。

snowfoootball的博客 797

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java 动态代理以及自定义注解

java 动态代理以及自定义注解

我的博客 697

java 动态代理及自定义标注使用例子

java中动态代理,在实际应用中有着很大的作用,譬如在一些类似的操作之前进行某种逻辑处理,或者在操作之后进行记录操作日志  用java的代理给类似的操作抽象出相同的代理部分,不同的信息用注解之类的统一模板,会给应用带来很大方便。如下例中用注解来控制是否允许删除的小例子。 自定义注解@Scope package my.service; import java.lang.annotation...

ilyon 144

JAVA 自定义动态代理实现

在正式介绍自定义动态代理之前,先提出以下几个问题: 1、为什么叫做动态代理,它得动态表现在哪些方面? 2、动态代理得声明,才是我们写代码得地方,实现了 invocationHandler接口的类叫做声明? 3、声明类中的invoke方法到底是谁用的 ? 4、动态代理类$Proxy0还原? 5、JDK内存中的动态代理是没有对被代理类进行任何操作的? 下

肖的专栏 1268

自定义实现Java动态代理

转自:https://www.cnblogs.com/rjzheng/p/8750265.html 一 借助JDK的API实现: 1.先创建一个接口,并实现它 public interface Person { void eat(); } public class PersonImpl implements Person { @Override public v...

weixin_30501857的博客 115

java 练习 反射入门 自定义注解 动态代理

java 练习 反射入门 自定义注解 动态代理

xswxswds的博客 314

Java 动态代理详解:定义、实现与应用场景

上个月接到一个需求:给公司所有的数据库操作加上日志记录,但不能改动现有的 DAO 层代码。我当时就懵了,这不是要我"空手套白狼"吗?直到老同事神秘一笑:“试试动态代理吧,保证让你体验一把’狸猫换太子’的快感。想象一下,你是个大明星,但又不想亲自出席每个商业活动。长得像你(实现相同接口)会模仿你的行为(调用真实方法)还能做一些你不想做的事(添加额外功能)Java 动态代理就是这样的"替身演员",它能在运行时动态创建一个代理对象,替你干活的同时还能偷偷加点料。

2501_92441786的博客 994

自定义注解和动态代理

自定义注解和动态代理 2.自定义注解的使用 注解类 @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface StringDT { String value() default "defa"; } 测试

qq_43517448的博客 583

java中的静态代理与两种动态代理的定义与区别

1.代理模式 代理(Proxy)是java设计模式中的其中一种,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象. 这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 1.1.静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 2.动态代理 2.1动态代理(方法一) 动态代理有以下特点: 1.代理对象,不需要实现接口 2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代

Hambur_的博客 317

Java动态代理与静态代理的定义与区别??

JAVA的静态代理与动态代理比较 一、概念 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的创建时期,

我爱大海V5的专栏 905

动态代理(代码篇)

文章目录前言一、SSA二、GTTP1.静态代理函数式接口定义:3.LocalDateTime API总结 前言 万丈高楼平地起,-- 基础篇。 一、SSA 之前写过这个知识点 ,现在补充一些。Talk is Cheap,。 二、GTTP 1.静态代理 函数式接口定义: 先看下笔者的代码。 代码的大概意思就是: 钢铁侠代理了蜘蛛侠,两人一起打怪兽。 当然,这个是静态代理,是在有接口的前提下。 其中的问题显而易见,SpiderMan不能每次都要叫唐尼代理他,他必须自己能搞定,所以他后面继承高科

hero_is_me的博客 414
上一篇: java基础--序列化与反序列化的概念是什么?
下一篇: java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法
半鸭学长
博客等级 码龄5年 131粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值