首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java外功精要——Spring AOP

Java外功精要——Spring AOP

原创
作者头像
搜罗万相
发布2025-10-31 08:52:57
发布2025-10-31 08:52:57
3290
举报
文章被收录于专栏:Java开发Java开发

Java外功精要——Spring AOP

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它能够帮助开发者将横切关注点(如日志、事务、安全等)与业务逻辑分离,提高代码的模块化程度和可维护性。

AOP核心概念

  1. 切面(Aspect): 横切关注点的模块化,如日志切面、事务切面
  2. 连接点(Join Point): 程序执行过程中的某个特定点,如方法调用、字段访问
  3. 通知(Advice): 切面在特定连接点执行的动作,分为前置、后置、环绕、异常、最终通知
  4. 切入点(Pointcut): 匹配连接点的断言,决定哪些连接点会被通知
  5. 引入(Introduction): 向现有类添加新方法或字段
  6. 目标对象(Target Object): 被一个或多个切面通知的对象
  7. AOP代理(AOP Proxy): Spring创建的代理对象,用于实现切面契约
  8. 织入(Weaving): 将切面应用到目标对象并创建代理对象的过程

Spring AOP通知类型

  • @Before: 目标方法执行前执行
  • @AfterReturning: 目标方法正常返回后执行
  • @AfterThrowing: 目标方法抛出异常后执行
  • @After: 目标方法执行后无论结果如何都执行(类似于finally)
  • @Around: 围绕目标方法执行,可控制方法执行时机

实现示例

下面是一个使用Spring AOP实现日志记录的示例:

切入点表达式详解

Spring AOP使用AspectJ的切入点表达式语言,基本格式:

代码语言:javascript
复制
execution(修饰符? 返回值 包名.类名.?方法名(参数) 异常?)

常用通配符:

  • ​*​​: 匹配任意字符,但只能匹配一个元素
  • ​..​​: 匹配任意字符,可以匹配多个元素,在类路径中表示当前包及其子包,在方法参数中表示任意参数
  • ​+​​: 匹配指定类及其子类

示例:

  • ​execution(* com.example.service.*.*(..))​​: 匹配service包下所有类的所有方法
  • ​execution(public * *(..))​​: 匹配所有公共方法
  • ​execution(* com.example.service.UserService+.*(..))​​: 匹配UserService及其子类的所有方法

Spring AOP的实现原理

Spring AOP默认使用动态代理实现:

  1. 当目标对象实现了接口时,使用JDK动态代理
  2. 当目标对象没有实现接口时,使用CGLIB代理

开发者也可以通过配置强制使用CGLIB代理:

代码语言:javascript
复制
@EnableAspectJAutoProxy(proxyTargetClass = true)

AOP的实际应用场景

  1. 日志记录: 记录方法调用、参数、返回值等
  2. 事务管理: 控制事务的开启、提交、回滚
  3. 安全检查: 权限验证、身份认证
  4. 性能监控: 统计方法执行时间
  5. 异常处理: 统一异常捕获和处理
  6. 缓存实现: 方法结果缓存

通过Spring AOP,我们可以将这些横切关注点从业务逻辑中抽离出来,使代码更加清晰、专注于核心业务功能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java外功精要——Spring AOP
    • AOP核心概念
    • Spring AOP通知类型
    • 实现示例
    • 切入点表达式详解
    • Spring AOP的实现原理
    • AOP的实际应用场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档