@pointcut 重多个切面
时间: 2023-09-21 16:12:50 浏览: 51
在面向切面编程(AOP)中,可以定义多个切面来捕获不同的关注点。这些切面可以同时应用于同一个目标对象,形成一个切面链。执行顺序由切面链中切面的优先级和顺序决定。在Spring AOP中,可以使用@Order注解来指定切面的执行顺序,数字越小的优先级越高。如果没有指定@Order,切面的默认优先级为最低。
相关问题
@Pointcut @Aspect与@Before结合使用
在Spring AOP中,@Pointcut和@Aspect注解一起使用可以定义切点和切面。@Pointcut注解定义了一个切点,而@Aspect注解定义了一个切面,切面包含了多个通知(Advice),例如@Before、@After、@AfterReturning、@AfterThrowing和@Around。
@Before通知是在目标方法执行前执行的通知,可以用来验证参数、记录日志等操作。要在@Before注解中指定切点表达式,以通知哪些方法执行该通知。
下面是一个示例:
```
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.example.service.UserService.addUser(..))")
public void addUserPointcut() {}
@Before("addUserPointcut()")
public void logBeforeAddUser(JoinPoint joinPoint) {
System.out.println("Before adding user...");
}
}
```
在上面的代码中,@Pointcut注解定义了一个切点,它匹配UserService类中的addUser方法。@Before注解指定了切点表达式addUserPointcut(),表示在addUser方法执行前执行logBeforeAddUser方法。
详细说明下@PointCut
在Spring AOP中,@Pointcut注解用于定义一个切入点,切入点是一组匹配连接点的表达式。连接点是应用程序执行过程中能够插入切面的点,通常是方法调用或异常处理等。切入点表达式可以指定一个或多个连接点,以及需要匹配的条件。
@Pointcut注解可以被用来定义一个切入点方法,这个方法的返回值类型必须是void,方法体可以是一个空方法,因为它只是用来定义一个切入点。切入点方法的访问修饰符可以是public或protected。
在使用@Pointcut注解时,需要指定一个切入点表达式,切入点表达式的语法比较复杂,但是通常都是基于方法的签名来定义的。例如,下面的切入点表达式匹配所有的public方法:
```
@Pointcut("execution(public * *(..))")
public void anyPublicMethod() {}
```
在这个表达式中,`execution`表示方法执行时触发,`public`表示方法是public修饰符的,`*`表示匹配任意返回类型的方法,`*(..)`表示匹配任意参数的方法。
切入点表达式还可以使用其他的语法来匹配方法,例如:
- `execution(* com.example.service.*.*(..))`:匹配com.example.service包下的所有方法;
- `execution(* com.example.service..*.*(..))`:匹配com.example.service包及其子包下的所有方法;
- `execution(* com.example.service.UserService.find*(..))`:匹配UserService中以find开头的方法;
- 等等。
通过定义切入点,我们可以将切面应用到指定的连接点上,以实现切面的功能。