Spring AOP

SpringAOP

Spring AOP
AOP指的是“面向切面的编程”。

AOP并不是Spring框架的特征,只不过Spring提供了很好的支持,使得AOP更易于实现。

在使用Spring AOP之前,需要添加AOP相关的依赖:

aspectj aspectjweaver 1.5.4 aspectj aspectjtools 1.5.4 接下来,需要创建cn.tedu.store.aop.TimeElapsedAspect切面类,该切面类的对象将由Spring框架进行管理,所以,必须在cn.tedu.store包下,并且,需要添加@Component和@Aspect注解:

@Component
@Aspect
public class TimeElapsedAspect {

}
然后,在类中添加切面方法,关于切面方法:

应该使用public权限;

可以使用void作为返回值类型,如果是@Around必须使用Object作为返回值类型;

方法名称可以自由定义;

参数根据切面的作用范围来决定,例如使用@Around时必须添加ProceedingJoinPoint参数。

所以,在切面类中添加切面方法:

public void process(ProceedingJoinPoint pjp) throws Throwable {
// 记录起始时间
long start = System.currentTimeMillis();

// 执行任务
pjp.proceed();

// 记录结束时间
long end = System.currentTimeMillis();

// 统计耗时
System.err.println("耗时:" + (end - start) + "ms.");

}
最后,还应该确定该切面方法的作用范围,即何时、哪些处理流程中,需要应用这个切面!

根据作用范围,可以使用@Before、@After,或使用@Around表示在应用的方法之前和之后都需要执行某些任务。

然后,还需要在@Around注解中配置参数,以决定切面应用于哪里,例如:

@Around(“execution(* cn.tedu.store.service.impl..(…))”)
以上表达式表示将切面应用于cn.tedu.store.service.impl包下所有的类中的所有方法!

至此,对于应用范围之内所有返回值类型为void的业务方法都可以正常应用切面,如果需要保证其它业务方法也能正常运行,则需要获取方法执行时的返回值,例如:

// 执行任务
Object obj = pjp.proceed();
并且,整个切面方法也需要将返回值类型设置为Object,并在方法运行结束之前返回以上结果。

使用@Before表示切面将存于某位置之前,使用@After表示切面将存在于某位置之后,通常,使用@Around可以完全取代@Before或@After!

###Spring AOP 的概念 AOP(Aspect-Oriented Programming)即面向切面编程,是一种编程范式,旨在通过分离横切关注点来提高模块化程度。在 Spring 框架中,AOP 被广泛用于实现诸如日志记录、事务管理、安全性等通用功能,这些功能通常与业务逻辑无关但又需要在多个地方重复使用。 Spring AOP 主要是基于 AspectJ 实现的,尽管 AspectJ 是一个独立的 AOP 框架,并不是 Spring 的组成部分,但它通常与 Spring 一起使用以提供更强大的 AOP 功能[^1]。Spring AOP 支持两种方式来定义切面:基于 XML 配置文件的方式和基于注解的方式。 ###Spring AOP 的原理 Spring AOP 使用运行时代理来实现 AOP 功能,这意味着它会在运行时动态生成代理对象。对于实现了接口的类,Spring AOP 默认使用 JDK 动态代理;而对于没有实现接口的类,则会使用 CGLIB 代理[^4]。这种方式允许在不修改原始代码的情况下向程序中添加新的行为。 织入(Weaving)是将增强(advice)应用到目标对象的过程,Spring AOP 在运行时进行织入操作[^3]。当创建了代理对象后,所有对目标对象方法的调用都会被拦截,并且可以插入额外的操作,比如在方法执行前后做一些处理。 ###Spring AOP 的使用教程 要开始使用 Spring AOP,首先需要确保项目中包含了必要的依赖。如果使用 Maven 构建工具,可以在 `pom.xml` 文件中加入如下依赖: ```xml <!-- 引入aop依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 一旦添加了依赖并刷新了 Maven 项目,就可以开始编写切面了。下面是一个简单的例子,展示如何使用注解来定义一个切面: ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method " + joinPoint.getSignature().getName() + " is called."); } } ``` 在这个示例中,`LoggingAspect` 类被标记为 `@Aspect` 和 `@Component` 注解,这样 Spring 就能识别这是一个切面组件。`@Before` 注解指定了在哪些方法上应用前置通知(before advice),这里的表达式表示匹配 `com.example.service` 包下所有的方法。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值