深入理解Spring AOP: Proxy的生成机制
需积分: 10 146 浏览量
更新于2024-09-18
收藏 80KB DOC 举报
“Spring源代码解析(五):Spring_AOP获取Proxy.doc”
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者在不修改原有代码的情况下,通过添加额外的行为(通知,Advice)来增强功能。本文将探讨Spring AOP如何获取代理对象(Proxy),以及涉及到的相关概念。
首先,我们要理解什么是通知(Advice)。在Spring AOP中,通知定义了在特定连接点(Join Point)执行的动作。有五种不同的通知类型:
1. Before Advice:在目标方法执行前执行的代码。
2. After Returning Advice:在目标方法正常返回后执行的代码。
3. After Throwing Advice:在目标方法抛出异常后执行的代码。
4. Method Before Advice:与Before Advice类似,但在方法执行前应用。
5. 这些通知都是Spring AOP定义的接口,需要用户自定义实现来提供具体的行为。
接着,我们讨论切点(Pointcut)。切点是定义通知应用于哪些连接点的规则。它可以帮助我们定位到需要插入额外逻辑的方法集合。Spring提供了多种切点实现,例如基于正则表达式的`JdkRegexpMethodPointcut`。下面是一个简化版的`JdkRegexpMethodPointcut`中的`matches`方法,用于检查方法名是否符合预设的正则表达式模式:
```java
public final boolean matches(Method method, Class<?> targetClass) {
String pattern = method.getDeclaringClass().getName() + "." + method.getName();
for (int i = 0; i < this.patterns.length; i++) {
boolean matched = matches(pattern, i);
if (matched) {
for (int j = 0; j < this.excludedPatterns.length; j++) {
boolean excluded = matchesExclusion(pattern, j);
if (excluded) {
return false;
}
}
return true;
}
}
return false;
}
```
这段代码遍历预设的正则表达式模式,检查方法全名(包括类名和方法名)是否匹配,并排除任何不符合排除模式的方法。
了解了这些基础概念后,我们转向代理(Proxy)的获取。在Spring AOP中,代理对象是实际业务对象的包装,它会在方法调用前后插入通知。Spring支持两种类型的代理:JDK动态代理和CGLIB代理。
1. JDK动态代理:当目标对象实现了至少一个接口时,Spring会创建一个与该接口相同的动态代理类。代理类通过反射调用目标方法,并在调用前后插入通知。
2. CGLIB代理:如果目标对象没有实现接口,Spring会使用CGLIB库生成一个目标对象的子类,并在子类的方法上插入通知。CGLIB代理效率较高,但需要目标类支持子类化。
Spring通过`ProxyFactoryBean`或`AopProxy`接口来创建代理对象。`ProxyFactoryBean`是一个Spring Bean工厂,可以创建具有AOP功能的代理对象。而`AopProxy`接口是所有Spring AOP代理的基类,它包含一个`getProxy()`方法,用于创建代理实例。
Spring AOP通过定义通知和切点,能够灵活地在运行时增强对象的行为,而无需直接修改原始代码。通过代理对象,我们可以透明地插入这些增强,使得代码更加模块化和易于维护。理解Spring AOP的原理和实现,对于深入掌握Spring框架和实现高效的面向切面编程至关重要。
2018-12-20 上传
2012-10-07 上传
2011-08-04 上传
2010-04-16 上传
2009-05-16 上传
2019-05-25 上传
2013-01-13 上传
165 浏览量
2019-03-24 上传
young3917
- 粉丝: 0
- 资源: 36
最新资源
- 构建基于Django和Stripe的SaaS应用教程
- Symfony2框架打造的RESTful问答系统icare-server
- 蓝桥杯Python试题解析与答案题库
- Go语言实现NWA到WAV文件格式转换工具
- 基于Django的医患管理系统应用
- Jenkins工作流插件开发指南:支持Workflow Python模块
- Java红酒网站项目源码解析与系统开源介绍
- Underworld Exporter资产定义文件详解
- Java版Crash Bandicoot资源库:逆向工程与源码分享
- Spring Boot Starter 自动IP计数功能实现指南
- 我的世界牛顿物理学模组深入解析
- STM32单片机工程创建详解与模板应用
- GDG堪萨斯城代码实验室:离子与火力基地示例应用
- Android Capstone项目:实现Potlatch服务器与OAuth2.0认证
- Cbit类:简化计算封装与异步任务处理
- Java8兼容的FullContact API Java客户端库介绍