Spring spring

Spring中文网站 > Spring Boot > Spring AOP是动态代理还是静态代理 Spring AOP的实现方式是什么
Spring AOP是动态代理还是静态代理 Spring AOP的实现方式是什么
发布时间:2026/08/20 11:23:25

品牌型号:联想ThinkPad X1

系统:Windows10家庭版

软件版本:Spring 5.3.7

代理这个概念在Java里出现得很早,还记得我们在学设计模式的时候就有专门一章讲代理模式。它的思路是不直接操作目标对象,而是通过一个中间角色去间接访问,顺带在中间做一些额外处理。Spring框架里大量用到了这套机制,AOP背后基本都离不开代理。但具体到Spring AOP,它用的到底是静态代理还是动态代理、具体怎么实现的,估计不少人没有研究过,下面给大家介绍一下Spring AOP是动态代理还是静态代理,Spring AOP的实现方式是什么的相关内容。

一、Spring AOP是动态代理还是静态代理

先给部分新手朋友科普下这两种代理方式:静态代理是在编译阶段就确定下来的代理方式。我们需要手动去写一个代理类,这个代理类实现跟目标类相同的接口,内部持有目标对象的引用,在调用目标方法前后插入额外逻辑,目标类有多少个,那我们就得写多少个对应的代理类,所以如果接口里方法或者我们要代理的类很多,维护成本就很高了。

静态代理类
图1:静态代理类

动态代理中代理类不是我们手写出来的,是程序运行时通过反射或者字节码技术,在内存里临时生成出来的,我们不需要为每个目标类单独写一个代理类,只需要写好通用的处理逻辑,代理对象会在运行时动态创建,调用哪个方法、怎么处理,都是运行时才确定下来的。

动态生成代理
图2:动态生成代理

Spring AOP用的是动态代理,而不是静态代理,会根据目标类有没有实现接口,自动选用JDK动态代理或者CGLIB代理这两种动态代理技术中的一种,代理类都是程序运行时动态生成出来的。

启动类验证Spring选择的代理方式
图3:启动类验证Spring选择的代理方式

二、Spring AOP的实现方式是什么

上文我们说到Spring AOP靠的是动态代理,主要有JDK动态代理和CGLIB代理两种代理方式,Spring会根据目标类的情况自动选择。

有接口则启用JDK动态代理
图4:有接口则启用JDK动态代理

JDK动态代理依赖的是Java自带的java.lang.reflect.Proxy类,要求目标类必须实现至少一个接口,在运行的时候,Proxy会根据接口信息,在内存里动态生成一个实现了同样接口的代理类。这个代理类内部会持有一个InvocationHandler,所有方法调用都会先转发到InvocationHandler的invoke方法里,在这里可以插入切面逻辑,处理完再决定要不要继续调用目标对象的真实方法。

InvocationHandler
图5:InvocationHandler

CGLIB是基于字节码技术,在运行时生成目标类的一个子类,把父类里的方法重写一遍,在重写的方法里加入额外的处理逻辑,处理完再调用父类原本的方法。因为是靠继承来实现的,所以目标类不能是final修饰的,方法也不能是final或者private,不然没法被子类重写。这种方式不依赖接口,所以哪怕目标类没有实现任何接口,也能正常生成代理。

符合CGLIB条件的目标类
图6:符合CGLIB条件的目标类

以上就是Spring AOP是动态代理还是静态代理,Spring AOP的实现方式是什么的全部内容了。Spring AOP走的是动态代理,静态代理那种手动写死的方式基本派不上用场,Spring AOP主要是JDK代理和CGLIB代理,JDK动态代理靠接口,CGLIB靠继承生成子类,各自的适用条件和限制不太一样,Spring会按目标类的情况自动选,也支持手动指定。

 

180 1563 6924