首页
技术小册
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 编程思想(上)
### Java AOP设计模式:代理、判断和拦截器模式 在软件开发领域,面向切面编程(AOP, Aspect-Oriented Programming)是一种编程范式,旨在提高软件模块化程度,通过横切关注点(如日志、事务管理、安全等)的分离来简化开发。Java AOP通过代理(Proxy)机制、判断(Advice)逻辑以及拦截器(Interceptor)模式实现这一目标。本章将深入探讨这三种核心概念,在Spring AOP框架的上下文中,解析它们如何协同工作以构建灵活、可维护的软件系统。 #### 一、引言 在传统的面向对象编程(OOP)中,我们倾向于将功能划分为不同的类和对象,每个类负责特定的业务逻辑。然而,随着应用复杂度的增加,一些非业务功能(如日志记录、性能监控等)开始渗透到各个业务逻辑中,造成代码冗余和难以维护。AOP提供了一种解决方案,允许开发者将这些横切关注点从业务逻辑中分离出来,形成独立的“切面”,从而增强代码的模块性和复用性。 #### 二、代理模式在AOP中的应用 代理模式是一种设计模式,用于为其他对象提供一种代理以控制对这个对象的访问。在AOP中,代理是实现横切关注点的关键技术。Spring AOP主要支持两种代理方式:JDK动态代理和CGLIB代理。 ##### 2.1 JDK动态代理 JDK动态代理基于Java反射机制,它只能代理实现了接口的类。当客户端调用代理对象的方法时,动态代理在运行时动态地创建目标对象的代理实例,并在调用实际方法之前或之后插入额外的逻辑(即横切关注点)。 ```java // 目标接口 public interface HelloService { void sayHello(); } // 目标类 public class HelloServiceImpl implements HelloService { public void sayHello() { System.out.println("Hello, World!"); } } // 代理类 public class HelloServiceProxy implements InvocationHandler { private final Object target; public HelloServiceProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 前置逻辑 System.out.println("Before method: " + method.getName()); // 调用实际方法 Object result = method.invoke(target, args); // 后置逻辑 System.out.println("After method: " + method.getName()); return result; } } // 使用 HelloService proxy = (HelloService) Proxy.newProxyInstance( HelloService.class.getClassLoader(), new Class<?>[]{HelloService.class}, new HelloServiceProxy(new HelloServiceImpl()) ); proxy.sayHello(); ``` ##### 2.2 CGLIB代理 CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它允许在运行时扩展Java类和实现接口。与JDK动态代理不同,CGLIB能够代理没有实现接口的类。它通过继承目标类来创建代理对象,因此,CGLIB代理更加灵活,但也可能带来一些限制,如不能代理final类和方法。 #### 三、判断(Advice)逻辑 在AOP中,判断逻辑指的是在目标方法执行前后(或抛出异常时)插入的额外代码。Spring AOP支持多种类型的Advice,包括: - **Before Advice**:在目标方法执行前执行。 - **After Returning Advice**:在目标方法正常执行后执行。 - **After Throwing Advice**:在目标方法抛出异常后执行。 - **After (Finally) Advice**:无论目标方法是否成功执行,都会执行。 - **Around Advice**:最强大的Advice类型,它可以在目标方法执行前后插入逻辑,甚至可以决定是否执行目标方法本身。 ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println("After method: " + joinPoint.getSignature().getName() + " with result: " + result); } // 其他Advice类型示例略 } ``` #### 四、拦截器模式与AOP 拦截器模式是一种行为型设计模式,它允许在请求被处理之前或之后添加额外的处理逻辑。在AOP的上下文中,拦截器模式与Around Advice非常相似,都是围绕目标方法执行前后插入逻辑。不过,拦截器模式更侧重于在方法调用链中拦截请求,而AOP的Advice则更加专注于横切关注点的注入。 在Spring框架中,拦截器通常用于Web层,通过实现`HandlerInterceptor`接口来拦截HTTP请求。然而,在AOP层面,拦截器模式的思想被广泛应用于Advice的实现中,特别是在Around Advice中,它允许开发者完全控制目标方法的调用流程。 #### 五、AOP的优势与挑战 ##### 5.1 优势 - **提高模块性**:通过将横切关注点从业务逻辑中分离出来,AOP增强了代码的模块性。 - **减少冗余**:避免了在每个业务方法中重复编写相同的横切逻辑。 - **易于维护**:横切关注点的变化只需在切面中修改,无需修改业务逻辑代码。 ##### 5.2 挑战 - **性能开销**:代理和动态织入可能会引入一定的性能开销。 - **复杂性增加**:对于不熟悉AOP的开发者来说,理解切面和切点可能具有挑战性。 - **调试难度**:由于横切关注点与业务逻辑分离,调试时可能需要同时查看多个部分。 #### 六、结论 Java AOP通过代理模式、判断逻辑和拦截器模式等关键技术,实现了横切关注点的有效管理和复用。在Spring AOP框架的支持下,开发者可以更加灵活地构建模块化、可维护的软件系统。然而,要充分发挥AOP的优势,也需要注意其带来的性能开销和复杂性增加等问题。通过合理的使用AOP,我们可以在不牺牲系统性能的前提下,显著提升软件的质量和可维护性。
上一篇:
AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
下一篇:
Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
该分类下的相关小册推荐:
Java语言基础3-流程控制
SpringBoot合辑-高级篇
SpringBoot零基础到实战
Java语言基础14-枚举和注解
手把手带你学习SpringBoot-零基础到实战
Java语言基础12-网络编程
Java语言基础1-基础知识
SpringBoot合辑-初级篇
Java语言基础11-Java中的泛型
Java语言基础6-面向对象高级
Mybatis合辑3-Mybatis动态SQL
Spring AOP 编程思想(下)