# DynamicProxy **Repository Path**: hanser_wei_admin/DynamicProxy ## Basic Information - **Project Name**: DynamicProxy - **Description**: SpringAOP简单梳理。对CGLib以及JDK动态代理做了一部分比较 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-27 - **Last Updated**: 2025-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DynamicProxy 项目说明 这是一个基于 Spring AOP 和动态代理机制的 Java 示例项目,演示了如何使用 JDK 动态代理和 CGLIB 代理实现面向切面编程(AOP)功能。 ## 项目结构 ``` . └── main └── java └── com └── hanserwei ├── annotation │ └── DynamicProxy.java # 自定义注解,用于标记需要代理的方法 ├── aop │ └── HumanAspect.java # AOP 切面类,定义环绕通知 ├── config │ └── SpringApplicationConfig.java # Spring 配置类,启用 AspectJ 自动代理 ├── entity │ ├── GirlFriend.java # 普通类,包含 final 方法 │ ├── Human.java # 接口类 │ └── Student.java # 实现 Human 接口的实现类 └── Application.java # 程序入口,演示代理效果 ``` ## 核心组件说明 ### 1. 自定义注解 `@DynamicProxy` - 位置: `com.hanserwei.annotation.DynamicProxy` - 作用: 标记需要进行 AOP 代理的方法 - 特点: 可在运行时通过反射获取 ### 2. AOP 切面类 `HumanAspect` - 位置: `com.hanserwei.aop.HumanAspect` - 功能: - 定义切入点: 所有被 `@DynamicProxy` 注解标记的方法 - 实现环绕通知: 在目标方法执行前后添加增强逻辑 ### 3. 实体类 #### `Human` 接口 - 简单接口,定义了 `display()` 方法 #### `Student` 类 - 实现 `Human` 接口 - 使用 `@Component` 注解纳入 Spring 管理 - `display()` 方法添加了 `@DynamicProxy` 注解 #### `GirlFriend` 类 - 普通类,没有实现接口 - `display()` 方法为 final 方法并添加了 `@DynamicProxy` 注解 ### 4. Spring 配置 - 启用 `@EnableAspectJAutoProxy(proxyTargetClass = true)` - `proxyTargetClass = true` 表示强制使用 CGLIB 代理而非 JDK 动态代理 ### 5. 应用程序主类 - 获取 Spring 容器中的代理对象 - 调用被代理的方法验证 AOP 效果 - 输出代理对象的类型信息以区分使用的代理方式 ## 运行效果 程序会输出类似以下内容: ``` before 我是Hanserwei! after class java.lang.Object ================================= before I love Hanserwei after class com.hanserwei.entity.GirlFriend$$EnhancerBySpringCGLIB$$... class class com.hanserwei.entity.GirlFriend ``` 这表明: - AOP 代理成功拦截了方法调用 - 对于实现了接口的 [Student](file:///home/Hanserwei/IdeaProjects/DynamicProxy/src/main/java/com/hanserwei/entity/Student.java#L5-L12) 类和普通类 [GirlFriend](file:///home/Hanserwei/IdeaProjects/DynamicProxy/src/main/java/com/hanserwei/entity/GirlFriend.java#L5-L11) 都能正确应用代理 - 使用的是 CGLIB 代理(因为配置中设置了 `proxyTargetClass = true`) ## 技术要点 1. **动态代理选择**: - JDK 动态代理: 只能代理实现了接口的类 - CGLIB 代理: 可以代理普通类,通过继承实现 2. **AOP 实现**: - 使用 AspectJ 注解风格 - 基于自定义注解的切入点定义 3. **Spring 集成**: - 全注解配置方式 - 组件扫描自动注册 Bean ## 使用方法 1. 克隆项目到本地 2. 导入到 IDE 中(如 IntelliJ IDEA) 3. 运行 [Application.java](file:///home/Hanserwei/IdeaProjects/DynamicProxy/src/main/java/com/hanserwei/Application.java) 中的 main 方法 4. 观察控制台输出结果