代理对象的创建

2025/05/27

文章目录

一、背景

了解 Spring AOP 的代理对象的创建流程。

spring 文档中这样描述

If the target object to be proxied implements at least one interface, a JDK dynamic proxy is used. All of the interfaces implemented by the target type are proxied. If the target object does not implement any interfaces, a CGLIB proxy is created.

二、创建入口 (时段:run-time)

jdk 代理创建和 cglib 代理创建入口的主要流程都是相同的,不同的是去调用对应的库时底层操作的部分。

(一)JDK 代理创建

(二)CGLIB 代理创建

随着 IOC 容器的刷新完毕,代理对象也全部创建完毕。

三、自动生成的代理对象的结构

现在我们自定义的业务 bean 的代理对象已经生成完毕,现在来看下它们的结构是怎样的。

(一)JDK

代表着代理对象所关联的调用处理器。

每个代理对象实例都有一个关联的 invocation handler. 

jdk 的 aopproxy 实现了 InvocationHandler. jdk_dynamic_aopproxy.png

(二)CGLIB

cglib 生成的代理对象结构如下图,可以看到和 jdk 的结构不一样,但是内部的组成是相似的

最需要关注 CGLIB$CALLBACK0,这个是最重要的。

对应的索引定义在org.springframework.aop.framework.CglibAopProxy#AOP_PROXY

四、名称逻辑

(一)JDK 创建的名称

(二)CGLIB 创建的名称

五、问题:目标对象的代理对象创建了之后,目标对象还会去创建吗?

会的。会先创建目标对象,再创建代理对象。

六、AnnotationAwareAspectJAutoProxyCreator

七、问题:如何判断一个 bean 是否需要生成代理对象?

八、问题:getBean() 获取代理对象的过程是怎样的?