首页
技术小册
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 编程思想(上)
### 章节:Introduction与Advice连接器 - IntroductionAdvisor #### 引言 在深入探讨Spring AOP(面向切面编程)的广阔领域时,理解其核心组件及它们之间的相互作用是至关重要的。本章将聚焦于“Introduction与Advice连接器 - IntroductionAdvisor”,这一关键概念不仅连接了Spring AOP的两大基石——Advice(增强)与Introduction(引入),还揭示了如何通过IntroductionAdvisor机制灵活地将新的接口或能力注入到目标对象中,而无需修改这些对象的源代码。这一特性极大地增强了Spring AOP的灵活性和可扩展性,使得开发者能够在不破坏原有系统结构的前提下,为系统添加新的功能或行为。 #### 一、Spring AOP概览 在深入探讨IntroductionAdvisor之前,有必要先对Spring AOP有一个基本的了解。Spring AOP是Spring框架中用于实现面向切面编程(AOP)的模块。AOP允许开发者将横切关注点(如日志、事务管理、安全检查等)从业务逻辑中分离出来,从而提高代码的可维护性和复用性。Spring AOP通过代理模式(Proxy Pattern)实现,可以在运行时动态地将增强(Advice)应用到目标对象上。 #### 二、Advice的基本概念 Advice是Spring AOP中的一个核心概念,它代表了一个切面中的增强逻辑。根据增强的应用时机和方式,Advice可以分为多种类型,如前置增强(Before Advice)、后置增强(After Advice,包括After Returning和After Throwing)、环绕增强(Around Advice)等。Advice定义了切面的“做什么”,但它本身并不决定何时以及如何将增强应用到目标对象上,这需要借助连接点(JoinPoint)、切点(Pointcut)等概念来实现。 #### 三、Introduction:超越增强的能力 虽然Advice为Spring AOP提供了强大的增强机制,但有时候我们可能需要为目标对象引入新的接口或方法,而不仅仅是修改其现有方法的行为。这就是Introduction的用武之地。Introduction允许我们在不修改类定义的情况下,向目标类动态地添加接口实现。这意味着,即使一个类没有实现某个特定的接口,我们也可以通过AOP的方式让它“看起来”像是实现了该接口,从而可以将其视为该接口类型的实例进行使用。 #### 四、IntroductionAdvisor:连接Advice与Introduction的桥梁 IntroductionAdvisor是Spring AOP中用于连接Advice和Introduction的特殊类型的Advisor。它不仅指定了切点(决定哪些方法或类将被增强),还定义了要引入的接口及其实现。换句话说,IntroductionAdvisor既包含了何时以及如何应用增强的逻辑(通过切点),也包含了要引入哪些新接口及其实现的细节。 ##### 4.1 结构解析 从结构上看,IntroductionAdvisor继承自Advisor接口,并通常实现了IntroductionInterceptor接口(或其子接口)。Advisor接口定义了切点信息(通过Pointcut属性),而IntroductionInterceptor接口则提供了引入接口及其实现的具体方法。因此,一个典型的IntroductionAdvisor实现会包含以下几个关键部分: - **切点(Pointcut)**:定义了哪些目标对象或方法将被增强。 - **引入的接口(Introduced Interface)**:指定了要为目标对象引入的新接口。 - **接口实现(Interface Implementation)**:提供了引入接口的具体实现。 - **增强逻辑(Advice Logic)**(可选):虽然IntroductionAdvisor主要用于引入接口,但它也可以包含一些增强逻辑,这些逻辑会在引入接口的同时被应用。 ##### 4.2 使用场景 IntroductionAdvisor在多种场景下都能发挥重要作用,包括但不限于: - **接口动态实现**:当需要为目标对象动态添加新的接口实现时,而又不希望或不能修改其源代码。 - **能力扩展**:为现有系统添加新的功能或服务,而无需修改现有代码库。 - **框架集成**:在集成第三方框架或服务时,可能需要让系统中的某些对象实现特定的接口以满足框架要求。 ##### 4.3 示例:使用IntroductionAdvisor引入日志接口 假设我们有一个系统,其中的业务对象需要记录操作日志,但我们不希望直接修改这些业务对象的代码来添加日志记录功能。此时,我们可以定义一个日志接口`Loggable`,并通过IntroductionAdvisor将该接口引入到需要日志记录的业务对象中。 ```java public interface Loggable { void log(String message); } // Loggable接口的默认实现 public class DefaultLoggable implements Loggable { public void log(String message) { System.out.println("Logging: " + message); } } // IntroductionAdvisor实现 public class LoggingIntroductionAdvisor extends DefaultIntroductionAdvisor implements IntroductionInterceptor { private static final Class<?>[] INTRODUCED_INTERFACES = new Class<?>[]{Loggable.class}; @Override public Class<?>[] getInterfaces() { return INTRODUCED_INTERFACES; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { // 在这里可以添加前置、后置等增强逻辑,但主要目的是引入接口 // 假设我们只是简单调用原始方法 Object result = invocation.proceed(); // 假设在某些条件下需要记录日志 if (invocation.getMethod().getName().startsWith("perform")) { // 获取引入的Loggable接口的代理实现 Loggable loggable = (Loggable) Proxy.getInvocationHandler(invocation.getThis()).getTarget(); loggable.log("Operation performed: " + invocation.getMethod().getName()); } return result; } // 其他必要的配置和初始化代码... } ``` 请注意,上述代码仅为示例,实际使用中可能需要结合Spring AOP的配置和代理机制来正确设置和使用IntroductionAdvisor。 #### 五、总结 通过本章的探讨,我们深入理解了Introduction与Advice连接器——IntroductionAdvisor在Spring AOP中的作用和重要性。IntroductionAdvisor不仅为Spring AOP提供了强大的接口引入能力,还通过其灵活的切点配置和增强逻辑,使得开发者能够在不破坏原有系统结构的情况下,为系统添加新的功能或行为。这一特性极大地提高了系统的可扩展性和可维护性,是Spring AOP不可或缺的一部分。
上一篇:
Pointcut与Advice连接器 - PointcutAdvisor
下一篇:
Advisor的Interceptor适配器 - AdvisorAdapter
该分类下的相关小册推荐:
Mybatis合辑3-Mybatis动态SQL
java源码学习笔记
Java必知必会-Maven初级
Mybatis合辑4-Mybatis缓存机制
Java语言基础13-类的加载和反射
Java语言基础3-流程控制
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础1-基础知识
Java语言基础15-单元测试和日志技术
Java语言基础16-JDK8 新特性
Spring Cloud微服务项目实战
Java语言基础14-枚举和注解