首页
技术小册
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 编程思想(上)
### 章节标题:标准代理工厂API - ProxyFactory 在深入探讨Spring AOP(面向切面编程)的精髓时,`ProxyFactory`作为Spring框架中构建AOP代理的一个核心类,扮演着至关重要的角色。本章将详细解析`ProxyFactory`的工作原理、使用方法、配置选项及其在实际应用中的重要作用。通过本章的学习,读者将能够熟练掌握如何利用`ProxyFactory`来创建和管理AOP代理,从而有效地实现横切关注点(如日志记录、事务管理、安全检查等)的分离和复用。 #### 一、引言 在Spring AOP中,代理(Proxy)是一种常用的技术手段,用于在不修改原有代码结构的基础上,增加额外的功能或行为。`ProxyFactory`是Spring AOP提供的一个强大工具,它简化了代理对象的创建过程,允许开发者以编程方式定义代理行为,包括目标对象、增强器(Advice)、切入点(Pointcut)等。通过`ProxyFactory`,我们可以灵活地将横切关注点织入到业务逻辑中,实现代码的低耦合和高内聚。 #### 二、ProxyFactory的基本概念 ##### 2.1 代理模式概述 代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Spring AOP中,代理对象作为目标对象(被代理对象)的“替身”,在客户端与目标对象之间起到中介作用。代理对象可以在调用目标对象的方法前后执行特定的操作,从而实现横切关注点的插入。 ##### 2.2 ProxyFactory的角色 `ProxyFactory`是Spring AOP中用于创建代理对象的工厂类。它封装了代理创建过程中的复杂逻辑,包括代理类型的选择(JDK动态代理或CGLIB代理)、目标对象的设置、增强器的添加等。开发者只需通过简单的API调用,即可完成代理对象的创建和配置。 #### 三、ProxyFactory的使用方法 ##### 3.1 创建ProxyFactory实例 首先,需要创建一个`ProxyFactory`的实例。这一步很简单,直接通过`new`关键字即可完成。 ```java ProxyFactory proxyFactory = new ProxyFactory(); ``` ##### 3.2 设置目标对象 接下来,需要将需要被代理的目标对象设置到`ProxyFactory`中。这可以通过调用`setTarget`方法实现。 ```java // 假设有一个实现了某些接口的类TargetClass TargetClass target = new TargetClass(); proxyFactory.setTarget(target); ``` ##### 3.3 添加增强器 增强器(Advice)是AOP中的核心概念之一,它定义了横切关注点的行为。在`ProxyFactory`中,可以通过调用`addAdvice`方法添加增强器。 ```java // 创建一个增强器实例,比如一个方法前置增强器 MethodBeforeAdvice beforeAdvice = new MyBeforeAdvice(); proxyFactory.addAdvice(beforeAdvice); // 或者,如果使用的是AspectJ表达式定义切入点,可以添加AspectJ增强器 AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression("execution(* com.example..*.*(..))"); Advisor advisor = new DefaultPointcutAdvisor(pointcut, beforeAdvice); proxyFactory.addAdvisor(advisor); ``` ##### 3.4 获取代理对象 配置完成后,通过调用`getProxy`方法即可获取到配置好的代理对象。 ```java // 获取代理对象,这里的Class<?>参数指定了代理对象实现的接口,对于CGLIB代理则无需此参数 TargetInterface proxy = (TargetInterface) proxyFactory.getProxy(TargetInterface.class); ``` #### 四、ProxyFactory的配置选项 `ProxyFactory`提供了丰富的配置选项,以满足不同的使用场景和需求。以下是一些常用的配置选项: - **代理接口**:通过`setInterfaces`方法,可以指定代理对象需要实现的接口。这在使用JDK动态代理时尤其重要,因为JDK动态代理是基于接口的。 - **代理目标类**:对于没有实现接口的类,Spring AOP默认使用CGLIB来创建代理。可以通过`setProxyTargetClass`方法明确指定是否使用CGLIB代理。 - **优化代理**:通过`setOptimize`方法,可以开启或关闭代理的优化。优化后的代理会尝试减少代理对象的创建开销,但可能会增加一些内存占用。 - **冻结配置**:一旦代理配置完成,可以通过调用`setFrozen`方法将配置冻结,以防止后续对代理配置的修改。 - **事务管理**:虽然`ProxyFactory`本身不直接提供事务管理功能,但可以通过添加相应的事务增强器(如`TransactionInterceptor`),将事务管理逻辑织入到代理中。 #### 五、实战应用 下面通过一个简单的例子来展示如何使用`ProxyFactory`来创建一个带有日志记录功能的代理对象。 ```java // 定义一个日志记录增强器 public class LoggingAdvice implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Before method: " + method.getName()); } } // 配置ProxyFactory并创建代理 ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.setTarget(new SomeService()); proxyFactory.addAdvice(new LoggingAdvice()); SomeService proxy = (SomeService) proxyFactory.getProxy(SomeService.class); // 使用代理对象 proxy.doSomething(); // 调用前会打印日志 ``` 在这个例子中,`LoggingAdvice`是一个实现了`MethodBeforeAdvice`接口的增强器,它在目标方法执行前打印日志。通过`ProxyFactory`,我们将这个增强器织入到了`SomeService`的代理中,从而实现了日志记录的横切关注点。 #### 六、总结 `ProxyFactory`作为Spring AOP中构建代理对象的核心工具,提供了灵活而强大的代理创建和管理能力。通过本章的学习,读者应该已经掌握了`ProxyFactory`的基本概念、使用方法、配置选项及其在实战中的应用。在未来的开发过程中,可以利用`ProxyFactory`来有效地实现横切关注点的分离和复用,从而提升代码的可维护性和可扩展性。同时,也应注意到,随着Spring框架的不断发展,新的技术和工具(如Spring Boot的自动配置、Spring Cloud的分布式服务治理等)也在不断涌现,它们为AOP的实现提供了更多的选择和可能性。因此,建议读者保持对新技术的学习热情,不断探索和实践,以提升自己的技术水平和解决问题的能力。
上一篇:
XML配置驱动 - 创建AOP代理
下一篇:
@AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
该分类下的相关小册推荐:
Java并发编程实战
Java语言基础10-Java中的集合
SpringBoot零基础到实战
Mybatis合辑2-Mybatis映射文件
Java语言基础11-Java中的泛型
Java语言基础14-枚举和注解
Java高并发秒杀入门与实战
手把手带你学习SpringBoot-零基础到实战
Mybatis合辑1-Mybatis基础入门
Java语言基础13-类的加载和反射
Java语言基础6-面向对象高级
深入拆解 Java 虚拟机