切面编程的锋芒:Spring切入点的玩法与技巧

简介: 切面编程的锋芒:Spring切入点的玩法与技巧


切入点

Spring 的切入点是一种 AOP 中的基本概念,它定义了在哪些连接点上进行通知(Advice)的匹配规则。Spring AOP 支持基于正则表达式、AspectJ 注解等多种方式定义切入点。示例如下:

<bean id="around" class="world.xuewei.proxy.Around"/>
<!-- 配置动态代理 -->
<aop:config>
    <!-- 所有方法都作为切入点,加入额外功能 -->
    <aop:pointcut id="p1" expression="execution(* *(..))"/>
    <!-- 整合组装 -->
    <aop:advisor advice-ref="around" pointcut-ref="p1"/>
</aop:config>

表达式的规则为

execution(返回类型 包名.类名.方法名(参数列表))

  1. 返回类型:表示方法的返回类型或通配符。
  • *:匹配任意返回类型。
  • void:匹配 void 返回类型。
  • java.lang.String:匹配具体的返回类型,如果是 java.lang 包下的可以省略包路径,否则需要写明。
  1. 包名:表示方法所在的包名或通配符。
  • *:匹配所有包。
  • com.example.service:匹配指定的包名。
  • com.example.service.*:匹配 com.example.service 包下的所有类。
  • com.example.service..*.*:匹配 com.example.service 包以及子包下的所有类。
  • com.example.*.service:匹配 com.example 及其子包中的所有 service 包下的类。
  1. 类名:表示方法所在的类名或通配符。
  • *:匹配所有类。
  • UserService:匹配指定的类名。
  • *Service:匹配以 Service 结尾的所有类。
  • com.example..*.*Service:匹配 com.example 及其子包中以 Service 结尾的类。
  1. 方法名:表示方法的名称或通配符。
  • *:匹配所有方法。
  • getUser:匹配指定的方法名。
  • get*:匹配以 get 开头的所有方法名。
  • *User:匹配以 User 结尾的所有方法名。
  1. 参数列表:表示方法的参数类型或通配符。
  • ():匹配没有参数的方法。
  • (..):匹配任意参数个数和类型的方法。
  • (java.lang.String):匹配只有一个String类型参数的方法。如果是 java.lang 包下的可以省略包路径,否则需要写明。
  • (java.lang.String, *):匹配第一个参数为String类型,第二个参数为任意类型的方法。如果是 java.lang 包下的可以省略包路径,否则需要写明。
  • (java.lang.String, ..):匹配第一个参数为String类型,后面任意多个(可包含没有)参数。如果是 java.lang 包下的可以省略包路径,否则需要写明。

通过组合以上不同的部分,可以构建出灵活的切入点表达式,以满足各种不同的 AOP 需求。

需要注意的是,在编写切入点表达式时,可以使用通配符 * 匹配任意字符(但不包括路径分隔符/),使用 .. 匹配任意多层路径。同时,切入点表达式不区分大小写。

切入点函数

切入点函数用于执行切入点表达式,execution 可以提供非常丰富的切入点写法,但是写起来非常的麻烦。

  • execution:匹配方法执行的连接点,支持通配符、正则表达式和类型限定符等。
  • 示例:execution(* com.example.service.*.*(..))
  • within:匹配指定类型内部的所有连接点。主要用于包、类切入点表达式的匹配。
  • 示例:within(com.example.service.*)
  • this:匹配当前代理对象的实例类型。
  • 示例:this(com.example.service.AServiceImpl)
  • target:匹配目标对象类的类型。
  • 示例:target(com.example.service.BService)
  • args:匹配传入方法的参数类型。
  • 示例:args(java.lang.String, ..)
  • @annotation:匹配使用特定注解修饰的方法。
  • 示例:@annotation(org.springframework.transaction.annotation.Transactional)
  • bean:匹配指定名称的bean。
  • 示例:bean(someBean)

切入点函数的逻辑运算

整合多个切⼊点函数⼀起配合⼯作,完成更为复杂的需求。

and

execution(* login(..)) and execution(* register(..))

or

execution(* login(..)) or execution(* register(..))


相关文章
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
445 0
|
4月前
|
Java API 开发者
Spring 控制反转与依赖注入:从玄学编程到科学管理
在传统开发中,手动`new`对象导致紧耦合、难以维护和测试。控制反转(IoC)将对象创建交给框架,实现解耦。Spring通过IOC容器自动管理对象生命周期,开发者只需声明依赖,无需关心创建细节。依赖注入(DI)是IoC的具体实现方式,支持构造器、Setter和字段注入。构造器注入推荐使用,保证依赖不可变且易于测试。对于多个同类型Bean,可用`@Qualifier`或`@Primary`解决冲突。此外,Spring还支持依赖查找(DL),开发者主动从容器获取Bean,适用于动态场景,但侵入性强。掌握IoC与DI,有助于构建灵活、可维护的Spring应用。
|
2月前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
10月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
743 25
|
11月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
556 2
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
9月前
|
Java API 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——Spring Boot 中的 AOP 处理
本文详细讲解了Spring Boot中的AOP(面向切面编程)处理方法。首先介绍如何引入AOP依赖,通过添加`spring-boot-starter-aop`实现。接着阐述了如何定义和实现AOP切面,包括常用注解如`@Aspect`、`@Pointcut`、`@Before`、`@After`、`@AfterReturning`和`@AfterThrowing`的使用场景与示例代码。通过这些注解,可以分别在方法执行前、后、返回时或抛出异常时插入自定义逻辑,从而实现功能增强或日志记录等操作。最后总结了AOP在实际项目中的重要作用,并提供了课程源码下载链接供进一步学习。
1105 0
|
9月前
|
Java 开发者 微服务
微服务——SpringBoot使用归纳——Spring Boot中的切面AOP处理——什么是AOP
本文介绍了Spring Boot中的切面AOP处理。AOP(Aspect Oriented Programming)即面向切面编程,其核心思想是分离关注点。通过AOP,程序可以将与业务逻辑无关的代码(如日志记录、事务管理等)从主要逻辑中抽离,交由专门的“仆人”处理,从而让开发者专注于核心任务。这种机制实现了模块间的灵活组合,使程序结构更加可配置、可扩展。文中以生活化比喻生动阐释了AOP的工作原理及其优势。
528 0
|
11月前
|
XML 监控 前端开发
Spring Boot中的WebFlux编程模型
Spring WebFlux 是 Spring Framework 5 引入的响应式编程模型,基于 Reactor 框架,支持非阻塞异步编程,适用于高并发和 I/O 密集型应用。本文介绍 WebFlux 的原理、优势及在 Spring Boot 中的应用,包括添加依赖、编写响应式控制器和服务层实现。WebFlux 提供高性能、快速响应和资源节省等优点,适合现代 Web 应用开发。
1295 15