首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
AOP引入:OOP存在哪些局限性?
AOP常见使用场景
AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
Java AOP设计模式:代理、判断和拦截器模式
Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
Java AOP判断模式(Predicate):如何筛选Join Point?
Java AOP拦截器模式(Interceptor):拦截执行分别代表什么?
Spring AOP 功能概述:核心特性、编程模型和使用限制
Spring AOP编程模型:注解驱动、XML配置驱动和底层API
Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢?
Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
CGLIB动态代理:为什么Java动态代理无法满足AOP的需要?
AspectJ代理代理:为什么Spring推荐AspectJ注解?
AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法和特性
AspectJ注解驱动:注解能完全替代AspectJ语言吗?
Spring核心基础:《小马哥讲Spring核心编程思想》还记得多少?
@AspectJ注解驱动
编程方式创建 @AspectJ代理
XML配置驱动 - 创建AOP代理
标准代理工厂API - ProxyFactory
@AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
XML配置Pointcut
API实现Pointcut
@AspectJ拦截动作:@Around与@Pointcut有区别吗?
XML配置Around Advice
API实现Around Advice
@AspectJ前置动作:@Before与@Around谁优先级执行?
XML配置Before Advice
API实现Before Advice
@AspectJ后置动作 - 三种After Advice之间的关系?
XML配置三种After Advice
API实现三种After Advice
自动动态代理
替换TargetSource
Spring AOP API整体设计
接入点接口 - Joinpoint
Joinpoint条件接口 - Pointcut
Pointcut操作 - ComposablePointcut
Pointcut便利实现
Pointcut AspectJ实现 - AspectJExpressionPointcut
Joinpoint执行动作接口 - Advice
Joinpoint Before Advice标准实现
Joinpoint Before Advice AspectJ实现
Joinpoint After Advice标准实现
Joinpoint After Advice AspectJ实现
Advice容器接口 - Advisor
Pointcut与Advice连接器 - PointcutAdvisor
Introduction与Advice连接器 - IntroductionAdvisor
Advisor的Interceptor适配器 - AdvisorAdapter
AdvisorAdapter实现
AOP代理接口 - AopProxy
AopProxy工厂接口与实现
JDK AopProxy实现 - JdkDynamicAopProxy
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(上)
小册名称:Spring AOP 编程思想(上)
### 章节标题:AOP代理接口 - AopProxy 在深入探讨Spring AOP(面向切面编程)的核心机制时,`AopProxy`接口无疑是一个至关重要的组件。作为连接业务逻辑与增强逻辑的桥梁,`AopProxy`定义了如何创建和管理AOP代理对象,使得开发者能够在不修改源代码的情况下,为应用程序添加额外的行为(如日志、事务管理等)。本章将详细解析`AopProxy`接口的角色、实现机制、以及它如何在Spring AOP框架中发挥作用。 #### 1. 引言 在Spring AOP中,代理(Proxy)是核心概念之一,它允许开发者通过拦截器(Advice)来增强目标对象(Target Object)的方法执行。这种增强机制是通过在运行时动态创建目标对象的代理对象来实现的。`AopProxy`接口正是这一机制的关键抽象,它定义了创建和管理这些代理对象的基本规范。 #### 2. AopProxy接口概述 `AopProxy`是Spring AOP中用于创建代理对象的接口,它位于`org.springframework.aop.framework`包下。该接口定义了几个关键方法,用于生成代理实例、获取代理配置信息以及执行目标方法调用时的拦截逻辑。 - **`Object getProxy()`**:此方法用于获取代理对象的实例。根据代理的类型(JDK动态代理或CGLIB代理),实际返回的代理对象类型会有所不同。 - **`AdvisedSupport getAdvisedSupport()`**:返回与代理关联的`AdvisedSupport`对象,该对象包含了代理的配置信息,如目标对象、增强器列表等。 - **`boolean isProxyTargetClass()`**:判断代理是否基于目标类进行创建(如CGLIB代理),而非基于接口(如JDK动态代理)。 - **`void changeAdvisors(List<Advisor> advisors)`**:允许更改代理的增强器列表。这在实际应用中较为少见,但提供了灵活性以支持动态调整增强逻辑。 #### 3. AopProxy的实现 Spring AOP提供了两种主要的代理机制:JDK动态代理和CGLIB代理。这两种机制分别对应`AopProxy`接口的两个实现类:`JdkDynamicAopProxy`和`CglibAopProxy`。 ##### 3.1 JDK动态代理 JDK动态代理是Java标准库提供的一种代理机制,它要求目标对象必须实现至少一个接口。`JdkDynamicAopProxy`通过`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现AOP代理。当调用代理对象的方法时,实际调用的是`InvocationHandler`实现的`invoke`方法,该方法内部会执行增强逻辑并最终调用目标对象的方法。 ##### 3.2 CGLIB代理 CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它允许在运行时动态地生成和扩展Java类。与JDK动态代理不同,CGLIB可以代理没有实现接口的类。`CglibAopProxy`利用CGLIB生成目标类的子类,通过重写目标类的方法来实现代理逻辑。这种方式更加灵活,但可能会引入额外的性能开销,因为需要生成和加载额外的类文件。 #### 4. AopProxy的选择策略 Spring AOP在创建代理时会根据目标对象的特性(是否实现了接口)自动选择使用JDK动态代理还是CGLIB代理。默认情况下,如果目标对象实现了至少一个接口,Spring将使用JDK动态代理;如果目标对象没有实现任何接口,则使用CGLIB代理。 然而,开发者也可以通过配置来显式指定代理类型。例如,在Spring的配置文件中或通过编程方式设置`ProxyFactoryBean`的`proxyTargetClass`属性为`true`,可以强制使用CGLIB代理,即使目标对象实现了接口也是如此。 #### 5. AopProxy与Advice的集成 在Spring AOP中,`AopProxy`不仅负责创建代理对象,还负责将增强逻辑(Advice)与目标方法调用过程相结合。这通常通过`Advisor`(增强器)的概念来实现,`Advisor`封装了`Advice`和`Pointcut`(切入点),指定了哪些方法应该被哪些增强逻辑所增强。 当通过`AopProxy`调用代理对象的方法时,Spring AOP框架会根据`Advisor`中的`Pointcut`表达式判断当前方法调用是否匹配指定的切入点。如果匹配,则执行相应的`Advice`,即增强逻辑。这一过程是高度自动化的,开发者只需定义好`Advice`和`Pointcut`,无需关心代理对象的创建和增强逻辑的具体执行过程。 #### 6. AopProxy的进阶应用 虽然`AopProxy`接口及其实现类为开发者提供了强大的AOP代理能力,但在实际应用中,直接操作这些类的情况并不多见。大多数情况下,开发者会利用Spring AOP提供的注解(如`@Aspect`、`@Before`、`@After`等)或XML配置来定义切面,Spring AOP框架会自动处理代理的创建和增强逻辑的执行。 然而,在某些特殊场景下,如需要自定义代理的创建过程或增强逻辑的执行方式时,深入理解`AopProxy`及其实现原理就显得尤为重要。例如,开发者可以通过继承`JdkDynamicAopProxy`或`CglibAopProxy`来创建自定义的代理实现,或者在`Advisor`中编写复杂的逻辑以实现更灵活的增强策略。 #### 7. 结论 `AopProxy`作为Spring AOP框架中的核心接口之一,在代理对象的创建和管理中扮演着举足轻重的角色。通过JDK动态代理和CGLIB代理两种机制,`AopProxy`为开发者提供了灵活且强大的AOP代理能力。理解`AopProxy`的工作原理及其与`Advice`、`Advisor`等组件的集成方式,对于深入掌握Spring AOP框架至关重要。同时,掌握如何根据实际需求选择合适的代理类型以及如何在特殊场景下自定义代理实现,也是成为一名优秀Java开发者的必经之路。
上一篇:
AdvisorAdapter实现
下一篇:
AopProxy工厂接口与实现
该分类下的相关小册推荐:
Java语言基础14-枚举和注解
Java语言基础11-Java中的泛型
经典设计模式Java版
Java并发编程实战
Java语言基础16-JDK8 新特性
SpringBoot合辑-初级篇
Mybatis合辑1-Mybatis基础入门
Java语言基础6-面向对象高级
Mybatis合辑5-注解、扩展、SQL构建
SpringBoot零基础到实战
Mybatis合辑4-Mybatis缓存机制
SpringBoot合辑-高级篇