diff --git a/README.md b/README.md
index a9b2393..9d07fb9 100644
--- a/README.md
+++ b/README.md
@@ -198,7 +198,7 @@
+ Spring AOP
- [JDK动态代理](spring-aop/spring-aop-jdkProxy/README.md):接口实现,动态生成代理类,处理方法调用,统一横切关注点。
- [Cglib动态代理](spring-aop/spring-aop-cglibProxy/README.md):基于字节码生成的库,无需接口,可拦截类方法并进行增强。
- - [AopProxy](spring-aop/spring-aop-aopProxy/README.md):创建和管理AOP代理对象。
+ - [AopProxy](spring-aop/spring-aop-aopProxy/README.md):创建和管理AOP代理对象。
- [AopProxyFactory](spring-aop/spring-aop-aopProxyFactory/README.md):创建AOP代理工厂,支持JDK和CGLIB。
- [ProxyFactory](spring-aop/spring-aop-proxyFactory/README.md):一种便捷的方式来创建代理对象。
- [ClassFilter](spring-aop/spring-aop-classFilter/README.md):确定类是否匹配拦截条件。
diff --git a/spring-aop/spring-aop-aopProxy/README.md b/spring-aop/spring-aop-aopProxy/README.md
index dd210ac..ce16af3 100644
--- a/spring-aop/spring-aop-aopProxy/README.md
+++ b/spring-aop/spring-aop-aopProxy/README.md
@@ -84,8 +84,7 @@ public interface AopProxy {
+ 使用 JDK 动态代理实现的 `AopProxy` 实现类。当目标对象实现了至少一个接口时,Spring 将使用该类创建代理对象。该类通过 Java 标准库中的 `java.lang.reflect.Proxy` 类来创建代理对象。
2. **CglibAopProxy**
-
- + 使用 CGLIB(Code Generation Library)动态代理实现的 `AopProxy` 实现类。当目标对象没有实现任何接口时,Spring 将使用该类创建代理对象。该类通过生成目标类的子类来创建代理对象,实现了对目标对象方法的拦截和增强。
++ 使用 CGLIB(Code Generation Library)动态代理实现的 `AopProxy` 实现类。当目标对象没有实现任何接口时,Spring 将使用该类创建代理对象。该类通过生成目标类的子类来创建代理对象,实现了对目标对象方法的拦截和增强。
### 六、最佳实践
@@ -191,11 +190,541 @@ Cglib Class = class com.xcs.spring.MyServiceImpl$$EnhancerBySpringCGLIB$$3c23100
doSomething method result = hello world
```
+### 七、时序图
+
+#### JdkDynamicAopProxy
+
+~~~mermaid
+sequenceDiagram
+autonumber
+AopProxyDemo->>JdkDynamicAopProxy:new JdkDynamicAopProxy()
+JdkDynamicAopProxy->>JdkDynamicAopProxy:this.advised
+JdkDynamicAopProxy->>JdkDynamicAopProxy:this.proxiedInterfaces
+JdkDynamicAopProxy->>AopProxyDemo:aopProxy
+AopProxyDemo->>JdkDynamicAopProxy:getProxy()
+JdkDynamicAopProxy->>JdkDynamicAopProxy:getProxy(classLoader)
+JdkDynamicAopProxy->>AopProxyDemo:返回代理对象
+AopProxyDemo->>$Proxy0:aopProxy.doSomething()
+$Proxy0->>JdkDynamicAopProxy:invoke()
+JdkDynamicAopProxy->>ReflectiveMethodInvocation:new ReflectiveMethodInvocation()
+ReflectiveMethodInvocation->>JdkDynamicAopProxy:返回invocation
+loop 递归拦截器
+ JdkDynamicAopProxy->>ReflectiveMethodInvocation:invocation.proceed()
+ ReflectiveMethodInvocation->>ReflectiveMethodInvocation:invokeJoinpoint()
+ ReflectiveMethodInvocation->>AopUtils:invokeJoinpointUsingReflection()
+ AopUtils->>$Proxy0:method.invoke(target, args)
+end
+
+~~~
+
+#### CglibAopProxy
+
### 七、源码分析
-暂无
+#### JdkDynamicAopProxy
-### 七、常见问题
+在`org.springframework.aop.framework.JdkDynamicAopProxy#getProxy()`方法中,主要作用是返回一个代理对象,使用默认的类加载器来生成代理。
+
+```java
+@Override
+public Object getProxy() {
+ return getProxy(ClassUtils.getDefaultClassLoader());
+}
+```
+
+在`org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)`方法中,接收一个类加载器作为参数,并根据传入的类加载器和被代理的接口数组来创建一个 JDK 动态代理对象。
+
+```java
+@Override
+public Object getProxy(@Nullable ClassLoader classLoader) {
+ if (logger.isTraceEnabled()) {
+ logger.trace("Creating JDK dynamic proxy: " + this.advised.getTargetSource());
+ }
+ return Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this);
+}
+```
+
+在`org.springframework.aop.framework.JdkDynamicAopProxy#invoke`方法中,`JdkDynamicAopProxy`实现了`InvocationHandler`接口,因此可以执行`invoke`方法。在方法中,首先根据方法是否为`equals`或`hashCode`方法进行特殊处理,然后获取目标对象并获取拦截器链。接着,根据拦截器链是否为空,选择直接调用目标对象方法或者通过方法拦截器链依次执行。最后,根据方法的返回值类型进行处理,如果返回值为目标对象并且返回类型与代理类型相同,则将返回值修改为代理对象。在方法执行完毕后,确保释放目标对象并恢复旧的代理对象。
+
+```java
+/**
+ * 实现了 {@code InvocationHandler.invoke} 方法。
+ *
调用者将看到目标对象抛出的异常,除非一个钩子方法抛出异常。
+ */
+@Override
+@Nullable
+public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ // 旧的代理对象
+ Object oldProxy = null;
+ // 是否设置了代理上下文标志
+ boolean setProxyContext = false;
+
+ // 目标源
+ TargetSource targetSource = this.advised.targetSource;
+ // 目标对象
+ Object target = null;
+
+ try {
+ if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) {
+ // 目标对象未实现 equals(Object) 方法
+ return equals(args[0]);
+ } else if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) {
+ // 目标对象未实现 hashCode() 方法
+ return hashCode();
+ } else if (method.getDeclaringClass() == DecoratingProxy.class) {
+ // 只有 getDecoratedClass() 声明 -> 转发到代理配置
+ return AopProxyUtils.ultimateTargetClass(this.advised);
+ } else if (!this.advised.opaque && method.getDeclaringClass().isInterface() &&
+ method.getDeclaringClass().isAssignableFrom(Advised.class)) {
+ // 在代理配置上执行服务调用...
+ return AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
+ }
+
+ Object retVal;
+
+ if (this.advised.exposeProxy) {
+ // 必要时使调用可用
+ oldProxy = AopContext.setCurrentProxy(proxy);
+ setProxyContext = true;
+ }
+
+ // 尽可能晚地获取目标对象,以最小化我们“拥有”目标对象的时间,以防它来自池。
+ target = targetSource.getTarget();
+ Class> targetClass = (target != null ? target.getClass() : null);
+
+ // 获取此方法的拦截器链。
+ List