首页
技术小册
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 编程思想(上)
### 编程方式创建 @AspectJ 代理 在Spring框架中,面向切面编程(AOP, Aspect-Oriented Programming)是一种强大的编程范式,它允许开发者将横切关注点(如日志记录、事务管理、安全检查等)从业务逻辑中分离出来,以提高代码的可维护性和可重用性。Spring AOP通过使用代理模式来实现AOP,其中,`@AspectJ`是Spring AOP中广泛采用的一种语法风格,它借鉴了AspectJ的注解,使得在Spring应用中定义切面变得简单而直观。 本章节将深入探讨如何在Spring应用中编程方式创建`@AspectJ`代理,涵盖从理论基础到实践操作的全方位解析。 #### 1. 理解AOP与代理模式 在深入探讨`@AspectJ`代理之前,首先需要理解AOP的基本概念和代理模式在AOP中的应用。AOP通过横切关注点将应用划分为不同的部分(称为切面),这些切面可以在应用的多个地方被应用,而无需修改原有的业务代码。代理模式是实现AOP的一种常用技术,它通过在目标对象周围包裹一个代理对象,来控制对目标对象的访问,并在访问前后添加额外的处理逻辑。 在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。JDK动态代理依赖于接口,适用于实现了接口的类;而CGLIB代理则不依赖于接口,通过继承目标类来创建代理,适用于没有实现接口的类。 #### 2. `@AspectJ`简介 `@AspectJ`是Spring AOP对AspectJ语言特性的简化版,它允许开发者使用注解来定义切面、通知(advice)、切入点(pointcut)等AOP概念。通过`@Aspect`注解,Spring能够识别哪些类包含切面定义。`@Aspect`注解的类内部,可以使用`@Before`、`@After`、`@AfterReturning`、`@AfterThrowing`、`@Around`等注解来定义不同类型的通知,并通过切入点表达式指定通知应用的范围。 #### 3. 编程方式创建`@AspectJ`代理的步骤 ##### 3.1 定义切面 首先,需要定义一个切面,这个切面类通过`@Aspect`注解标识,并在其中定义通知和切入点。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBeforeMethod(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } // 其他通知定义... } ``` 在上面的例子中,`LoggingAspect`是一个切面类,它定义了一个前置通知`logBeforeMethod`,该通知会在`com.example.service`包下所有类的所有方法执行前执行。 ##### 3.2 配置Spring以启用AOP 要使Spring识别并使用`@AspectJ`切面,需要在Spring配置中启用AOP支持。这可以通过在配置类上添加`@EnableAspectJAutoProxy`注解来实现,或者在XML配置文件中配置相应的AOP支持。 ```java @Configuration @EnableAspectJAutoProxy @ComponentScan(basePackages = "com.example") public class AppConfig { // 配置类内容... } ``` ##### 3.3 编程方式创建代理(可选) 虽然在实际应用中,Spring容器会自动为被`@Aspect`注解的类创建代理,但了解如何手动创建代理也是有益的,特别是在某些特殊场景下(如测试)。 手动创建`@AspectJ`代理通常需要借助`ProxyFactory`或`AspectJProxyFactory`类(后者更适用于`@AspectJ`切面)。以下是一个使用`AspectJProxyFactory`创建代理的示例: ```java import org.springframework.aop.framework.autoproxy.ClassFilter; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.target.SingletonTargetSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Component public class ProxyCreator { @Autowired private LoggingAspect loggingAspect; public Object createProxy(Object target) { AspectJProxyFactory proxyFactory = new AspectJProxyFactory(target); // 创建一个切入点表达式 String pointcutExpression = "execution(* com.example.service.*.*(..))"; // 创建一个顾问(Advisor),将切入点与通知绑定 DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(new AspectJExpressionPointcut(pointcutExpression), loggingAspect.getClass().getMethod("logBeforeMethod", JoinPoint.class)); // 将顾问添加到代理工厂 proxyFactory.addAdvisor(advisor); // 创建代理实例 return proxyFactory.getProxy(); } // 确保LoggingAspect中的方法可以通过反射访问(如果需要) // 通常情况下,由于Spring管理,这一步是自动完成的 } ``` **注意**:上述代码示例主要用于演示目的,并非实际推荐做法。在Spring应用中,通常不需要手动创建代理,因为Spring容器会自动处理这些工作。 #### 4. 注意事项与最佳实践 - **性能考虑**:虽然AOP提高了代码的模块化和可维护性,但它也引入了一定的性能开销。因此,在性能敏感的应用中,应谨慎使用AOP,并考虑使用其他替代方案。 - **切入点表达式的准确性**:确保切入点表达式准确无误,以避免不必要的性能损耗或逻辑错误。 - **通知的顺序**:如果一个方法被多个切面或多个通知所拦截,那么这些通知的执行顺序可能是重要的。Spring允许通过`@Order`注解或实现`Ordered`接口来控制通知的执行顺序。 - **切面的独立性**:尽量保持切面的独立性,避免切面之间产生复杂的依赖关系,以便于维护和测试。 #### 5. 结论 编程方式创建`@AspectJ`代理虽然不是Spring AOP的常规用法,但了解这一过程有助于深入理解Spring AOP的工作原理和代理机制。在实际开发中,我们更多地依赖于Spring容器自动管理AOP代理,但了解手动创建代理的方法可以为我们解决特定问题提供额外的灵活性。通过合理设计切面和切入点表达式,我们可以充分利用Spring AOP的强大功能,提升应用的模块化和可维护性。
上一篇:
@AspectJ注解驱动
下一篇:
XML配置驱动 - 创建AOP代理
该分类下的相关小册推荐:
手把手带你学习SpringBoot-零基础到实战
Java语言基础15-单元测试和日志技术
Mybatis合辑3-Mybatis动态SQL
SpringBoot合辑-初级篇
Java语言基础11-Java中的泛型
Java语言基础14-枚举和注解
JAVA 函数式编程入门与实践
Java语言基础12-网络编程
SpringBoot零基础到实战
Mybatis合辑2-Mybatis映射文件
Java并发编程实战
Java语言基础9-常用API和常见算法