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方法进行代理。

AOP 动态代理(Proxy invocationHandler) AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍 立即下载

相关推荐

微腔光频梳仿真入门:MATLAB求解LLE方程全流程解析

光学频率梳在精密测量、光通信和微波光子学中有着广阔应用,而微环谐振腔中的Kerr非线性与四波混频效应能够紧凑地产生宽带梳齿。仿真这类系统的核心是求解Lugiato-Lefever方程(LLE),但直接从物理参数到数值代码往往让初学者无从下手。本文从微腔光频梳的物理图像出发,介绍LLE方程的推导与归一化方法,并重点讲解MATLAB数值实现的两种思路:基于ode45的频域耦合方程组求解与分裂步长RK4IP方法。同时讨论失谐扫描、孤子态识别、参数稳定性边界,以及如何将真实器件参数换算为无量纲仿真参数。无论你是刚接

weixin_32325225的博客 293

Spring AOP的底层实现技术

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

topcong的专栏 308

IOS APP上架被拒 4.3(a) - Design - Spam,成功

成功解决IOS APP上架被拒 4.3(a) - Design - Spam,本篇博客记录了详细过程

qq_40147106的博客 6905

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

InvocationHandler 的invoke的proxy 参数作用

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

Python实战:如何用高德API批量获取POI数据(附完整代码)

本文详细介绍了如何使用Python通过高德API批量获取POI数据,包括API基础准备、核心功能模块设计、高级功能实现及实战应用案例。文章提供了完整代码示例,帮助开发者高效解决商业网点分析、公共设施规划等实际项目中的数据采集需求。

stem5的博客 321

visual studio 2017编译Triangle库遇到的问题和解决办法

这段时间因为一个项目需要使用到Triangle这个三角剖分工具,需要在windows环境下进行对源码编译,中间踩了很多坑,特此记录下。 1、下载 下载链接是下边这个,需要翻墙 http://www.cs.cmu.edu/~quake/triangle.html 2、编译。。超。。。级。。。麻。。。烦。。。 在ubutu下安装一切顺利,完全没遇到什么麻烦,但是换到windows下就麻烦不断...

csubai07的博客 2438

初识spring(二)AOP

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

weixin_66196728的博客 836

ESP8266+Mixly+MIXIO物联网实战:用色盘控制WS2812 RGB灯(附完整代码)

本文详细介绍了如何利用ESP8266微控制器、Mixly图形化编程工具与MIXIO物联网平台,快速构建一个可通过网页色盘远程控制WS2812 RGB智能灯带的实战项目。内容涵盖硬件接线、平台配置、代码编写与调试全流程,旨在帮助物联网爱好者与初学者轻松实现创意灯光应用,掌握智能硬件开发的核心技能。

gin88的博客 261

spring面向AOP之动态代理

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

dreamzuora的博客 621

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

基于Java的高校学生信息管理系统的设计与实现(论文+源码)

可以对本系统的数据进行良好的封装,Java可以对不想被访问的数据进行良好的隐藏,具备平台无关性,可移植,更加可靠与安全,具备多线程支持,进行网络交互更容易。它支持本系统的B/S模式。开发效益方面,本系统一旦开发成功并且面向社会,就会让大多数的学生教师体会到便利办公的乐趣,随之促进提高本系统的使用率和经济利润,所以在经济方面,对于零成本开发且高利润的学生管理系统是可行的。学生可以在学生端进行选课,查看自己的成绩,教师可以在教师端查看所任课程的选课情况,对学生成绩进行录入,对所任的课程进行结课等操作。

2402_82389843的博客 1092

Spring AOP底层实现

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

qq_45932382的博客 997

基于深度学习YOLOv8的商品识别系统(深度学习 + UI界面 + 训练数据集 + Python代码)

如果使用自定义数据集,可以通过图像标注工具如LabelImg来标注每个商品的类别和边界框,并保存为YOLO格式的文本文件。bash复制编辑/dataset/images/train/val/labels/train/val这样,我们就准备好了数据集,可以开始训练YOLOv8模型。本文介绍了如何使用YOLOv8构建一个商品识别系统,包括从数据准备到模型训练,再到UI界面的开发。通过深度学习技术,尤其是YOLOv8的高效目标检测能力,我们能够快速实现商品识别并集成到实际应用中。

YOLO 302

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

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

weixin_68315058的博客 540

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

weixin_48033662的博客 1225

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值