Spring AOP的底层实现技术 Proxy InvocationHandler

JDK与CGLIB动态代理原理及底层实现深度解析 动态代理作为Java反射机制与设计模式结合的典范,广泛应用于AOP编程、事务管理、日志记录、权限控制等场景。其核心思想是在运行时动态生成代理对象,从而在不修改目标类源码的前提下,实现对方法调用的拦截与增强。相较于静态代理,动态代理具有更高的灵活性和扩展性,支持运行时织入逻辑,有效实现关注点分离。典型应用如Spring的声明式事务管理,通过动态代理在方法执行前后自动开启和提交事务;MyBatis则利用JDK动态代理将Mapper接口转化为可执行的SQL操作实例。 阅读详情

AOP概述

软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然、更强大的方式描述软件。AOP是软件开发思想的一个飞跃,AOP的引入将有效弥补OOP的不足,OOP和AOP分别从纵向和横向对软件进行抽象,有效地消除重复性的代码,使代码以更优雅的更有效的方式进行逻辑表达。

AOP有三种植入切面的方法:其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。

Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

基于JDK的代理和基于CGLib的代理是Spring AOP的核心实现技术,认识这两代理技术,有助于探究Spring AOP的实现机理。只要你愿意,你甚至可以抛开Spring,提供自己的AOP实现。

带有横切逻辑的实例
    
首先,我们来看一个无法通过OOP进行抽象的重复代码逻辑,它们就是AOP改造的主要对象。下面,我们通过一个业务方法性能监视的实例了解横切逻辑。业务方法性能监视,在每一个业务方法调用之前开始监视,业务方法结束后结束监视并给出性能报告:

代码清单 2 ForumService:包含性能监视横切代码

