首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
CGLIB AopProxy实现 - CglibAopProxy
AopProxyFactory配置管理器 - AdvisedSupport
Advisor链工厂接口与实现 - AdvisorChainFactory
目标对象来源接口与实现 - TargetSource
代理对象创建基础类 - ProxyCreatorSupport
AdvisedSupport事件监听器 - AdvisedSupportListener
ProxyCreatorSupport标准实现 - ProxyFactory
ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
IoC容器自动代理抽象 - AbstractAutoProxyCreator
IoC容器自动代理标准实现
IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
AOP Infrastructure Bean接口 - AopInfrastructureBean
AOP上下文辅助类 - AopContext
代理工厂工具类 - AopProxyUtils
AOP工具类 - AopUtils
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
AspectJ XML配置驱动实现 -
AOP配置Schema-based 实现 -
Aspect Schema-based实现 -
Pointcut Schema-based实现 -
Around Advice Schema-based实现 -
Before Advice Schema-based实现 -
After Advice Schema-based实现 -
After Returning Advice Schema-based实现 -
After Throwing Advice Schema-based实现 -
Adviser Schema-based实现 -
Introduction Schema-based实现 -
作用域代理Schema-based实现 -
抽象工厂模式(Abstract factory)实现
构建器模式(Builder)实现
工厂方法模式(Factory method)实现
原型模式(Prototype)实现
单例模式(Singleton)实现
适配器模式(Adapter)实现
组合模式(Composite)实现
装饰器模式(Decorator)实现
享元模式(Flyweight)实现
代理模式(Proxy)实现
模板方法模式(Template Method)实现
责任链模式(Chain of Responsibility)实现
观察者模式(Observer)实现
策略模式(Strategy)实现
命令模式(Command)实现
状态模式(State)实现
Spring AOP在 Spring 事件(Events)
Spring AOP在Spring 事务(Transactions)理论基础
Spring AOP在Spring 事务(Transactions)源码分析
Spring AOP在Spring 缓存(Caching)
Spring AOP在Spring本地调度(Scheduling)
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(下)
小册名称:Spring AOP 编程思想(下)
### 章节:Advisor链工厂接口与实现 - AdvisorChainFactory #### 引言 在Spring AOP(面向切面编程)的广阔领域中,`Advisor`链的构造与管理是实现灵活、高效切面编程的关键环节之一。`Advisor`作为AOP中的核心概念,封装了切点(Pointcut)与增强(Advice)的关联信息,决定了哪些方法会被拦截以及如何进行拦截。然而,在实际应用中,一个方法调用可能同时被多个`Advisor`所关注,这就需要一种机制来有序地组织这些`Advisor`,形成一条`Advisor`链,以确保增强逻辑能够按照预期的顺序执行。`AdvisorChainFactory`接口及其实现正是这一机制的核心组成部分,它负责根据特定逻辑构建并返回适用于当前方法调用的`Advisor`链。 #### AdvisorChainFactory 接口定义 首先,我们来定义`AdvisorChainFactory`接口的基本轮廓。这个接口的核心任务是接收一个方法调用(通常通过`MethodInvocation`对象表示)作为输入,并返回一个包含所有相关`Advisor`的链。这些`Advisor`将按照一定顺序(如优先级或声明顺序)排列,以便后续进行拦截处理。 ```java public interface AdvisorChainFactory { /** * 根据给定的方法调用构建并返回Advisor链。 * * @param methodInvocation 方法调用信息 * @return Advisor链,可能为空列表如果没有匹配的Advisor */ List<Advisor> getAdvisorChain(MethodInvocation methodInvocation); /** * (可选)提供额外的配置或上下文信息给AdvisorChainFactory, * 以便其可以根据这些信息调整Advisor链的构建逻辑。 * * @param configuration 额外的配置信息 */ void setConfiguration(Object configuration); } ``` 注意,这里的`MethodInvocation`是Spring AOP中的一个关键接口,它封装了方法调用的详细信息,包括目标对象、方法、参数等,使得`Advisor`能够据此判断是否需要进行拦截处理。 #### AdvisorChainFactory 的实现策略 `AdvisorChainFactory`的实现可以根据不同的应用场景和需求采用不同的策略。以下是一些常见的实现方式: ##### 1. 基于声明的顺序 一种简单的实现方式是按照`Advisor`在Spring容器中声明的顺序来构建链。这种方式实现简单,但缺乏灵活性,因为它假设了声明的顺序即是逻辑上应该执行的顺序。 ```java public class OrderBasedAdvisorChainFactory implements AdvisorChainFactory { private List<Advisor> advisors; @Override public List<Advisor> getAdvisorChain(MethodInvocation methodInvocation) { // 这里简化处理,直接返回所有Advisor,实际应用中可能需要根据Pointcut匹配结果筛选 return advisors; } // 设置Advisor列表的方法(略) } ``` 然而,这种方式显然不能满足所有需求,因为实际应用中往往需要根据`Pointcut`的匹配结果来决定哪些`Advisor`应该被包含在链中。 ##### 2. 基于Pointcut匹配的筛选 更常见的实现方式是首先根据`MethodInvocation`中的方法信息,通过`Pointcut`的匹配逻辑筛选出所有相关的`Advisor`,然后再按照一定的顺序(如优先级或声明顺序)组织这些`Advisor`形成链。 ```java public class PointcutBasedAdvisorChainFactory implements AdvisorChainFactory { private List<Advisor> advisors; @Override public List<Advisor> getAdvisorChain(MethodInvocation methodInvocation) { List<Advisor> filteredAdvisors = new ArrayList<>(); for (Advisor advisor : advisors) { if (advisor.getPointcut().matches(methodInvocation)) { filteredAdvisors.add(advisor); } } // 根据需要可以对filteredAdvisors进行排序 return filteredAdvisors; } // 设置Advisor列表的方法(略) } ``` 在这个实现中,我们遍历了所有的`Advisor`,通过调用`Pointcut`的`matches`方法来检查当前方法调用是否满足某个`Advisor`的拦截条件。满足条件的`Advisor`会被添加到结果列表中。 ##### 3. 优先级排序 在多个`Advisor`同时匹配到同一个方法调用时,它们之间的执行顺序就变得尤为重要。为此,我们可以在`Advisor`接口中引入优先级的概念,并在构建`Advisor`链时根据优先级进行排序。 ```java public interface Advisor extends Ordered { // 继承Ordered接口以支持优先级排序 } // PointcutBasedAdvisorChainFactory的改进版,加入排序逻辑 public class OrderedPointcutBasedAdvisorChainFactory extends PointcutBasedAdvisorChainFactory { @Override public List<Advisor> getAdvisorChain(MethodInvocation methodInvocation) { List<Advisor> filteredAdvisors = super.getAdvisorChain(methodInvocation); filteredAdvisors.sort(Comparator.comparingInt(Ordered::getOrder)); return filteredAdvisors; } } ``` 这里,我们假设`Advisor`接口已经继承了Spring的`Ordered`接口,从而可以通过`getOrder`方法获取每个`Advisor`的优先级。在返回`Advisor`链之前,我们根据优先级对它们进行了排序。 #### 实际应用中的考虑 在实际应用中,`AdvisorChainFactory`的实现可能还需要考虑以下因素: - **性能优化**:对于包含大量`Advisor`的应用,每次方法调用都进行完整的`Pointcut`匹配和排序可能会成为性能瓶颈。可以通过缓存机制来优化这一过程,例如缓存已经匹配并排序好的`Advisor`链。 - **动态性**:在某些场景下,`Advisor`的集合可能会在应用运行时动态变化。`AdvisorChainFactory`需要能够感知这些变化,并相应地更新其内部状态或缓存。 - **异常处理**:在构建`Advisor`链的过程中,可能会遇到各种异常情况(如`Pointcut`表达式解析错误、`Advisor`实例创建失败等)。`AdvisorChainFactory`需要妥善处理这些异常,避免影响到整个应用的稳定性。 #### 结论 `AdvisorChainFactory`作为Spring AOP中`Advisor`链构建机制的核心接口,其实现对于实现灵活、高效的切面编程至关重要。通过合理设计`AdvisorChainFactory`的实现策略,我们可以根据实际需求构建出既满足功能要求又具有良好性能的`Advisor`链。在实际应用中,我们还需要考虑性能优化、动态性以及异常处理等因素,以确保`AdvisorChainFactory`能够稳定、高效地运行。
上一篇:
AopProxyFactory配置管理器 - AdvisedSupport
下一篇:
目标对象来源接口与实现 - TargetSource
该分类下的相关小册推荐:
Java语言基础11-Java中的泛型
SpringBoot合辑-初级篇
Java高并发秒杀入门与实战
Java语言基础5-面向对象初级
Mybatis合辑5-注解、扩展、SQL构建
深入拆解 Java 虚拟机
Java语言基础13-类的加载和反射
Java并发编程实战
Java语言基础3-流程控制
Java语言基础7-Java中的异常
Java必知必会-Maven初级
Java语言基础8-Java多线程