切面编程的锋芒: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(..))


相关文章
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
25 1
|
1月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
48 0
|
3月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
3月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
51 0
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
51 0
|
3月前
|
Java Spring 供应链
Spring 框架事件发布与监听机制,如魔法风暴席卷软件世界,开启奇幻编程之旅!
【8月更文挑战第31天】《Spring框架中的事件发布与监听机制》介绍了Spring中如何利用事件发布与监听机制实现组件间的高效协作。这一机制像城市中的广播系统,事件发布者发送消息,监听器接收并响应。通过简单的示例代码,文章详细讲解了如何定义事件类、创建事件发布者与监听器,并确保组件间松散耦合,提升系统的可维护性和扩展性。掌握这一机制,如同拥有一把开启高效软件开发大门的钥匙。
46 0
|
4月前
|
Java Spring 容器
Spring问题之Spring AOP是如何实现面向切面编程的
Spring问题之Spring AOP是如何实现面向切面编程的
|
3月前
|
XML Java 数据库
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
|
4月前
|
Java Spring
Spring AOP(面向切面编程)详解
Spring AOP(面向切面编程)详解
|
4月前
|
开发框架 监控 Java
Spring Boot中的反应式编程最佳实践
Spring Boot中的反应式编程最佳实践