题目
简述Spring AOP的核心概念及基本用法
信息
- 类型:问答
- 难度:⭐
考点
AOP基本概念,切面定义,切入点表达式
快速回答
Spring AOP的核心概念包括:
- 切面(Aspect):封装横切关注点的模块(使用@Aspect注解的类)
- 连接点(Join Point):程序执行过程中的可插入点(如方法调用)
- 切入点(Pointcut):定义哪些连接点会被拦截(通过表达式指定)
- 通知(Advice):切面在特定连接点执行的动作(如@Before)
基本用法步骤:1) 添加spring-boot-starter-aop依赖;2) 定义@Aspect类;3) 使用@Pointcut定义切入点;4) 添加通知方法。
解析
1. 核心概念原理说明
AOP(面向切面编程)通过代理模式实现,将横切关注点(如日志、事务)与业务逻辑分离:
- 切面:将横切功能模块化的类(如日志记录器)
- 连接点:Spring AOP仅支持方法级别的连接点
- 切入点:使用AspectJ表达式定位方法,如
execution(* com.example.service.*.*(..)) - 通知类型:
- @Before:方法执行前
- @AfterReturning:方法成功返回后
- @AfterThrowing:方法抛出异常后
- @After:方法结束后(finally块)
- @Around:包裹整个方法
2. 代码示例
// 1. 启用AOP(Spring Boot自动配置)
// 2. 定义切面
@Aspect
@Component
public class LoggingAspect {
// 3. 定义切入点:拦截service包下所有方法
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}
// 4. 前置通知
@Before("serviceMethods()")
public void logMethodCall(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("调用方法: " + methodName);
}
}3. 最佳实践
- 将切面类放入独立包(如aop)保持代码整洁
- 使用
within()限定包范围提高性能:@Pointcut("within(com.example.service..*)") - 优先使用@Around实现复杂逻辑,但需调用
proceed()继续原始方法 - 在通知方法中使用
JoinPoint参数获取方法上下文信息
4. 常见错误
- 忘记添加
@EnableAspectJAutoProxy(Spring Boot项目可省略) - 切入点表达式错误:如拼写错误
excution(正确应为execution) - 未将切面类注册为Spring Bean(缺少@Component)
- 在同一个切面内通知执行顺序问题:使用@Order注解控制
5. 扩展知识
- 代理机制:Spring AOP默认使用JDK动态代理(需实现接口),无接口时用CGLIB
- AspectJ vs Spring AOP:Spring AOP更简单但仅支持方法拦截,AspectJ功能更全面
- 切入点指示符:
@annotation:拦截特定注解的方法bean:按Bean名称匹配(如bean(*Service))