package com.baobaotao.proxy; public class ForumServiceImpl implements ForumService ...{

 public void removeTopic(int topicId) ...{           //开始性能监视   PerformanceMonitor.begin("com.baobaotao.proxy.ForumServiceImpl.removeTopic");   System.out.println("模拟删除Topic记录:"+topicId);   try ...{    Thread.currentThread().sleep(20);   } catch (Exception e) ...{    throw new RuntimeException(e);   }   //结束监视、并给出性能报告信息   PerformanceMonitor.end();  }

 public void removeForum(int forumId) ...{   //开始性能监视 PerformanceMonitor.begin("com.baobaotao.proxy.ForumServiceImpl.removeForum");   System.out.println("模拟删除Forum记录:"+forumId);   try ...{    Thread.currentThread().sleep(40);   } catch (Exception e) ...{    throw new RuntimeException(e);   }          //结束监视、并给出性能报告信息   PerformanceMonitor.end();  } }

代码清单 2中粗体表示的代码就是具有横切特征的代码,需要进行性能监视的每个业务方法的前后都需要添加类似的性能监视语句。
    
我们保证实例的完整性,我们提供了一个非常简单的性能监视实现类,如所示代码清单 3所示:

代码清单 3 PerformanceMonitor

package com.baobaotao.proxy;

public class PerformanceMonitor {   //通过一个ThreadLocal保存线程相关的性能监视信息  private static ThreadLocal<MethodPerformace> performaceRecord = new ThreadLocal<MethodPerformace>();  public static void begin(String method) {   System.out.println("begin monitor...");   MethodPerformace mp = new MethodPerformace(method);   performaceRecord.set(mp);  }  public static void end() {   System.out.println("end monitor...");   MethodPerformace mp = performaceRecord.get();   mp.printPerformace(); //打印出业务方法性能监视的信息  } }

PerformanceMonitor提供了两个方法,begin(String method)方法开始对某个业务类方法的监视,method为业务方法的签名,而end()方法结束对业务方法的监视,并给出性能监视的信息。由于每一个业务方法都必须单独记录性能监视数据,所以我们使用了ThreadLocal,ThreadLocal是削除非线程安全状态的不二法宝。ThreadLocal中的元素为方法性能记录对象MethodPerformace,它的代码如下所示:

代码清单 4 MethodPerformace

package com.baobaotao.proxy; public class MethodPerformace {  private long begin;  private long end;  private String serviceMethod;     public MethodPerformace(String serviceMethod){        this.serviceMethod = serviceMethod;        this.begin = System.currentTimeMillis();//记录方法调用开始时的系统时间     }     public void printPerformace(){         //以下两行程序得到方法调用后的系统时间,并计算出方法执行花费时间         end = System.currentTimeMillis();         long elapse = end - begin;         //报告业务方法执行时间         System.out.println(serviceMethod+"花费"+elapse+"毫秒。");     } }

#p#

通过下面代码测试这个拥有方法性能监视能力的业务方法:

package com.baobaotao.proxy; public class TestForumService {  public static void main(String[] args) {         ForumService forumService = new ForumServiceImpl();         forumService .removeForum(10);     forumService .removeTopic(1012);  } }

我们得到以下的输出信息:

begin monitor... 模拟删除Forum记录:10 end monitor... com.baobaotao.proxy.ForumServiceImpl.removeForum花费47毫秒。

begin monitor... 模拟删除Topic记录:1012 end monitor... com.baobaotao.proxy.ForumServiceImpl.removeTopic花费16毫秒。

如实例所示,要对业务类进行性能监视,就必须在每个业务类方法的前后两处添加上重复性的开启性能监视和结束性能监视的代码。这些非业务逻辑的性能监视代码破坏了作为业务类ForumServiceImpl的纯粹性。下面,我们分别JDK动态代理和CGLib动态代理技术,将业务方法中开启和结束性能监视的这些横切代码从业务类中完成移除。

JDK动态代理
    
在JDK 1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例。在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在我们终于发现动态代理是实现AOP的绝好底层技术。
    
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
   
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。这样讲一定很抽象,我们马上着手动用Proxy和InvocationHandler这两个魔法戒对上一节中的性能监视代码进行AOP式的改造。
    
首先,我们从业务类ForumServiceImpl 中删除性能监视的横切代码,使ForumServiceImpl只负责具体的业务逻辑,如所示:

代码清单 5 ForumServiceImpl:移除性能监视横切代码

package com.baobaotao.proxy; public class ForumServiceImpl implements ForumService {  public void removeTopic(int topicId) {          ①   System.out.println("模拟删除Topic记录:"+topicId);   try {    Thread.currentThread().sleep(20);   } catch (Exception e) {    throw new RuntimeException(e);   }    ②  }  public void removeForum(int forumId) {          ①   System.out.println("模拟删除Forum记录:"+forumId);   try {    Thread.currentThread().sleep(40);   } catch (Exception e) {    throw new RuntimeException(e);   }          ②  } }

在代码清单 5中的①和②处,原来的性能监视代码被移除了,我们只保留了真正的业务逻辑。
    
从业务类中移除的横切代码当然还得找到一个寄居之所,InvocationHandler就是横切代码的家园乐土,我们将性能监视的代码安置在PerformaceHandler中,如代码清单 6所示:

代码清单 6 PerformaceHandler

package com.baobaotao.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;

public class PerformaceHandler implements InvocationHandler {     private Object target;  public PerformaceHandler(Object target){//①target为目标的业务类   this.target = target;  }  public Object invoke(Object proxy, Method method, Object[] args)    throws Throwable {   PerformanceMonitor.begin(target.getClass().getName()+"."+ method.getName());   Object obj = method.invoke(target, args);//②通过反射方法调用目标业务类的业务方法   PerformanceMonitor.end();   return obj;  } }

粗体部分的代码为性能监视的横切代码,我们发现,横切代码只出现一次,而不是原来那样星洒各处。大家注意②处的method.invoke(),该语句通过反射的机制调用目标对象的方法,这样InvocationHandler的invoke(Object proxy, Method method, Object[] args)方法就将横切代码和目标业务类代码编织到一起了,所以我们可以将InvocationHandler看成是业务逻辑和横切逻辑的编织器。下面,我们对这段代码做进一步的说明。

#p#

首先,我们实现InvocationHandler接口,该接口定义了一个 invoke(Object proxy, Method method, Object[] args)的方法,proxy是代理实例,一般不会用到;method是代理实例上的方法,通过它可以发起对目标类的反射调用;args是通过代理类传入的方法参数,在反射调用时使用。
    
此外,我们在构造函数里通过target传入真实的目标对象,如①处所示,在接口方法invoke(Object proxy, Method method, Object[] args)里,将目标类实例传给method.invoke()方法,通过反射调用目标类方法,如②所示。
    
下面,我们通过Proxy结合PerformaceHandler创建ForumService接口的代理实例,如代码清单 7所示:

代码清单 7 TestForumService:创建代理实例

package com.baobaotao.proxy; import java.lang.reflect.Proxy; public class TestForumService {  public static void main(String[] args) {   ForumService target = new ForumServiceImpl();//①目标业务类 //② 将目标业务类和横切代码编织到一起   PerformaceHandler handler = new PerformaceHandler(target);          //③为编织了目标业务类逻辑和性能监视横切逻辑的handler创建代理类   ForumService proxy = (ForumService) Proxy.newProxyInstance( target.getClass().getClassLoader(),     target.getClass().getInterfaces(),  handler);          //④ 操作代理实例   proxy.removeForum(10);   proxy.removeTopic(1012);  } }

上面的代码完成了业务类代码和横切代码编织和接口代理实例生成的工作,其中在②处,我们将ForumService实例编织为一个包含性能监视逻辑的PerformaceHandler实例,然后在③处,通过Proxy的静态方法newProxyInstance()为融合了业务类逻辑和性能监视逻辑的handler创建一个ForumService接口的代理实例,该方法的第一个入参为类加载器,第二个入参为创建的代理实例所要实现的一组接口,第三个参数是整合了业务逻辑和横切逻辑的编织器对象。

按照③处的设置方式,这个代理实例就实现了目标业务类的所有接口,也即ForumServiceImpl的ForumService接口。这样,我们就可以按照调用ForumService接口的实例相同的方式调用代理实例,如④所示。运行以上的代码,输出以下的信息:

begin monitor... 模拟删除Forum记录:10 end monitor... com.baobaotao.proxy.ForumServiceImpl.removeForum花费47毫秒。

begin monitor... 模拟删除Topic记录:1012 end monitor... com.baobaotao.proxy.ForumServiceImpl.removeTopic花费26毫秒。

我们发现,程序的运行效果和直接在业务类中编写性能监视逻辑的效果一致,但是在这里,原来分散的横切逻辑代码已经被我们抽取到PerformaceHandler中。当其它业务类(如UserService、SystemService等)的业务方法也需要使用性能监视时,我们只要按照以上的方式,分别为它们创建代理对象就可以了。下面,我们用时序图描述调用关系,进一步代理实例的本质,如图1所示:


 
图1:代理实例的时序图
    
我们在上图中特别使用虚线阴影的方式对通过代理器创建的ForumService实例进行凸显,该实例内部利用PerformaceHandler整合横切逻辑和业务逻辑。调用者调用代理对象的的removeForum()和removeTopic()方法时,上图的内部调用时序清晰地告诉了我们实际上所发生的一切。

CGLib动态代理
   
使用JDK创建代理有一个限制,即它只能为接口创建代理,这一点我们从Proxy的接口方法newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)就看得很清楚,第三个入参interfaces就是为代理实例指定的实现接口。虽然,面向接口的编程被很多很有影响力人(包括Rod Johnson)的推崇,但在实际开发中,开发者也遇到了很多困惑:难道对一个简单业务表的操作真的需要创建5个类(领域对象类、Dao接口,Dao实现类,Service接口和Service实现类)吗?对于这一问题,我们还是留待大家进一步讨论。现在的问题是:对于没有通过接口定义业务方法的类,如何动态创建代理实例呢?JDK的代理技术显然已经黔驴技穷,CGLib作为一个替代者,填补了这个空缺。你可以从http://cglib.sourceforge.net/获取CGLib的类包,也可以直接从Spring的关联类库lib/cglib中获取类包。

#p#
   
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并在拦截方法相应地织入横切逻辑。下面,我们采用CGLib技术,编写一个可以为任何类创建织入性能监视横切逻辑的代理对象的代理器,如代码清单 8所示:

代码清单 8 CglibProxy

package com.baobaotao.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {  private Enhancer enhancer = new Enhancer();  public Object getProxy(Class clazz) {   enhancer.setSuperclass(clazz); ① 设置需要创建子类的类   enhancer.setCallback(this);   return enhancer.create(); ②通过字节码技术动态创建子类实例  }  public Object intercept(Object obj, Method method, Object[] args,    MethodProxy proxy) throws Throwable {   PerformanceMonitor.begin(obj.getClass().getName()+"."+method.getName());   Object result=proxy.invokeSuper(obj, args); ③ 通过代理类调用父类中的方法   PerformanceMonitor.end();   return result;  } }

在上面代码中,你可以通过getProxy(Class clazz)为一个类创建动态代理对象,该代理对象是指定类clazz的子类。在这个代理对象中,我们织入性能监视的横切逻辑(粗体部分)。intercept(Object obj, Method method, Object[] args,MethodProxy proxy)是CGLib定义的Inerceptor接口的方法,obj表示父类的实例,method为父类方法的反射对象,args为方法的动态入参,而proxy为代理类实例。
    
下面,我们通过CglibProxy为ForumServiceImpl类创建代理对象,并测试代理对象的方法,如代码清单 9所示:

代码清单 9 TestForumService:测试Cglib创建的代理类

package com.baobaotao.proxy; import java.lang.reflect.Proxy; public class TestForumService {  public static void main(String[] args) {    CglibProxy proxy = new CglibProxy();    ForumServiceImpl forumService = //① 通过动态生成子类的方式创建代理对象 (ForumServiceImpl )proxy.getProxy(ForumServiceImpl.class);    forumService.removeForum(10);    forumService.removeTopic(1023);  } }

在①中,我们通过CglibProxy为ForumServiceImpl动态创建了一个织入性能监视逻辑的代理对象,并调用了代理对象的业务方法。运行上面的代码,输入以下的信息:

begin monitor... 模拟删除Forum记录:10 end monitor... com.baobaotao.proxy.ForumServiceImpl$$EnhancerByCGLIB$$2a9199c0.removeForum花费47毫秒。 begin monitor... 模拟删除Topic记录:1023 end monitor... com.baobaotao.proxy.ForumServiceImpl$$EnhancerByCGLIB$$2a9199c0.removeTopic花费16毫秒。

观察以上的输出,除了发现两个业务方法中都织入了性能监控的逻辑外,我们还发现代理类的名字是com.baobaotao.proxy.ForumServiceImpl

EnhancerByCGLIB
2a9199c0,这个特殊的类就是CGLib为ForumServiceImpl所动态创建的子类。

小结
      
Spring AOP在底层就是利用JDK动态代理或CGLib动态代理技术为目标Bean织入横切逻辑。在这里,我们对以上两节动态创建代理对象做一个小结。

在PerformaceHandler和CglibProxy中,有三点值得注意的地方是:第一,目标类的所有方法都被添加了性能监视横切的代码,而有时,这并不是我们所期望的,我们可能只希望对业务类中的某些方法织入横切代码;第二,我们手工指定了织入横切代码的织入点,即在目标类业务方法的开始和结束前调用;第三,我们手工编写横切代码。以上三个问题,在AOP中占用重要的地位,因为Spring AOP的主要工作就是围绕以上三点展开:Spring AOP通过Pointcut(切点)指定在哪些类的哪些方法上施加横切逻辑,通过Advice(增强)描述横切逻辑和方法的具体织入点(方法前、方法后、方法的两端等),此外,Spring还通过Advisor(切面)组合Pointcut和Advice。有了Advisor的信息,Spring就可以利用JDK或CGLib的动态代理技术为目标Bean创建织入切面的代理对象了。

JDK动态代理所创建的代理对象,在JDK 1.3下,性能强差人意。虽然在高版本的JDK中,动态代理对象的性能得到了很大的提高,但是有研究表明,CGLib所创建的动态代理对象的性能依旧比JDK的所创建的代理对象的性能高不少(大概10倍)。而CGLib在创建代理对象时性能却比JDK动态代理慢很多(大概8倍),所以对于singleton的代理对象或者具有实例池的代理,因为不需要频繁创建代理对象,所以比较适合用CGLib动态代理技术,反之适合用JDK动态代理技术。此外,由于CGLib采用生成子类的技术创建代理对象,所以不能对目标类中的final方法进行代理。

RNA 8. SCI文章中差异基因表达--热图 (heatmap) 进阶:从数据标准化到多维度注释 本文深入探讨了RNA差异基因表达分析中热图(heatmap)的进阶应用,从数据标准化到多维度注释。详细介绍了FPKM标准化、Z-score转换等关键技术,以及pheatmap包的高级注释功能,帮助研究者制作发表级热图。文章还提供了视觉优化策略和生物学意义衔接的实用建议,助力SCI论文的数据可视化。 阅读详情

相关推荐

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

Spring AOP的底层实现技术

软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然、更强大的方式描述软件。AOP是软件开发思想的一个飞跃,AOP的引入将有效弥补OOP的不足,OOP和AOP分别从纵向和横向对软件进行抽象,有效地消除重复性的代码,使代码以更优雅的更有效的方进行逻辑表达。 AOP有三种织入切面的方法:其一是编译期织入,这要求使用特殊...

topcong的专栏 308

手把手教你用STM32CubeMX配置WS2812的PWM+DMA驱动(附完整代码)

本文详细介绍了如何使用STM32CubeMX配置PWM+DMA驱动WS2812全彩灯带,包括硬件选型、STM32F103C8T6的时钟配置、定时器与PWM设置、DMA传输优化等关键步骤,并提供了完整的代码实现和常见问题解决方案,帮助开发者高效控制WS2812灯带。

weixin_30859423的博客 440

Spring AOP 实例解析(InvocationHandler 的invoke的proxy 参数作用)

InvocationHandler 的invoke的proxy 参数作用

立身以力学为先,力学以读书为本。 —郑耕老《劝学》 753

Apache Hop环境搭建实战:从零到一的下载、安装与配置指南

本文详细介绍了Apache Hop环境搭建的全过程,包括下载、安装与配置指南。从选择正确的JDK17版本到设置关键环境变量,再到启动GUI界面和解决常见问题,提供了全面的实战指导。适合数据工程师和ETL开发者快速上手这一强大的数据集成工具。

weixin_42634811的博客 573

Ollama内网离线部署大模型实战:从模型文件到私有化服务

本文详细介绍了如何在内网离线环境下,利用Ollama部署私有化大模型服务。内容涵盖从获取GGUF格式模型文件、手动安装Ollama、编写核心Modelfile配置文件,到创建运行模型、性能调优及安全加固的全流程实战指南,旨在帮助企业安全、可控地构建内部AI能力。

weixin_29209805的博客 214

初识spring(二)AOP

Before("execution(* personal.october.annotation.CalculatorImpl.*(..))")表示任意修饰符,返回类型,在personal.october.annotation包下的CalculatorImpl类中的所有方法,任意返回值类型,当然如果由需求在所有类中,则可以将类名换成*,变成@Before("execution(* personal.october.annotation.*.*(..))")一个事务与其他事务隔离的程度称为隔离级别。

weixin_66196728的博客 836

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 284

spring面向AOP之动态代理

动态代理中有两个重要的接口,一个是InvocationHandle,另一个是Proxy。 分别来说明这两个接口的作用吧! InvocationHandle接口‘ java.lang.reflect.InvocationHandler InvocationHandler 是代理实例的调用处理程序 实现的接口。每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进...

dreamzuora的博客 621

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 229

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 274

Spring AOP底层实现

1、什么是AOP? aop就是指 将和业务逻辑无关的代码相隔离开来,可以在不需要修改源代码的情况下,通过切面对业务逻辑进行增强,降低代码的耦合性,提高代码的可重用性。 2、Spring AOP是 底层是如何实现的? Aop底层使用动态代理实现 (1)有两种情况动态代理 第一种:有接口情况,使用jdk动态代理 创建接口实现类的代理对象,增强类的方法 第二种:没有接口情况,使用cglib动态代理 创建子类的代理对象,增强类中的方法。 3、什么是IOC? 控制反转。把对象创建和对象

qq_45932382的博客 997

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

彻底吃透JDK动态代理:手写模拟底层+源码解析,搞懂invoke方法与proxy参数

本文深入解析了JDK动态代理的实现原理,通过手写模拟代理类$Proxy0的方式揭示其核心机制。主要内容包括:1)动态代理必须基于接口实现,定义了Star接口和BigStar被代理类;2)关键揭示了代理类将所有方法调用都转发给InvocationHandler的invoke()方法,并将代理对象自身作为第一个参数传入;3)通过自定义InvocationHandler实现代理逻辑,其中proxy参数即为代理对象本身。文章通过代码示例和原理分析,完整展现了JDK动态代理的工作流程和底层设计思想。

weixin_68315058的博客 539

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

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

深入理解:动态代理的底层原理(即,深入理解:Spring框架中的面向切面编程(AOP))

一·代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 二·为什么需要动态代理: 从作用上来说,使用静态代理也可以完成,在不改变源码的情况下,对已有的方法,进行增强(运行期增强)功能的代理作用。但是静态代理特征是,代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。最好可以通过一个代理类完成全部的代理功能。

weixin_48033662的博客 1225

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring AOP 实现原理

首先先写一个接口。java// 定义接口类 UserService同上写一个接口。java// 定义接口类 UserServiceCGLIB 其实不强依赖接口。java// 不需要接口哦。

stone_tmp的博客 391

AOP代理

在Spring中使用了两种AOP动态代理 JDK动态代理 一种是通过使用叫java的动态代理(dynamic proxies),这种代理只能为接口创建代理实例,而且可以代理任何的接口类; Java的动态代理是采用JDK的动态代理机制实现的,JDK动态代理主要涉及两个类。 ①Java.lang.reflect.Proxy ②Java.lang.reflect.InvocationHan...

Sokona的博客 167

Spring:代理模式之静态代理&动态代理

Spring学习之静态代理和动态代理

每天一小步,进步一大截 823

Spring第15篇:代理详解(Java动态代理&cglib代理)

本文内容 为什么需要用代理 jdk动态代理玩法详解 cglib代理常见的各种玩法详解 代理spring中用到的挺多的,比如上篇文章中的lookup-method和replaced-method,以及后面我们要学的aop、spring中的事务、spring中解析@configuration注解等等,这些都是依靠代理来实现的,所以我们先把代理拿出来讲讲,有利于我们理解其他内容。 为什么要用代理 我们先来看一个案例。 有一个接口IService,如下: package.

chenzoff的专栏 481

28_Java动态代理详解

*动态代理(Dynamic Proxy)**是Java中一种在运行时动态创建代理对象的技术,它是AOP(面向切面编程)的核心实现机制。Spring AOP、MyBatis Mapper接口实现、RPC框架的远程调用等,背后都离不开动态代理的支持。动态代理技术将前面学过的"反射"推向了实用化的高峰。如果说反射是"在运行时访问类的能力",动态代理就是"在运行时创建新类的能力"——它结合了反射和时间代理模式,让你可以在不修改原始类的前提下,为其所有方法统一添加日志、事务、权限等横切逻辑。

yuhou25的博客 163

11.Spring中的代理模式

传递的参数有代理对象本身,通过反射获取到的method对象,还有对应的方法参数(这个参数就是在你代码中代理对象调用方法时传递的参数),传递到自己定义代理类的invoke方法中最后在是实现的invoke方法中。

weixin_62599348的博客 343

Java 动态代理深度解析:从“为什么“到“底层原理“

Java动态代理核心解析 本文深入剖析Java动态代理技术,从MyBatis等框架的实际应用场景出发,揭示其底层实现原理。主要内容包括: 问题背景:分析MyBatis中仅定义接口却能直接调用的现象,对比传统手动实现类的繁琐 解决方案:动态代理如何通过运行时自动生成实现类,消除重复编码 核心机制: 反射技术:Method对象提供方法元信息,实现通用调用逻辑 类加载器:动态生成代理类的字节码并加载 代理模式:InvocationHandler接口定义统一处理方法 底层原理:详细解析JDK动态代理生成的$Prox

qq_61875563的博客 549

JDK动态代理

jdk动态代理

weixin_42044885的博客 168

Java反射机制源码剖析:动态代理与类加载器的底层实现逻辑

Java 应用启动优化 类加载顺序调整与预热策略

J259860_的博客 458

基于jdk的动态代理方式实现面向切面编程

基于jdk的动态代理方式实现面向切面编程 相信大家在学习java编程的过程中对aop这个名字并不陌生也多少会对它有所了解,但是要说到他的底层原理的实现可能还是会一知半解。我在这里就把我所了解一些来给大家分享一下。 aop的大概原理就是向目标对象的方法中动态的追加一些代码逻辑,这样当通过代理类再次调用该方法时便是在调用已经改变了的原方法及aop代理的方法。 spring的aop底层主要是由以下两种代...

回首世界的博客 606
上一篇: Spring aop利用jdk的InvocationHandler产生动态代理
下一篇: 做个男人,做个成熟的男人,做个有城府的男人
鹿晗的晗
博客等级 码龄16年 22粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值