详解Spring AOP篇一 - 指南

目录

AOP

Spring AOP引入

使用Spring AOP

引入AOP依赖

编写AOP程序

Aspect

TestController

 运行结果

对上面的注解和方法的介绍

AOP面向切面编程的优势


AOP

AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC)。

那么什么是AOP呢?

AOP是Aspect Oriented Programming(⾯向切⾯编程)的缩写。

那么什么是⾯向切⾯编程呢?

切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程.

那么什么是Spring AOP呢?

AOP是⼀种思想, 它的实现⽅法有很多, 有Spring AOP,也有AspectJ、CGLIB等.
Spring AOP是其中的⼀种实现⽅式.

Spring AOP引入

我们现在有⼀个项⽬, 项⽬中开发了很多的业务功能:、

现在有⼀些业务的执⾏效率⽐较低, 耗时较⻓, 我们需要对接⼝进⾏优化.

第⼀步就需要定位出执⾏耗时⽐较⻓的业务⽅法, 再针对该业务⽅法来进⾏优化

如何定位呢? 我们就需要统计当前项⽬中每⼀个业务⽅法的执⾏耗时.

如何统计呢? 可以在业务⽅法运⾏前和运⾏后, 记录下⽅法的开始时间和结束时间, 两者之差就是这个⽅法的耗时。
这种⽅法是可以解决问题的, 但⼀个项⽬中会包含很多业务模块, 每个业务模块⼜有很多接⼝, ⼀个接⼝⼜包含很多⽅法, 如果我们要在每个业务⽅法中都记录⽅法的耗时, 对于程序员⽽⾔, 会增加很多的⼯作量.

AOP就可以做到在不改动这些原始⽅法的基础上, 针对特定的⽅法进⾏功能的增强.

AOP的作⽤:在程序运⾏期间在不修改源代码的基础上对已有⽅法进⾏增强(⽆侵⼊性: 解耦)。

使用Spring AOP

引入AOP依赖
在pom.xml文件中添加配置
    org.springframework.boot
    spring-boot-starter-aop
编写AOP程序
Aspect
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Aspect
public class AspectTest {
/**
* 记录⽅法耗时
*/
@Around("execution(* com.wmh.springaop.controller.*.*(..))")
public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
//记录⽅法执⾏开始时间
long begin = System.currentTimeMillis();
//执⾏原始⽅法
Object result = pjp.proceed();
//记录⽅法执⾏结束时间
long end = System.currentTimeMillis();
//记录⽅法执⾏耗时
log.info(pjp.getSignature() + "执⾏耗时: {}ms", end - begin);
return result;
}
}
TestController
package com.wmh.springaop.controller;
import com.wmh.springaop.config.MyAspect;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequestMapping("/test")
@RestController
public class TestController {
@RequestMapping("/t1")
public String t1(){
log.info("执行t1方法...");
return "t1";
}
}
 运行结果

对上面的注解和方法的介绍

1. @Aspect: 标识这是⼀个切⾯类
2. @Around: 环绕通知, 在⽬标⽅法的前后都会被执⾏. 后⾯的表达式表⽰对哪些⽅法进⾏增强.
3. ProceedingJoinPoint.proceed() 让原始⽅法执⾏

整个代码划分为三部分:

方法执行前逻辑;

原始方法执行;

方法执行后逻辑。

我们通过AOP⼊⻔程序完成了业务接⼝执⾏耗时的统计.

AOP面向切面编程的优势

1. 关注点分离
提高代码清晰度:AOP通过引入“切面”的概念,将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,使得业务逻辑更加清晰、专注于核心功能。
降低耦合度:横切关注点与业务逻辑的分离,降低了不同模块之间的耦合度,提高了系统的模块化和可维护性。
2. 代码重用
提高开发效率:通过封装横切关注点为可重用的切面,避免了在多个模块中重复编写相同的辅助功能代码,提高了开发效率。
减少冗余代码:切面可以在多个位置被重用,减少了代码冗余,使代码更加简洁。
3. 系统可维护性增强
集中管理:将横切关注点封装在切面中,使得对这些功能的修改和增强可以在单一位置进行,简化了维护工作。
降低维护成本:由于关注点分离和代码重用,减少了因修改而引入新错误的风险,降低了系统的维护成本。
4. 灵活性提高
动态代理:AOP通常通过动态代理技术实现,在运行时动态地将切面应用到目标对象上,这使得系统具有更高的灵活性。开发者可以根据实际需求,动态地添加或移除切面。
易于扩展:当需要添加新的横切关注点时,只需定义新的切面并将其应用到相应的位置即可,无需修改现有的业务逻辑代码。
5. 易于测试
单元测试:由于业务逻辑中不再包含非核心代码(如日志记录、安全检查等),单元测试可以更加聚焦于业务功能本身,提高了测试的准确性和效率。
模拟特定情况:一些切面可能直接被禁用或用测试特定的实现替代,以便在测试环境中模拟特定情况。
6. 支持事务管理
简化事务处理:AOP提供了一种简化的事务管理机制,通过定义事务管理切面,可以轻松地声明哪些方法需要事务支持,同时避免了在业务代码中混入事务管理逻辑。

posted @ 2025-09-08 14:26  yjbjingcha  阅读(8)  评论(0)    收藏  举报