作者:痴情季豪_726 | 来源:互联网 | 2024-11-13 14:07
自从引入AspectJ风格的切面配置后,Spring的切面配置变得更加简洁和强大。然而,AspectJ的切点表达式语法可能对初学者来说有些复杂。本文将详细介绍切点表达式的常见用法和示例。
### 常见的切点定义方式
定义切点主要有两种方式:
1. **使用正则表达式**
2. **使用AspectJ表达式**
#### 使用AspectJ表达式
下面是一些常见的AspectJ切点表达式示例:
##### 示例1:对Service包中所有方法的切面配置
```xml
```
##### 示例2:事务管理器配置
```xml
```
##### 示例3:事务配置
```xml
```
##### 示例4:编程式事务模板
```xml
```
#### 使用正则表达式
使用正则表达式定义切点的步骤如下:
1. **创建通知**
在Spring配置文件中添加通知配置。
2. **定义切点和通知者**
使用正则表达式定义切点。
```xml
```
### 切点表达式的语法
Spring AOP用户经常使用`execution`切入点指示符。执行表达式的格式如下:
```
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
```
除了返回类型模式(`ret-type-pattern`)、名字模式和参数模式以外,所有的部分都是可选的。返回类型模式决定了方法的返回类型必须依次匹配一个连接点。最常用的返回类型模式是`*`,表示匹配任意返回类型。全限定的类型名将只会匹配返回给定类型的方法。
- **名字模式**:匹配方法名,可以使用`*`通配符。
- **参数模式**:`()`匹配没有参数的方法,`(..)`匹配任意数量参数的方法,`(*)`匹配一个任意类型的参数,`(*, String)`匹配两个参数,第一个可以是任意类型,第二个必须是`String`类型。
### 常见的切点表达式示例
- **任意公共方法的执行**:`execution(public * *(..))`
- **任意以“set”开头的方法的执行**:`execution(* set*(..))`
- **AccountService接口定义的任意方法的执行**:`execution(* com.xyz.service.AccountService.*(..))`
- **在service包中定义的任意方法的执行**:`execution(* com.xyz.service.*.*(..))`
- **在service包或其子包中定义的任意方法的执行**:`execution(* com.xyz.service..*.*(..))`
- **在service包中的任意连接点**:`within(com.xyz.service.*)`
- **在service包或其子包中的任意连接点**:`within(com.xyz.service..*)`
- **实现了AccountService接口的代理对象的任意连接点**:`this(com.xyz.service.AccountService)`
- **实现AccountService接口的目标对象的任意连接点**:`target(com.xyz.service.AccountService)`
- **只接受一个Serializable参数的任意连接点**:`args(java.io.Serializable)`
- **目标对象中有一个@Transactional注解的任意连接点**:`@target(org.springframework.transaction.annotation.Transactional)`
- **目标对象声明的类型有一个@Transactional注解的任意连接点**:`@within(org.springframework.transaction.annotation.Transactional)`
- **执行的方法有一个@Transactional注解的任意连接点**:`@annotation(org.springframework.transaction.annotation.Transactional)`
- **只接受一个具有@Classified注解的参数的任意连接点**:`@args(com.xyz.security.Classified)`
- **在名为'tradeService'的Spring bean之上的任意连接点**:`bean(tradeService)`
- **在名字匹配通配符表达式'*Service'的Spring bean之上的任意连接点**:`bean(*Service)`
通过这些示例,开发者可以更好地理解和应用Spring AOP中的切点表达式。