优化Cglib动态代理
parent
a97d034d98
commit
da583360d8
|
@ -2,45 +2,24 @@
|
||||||
|
|
||||||
- [Cglib动态代理](#cglib动态代理)
|
- [Cglib动态代理](#cglib动态代理)
|
||||||
- [一、基本信息](#一基本信息)
|
- [一、基本信息](#一基本信息)
|
||||||
- [二、知识储备](#二知识储备)
|
- [二、基本描述](#二基本描述)
|
||||||
- [三、基本描述](#三基本描述)
|
- [三、主要功能](#三主要功能)
|
||||||
- [四、主要功能](#四主要功能)
|
- [四、最佳实践](#四最佳实践)
|
||||||
- [五、最佳实践](#五最佳实践)
|
- [五、源码分析](#五源码分析)
|
||||||
- [六、源码分析](#六源码分析)
|
- [六、常见问题](#六常见问题)
|
||||||
- [七、与其他组件的关系](#七与其他组件的关系)
|
|
||||||
- [八、常见问题](#八常见问题)
|
|
||||||
|
|
||||||
|
|
||||||
### 一、基本信息
|
### 一、基本信息
|
||||||
|
|
||||||
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
|
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
|
||||||
|
|
||||||
### 二、知识储备
|
### 二、基本描述
|
||||||
|
|
||||||
1. **理解代理模式**
|
|
||||||
|
|
||||||
+ 理解代理模式的基本概念是必要的。了解代理模式如何通过代理对象控制对原始对象的访问,以及代理对象能够附加额外的行为等,有助于理解 Cglib 动态代理的作用和原理。
|
|
||||||
|
|
||||||
2. **了解字节码生成**
|
|
||||||
|
|
||||||
+ Cglib 动态代理是通过生成字节码来创建目标类的子类,并在子类中添加代理逻辑来实现的。因此,了解字节码生成的基本原理以及如何操作字节码是有帮助的。不过,并不要求对字节码生成技术有深入的了解,只需要了解其基本概念即可。
|
|
||||||
|
|
||||||
3. **熟悉 (AOP) 概念**
|
|
||||||
|
|
||||||
+ Cglib 动态代理通常用于实现面向切面编程 (AOP)。了解 AOP 的基本概念、切面、连接点、通知等内容可以帮助理解 Cglib 动态代理在实际项目中的应用场景和使用方式。
|
|
||||||
|
|
||||||
4. **掌握 Cglib 库的使用方法**
|
|
||||||
|
|
||||||
+ 最后,当然需要掌握 Cglib 库的使用方法。包括如何导入 Cglib 库到项目中,以及如何使用 Cglib 提供的 API 来创建代理类、实现方法拦截和增强等操作。
|
|
||||||
|
|
||||||
### 三、基本描述
|
|
||||||
|
|
||||||
Cglib 是一个基于 Java 的开源代码生成库,它通过动态生成字节码的方式实现了对类的动态代理,无需目标类实现接口即可进行代理,常用于 AOP 编程、方法拦截与增强等场景,提供了灵活而高效的代理解决方案。
|
Cglib 是一个基于 Java 的开源代码生成库,它通过动态生成字节码的方式实现了对类的动态代理,无需目标类实现接口即可进行代理,常用于 AOP 编程、方法拦截与增强等场景,提供了灵活而高效的代理解决方案。
|
||||||
|
|
||||||
### 四、主要功能
|
### 三、主要功能
|
||||||
|
|
||||||
1. **动态代理生成**
|
1. **动态代理生成**
|
||||||
|
|
||||||
+ Cglib 能够在运行时动态生成类的子类,从而实现对目标类的动态代理,无需目标类实现接口。
|
+ Cglib 能够在运行时动态生成类的子类,从而实现对目标类的动态代理,无需目标类实现接口。
|
||||||
|
|
||||||
2. **AOP 支持**
|
2. **AOP 支持**
|
||||||
|
@ -59,7 +38,7 @@ Cglib 是一个基于 Java 的开源代码生成库,它通过动态生成字
|
||||||
|
|
||||||
+ 与 JDK 动态代理不同,Cglib 可以代理那些没有实现接口的类,提供了更广泛的应用场景。
|
+ 与 JDK 动态代理不同,Cglib 可以代理那些没有实现接口的类,提供了更广泛的应用场景。
|
||||||
|
|
||||||
### 五、最佳实践
|
### 四、最佳实践
|
||||||
|
|
||||||
使用 Cglib 实现动态代理。它首先创建了一个 Enhancer 对象,然后设置了目标对象的父类和回调拦截器,最后通过 Enhancer 创建了代理对象。这个代理对象可以调用目标对象的方法,并且在方法执行前后执行拦截器中定义的逻辑。
|
使用 Cglib 实现动态代理。它首先创建了一个 Enhancer 对象,然后设置了目标对象的父类和回调拦截器,最后通过 Enhancer 创建了代理对象。这个代理对象可以调用目标对象的方法,并且在方法执行前后执行拦截器中定义的逻辑。
|
||||||
|
|
||||||
|
@ -122,7 +101,7 @@ hello world
|
||||||
After invoking method: doSomething
|
After invoking method: doSomething
|
||||||
```
|
```
|
||||||
|
|
||||||
### 六、源码分析
|
### 五、源码分析
|
||||||
|
|
||||||
这段代码是通过反编译工具(arthas)得到的 Cglib 生成的代理类的源代码。这个代理类继承了目标类 `MyServiceImpl`,并实现了 `Factory` 接口。它重写了目标类的方法,并添加了拦截器逻辑。在每个方法的实现中,先尝试获取拦截器对象,然后通过拦截器的 `intercept` 方法执行拦截逻辑,最终调用目标方法。除此之外,它还包含了一些静态方法和静态字段,用于初始化和支持代理类的其他操作。
|
这段代码是通过反编译工具(arthas)得到的 Cglib 生成的代理类的源代码。这个代理类继承了目标类 `MyServiceImpl`,并实现了 `Factory` 接口。它重写了目标类的方法,并添加了拦截器逻辑。在每个方法的实现中,先尝试获取拦截器对象,然后通过拦截器的 `intercept` 方法执行拦截逻辑,最终调用目标方法。除此之外,它还包含了一些静态方法和静态字段,用于初始化和支持代理类的其他操作。
|
||||||
|
|
||||||
|
@ -207,16 +186,7 @@ public class MyServiceImpl$$EnhancerByCGLIB$$bff4cd04 extends MyServiceImpl impl
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 七、与其他组件的关系
|
### 六、常见问题
|
||||||
|
|
||||||
1. **Spring Framework**
|
|
||||||
|
|
||||||
+ Spring Framework 是一个全功能的 Java 开发框架,它将 Cglib 集成到其核心模块中,主要用于实现 Spring AOP(面向切面编程)功能。Spring 使用 Cglib 动态生成子类来实现代理,从而在方法执行前后织入额外的逻辑,如事务管理、安全检查等。
|
|
||||||
|
|
||||||
2. **AspectJ**
|
|
||||||
+ AspectJ 是一个功能强大的面向切面编程(AOP)框架,它提供了更强大的切面功能。Cglib 可以作为 AspectJ 的后端,用于生成代理类,并通过代理类实现 AOP 功能。在 AspectJ 中,Cglib 代理可以被用于代理任意 Java 类的任意方法。
|
|
||||||
|
|
||||||
### 八、常见问题
|
|
||||||
|
|
||||||
1. **Final 类和方法无法代理**
|
1. **Final 类和方法无法代理**
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue