@pointcut 重多个切面
时间: 2023-09-21 19:12:50 浏览: 82
在面向切面编程(AOP)中,可以定义多个切面来捕获不同的关注点。这些切面可以同时应用于同一个目标对象,形成一个切面链。执行顺序由切面链中切面的优先级和顺序决定。在Spring AOP中,可以使用@Order注解来指定切面的执行顺序,数字越小的优先级越高。如果没有指定@Order,切面的默认优先级为最低。
相关问题
@pointcut 排除多个controller
`@Pointcut` 是Spring AOP(面向切面编程)中的一个注解,用于定义一个切点表达式,它通常与`@Before`, `@After`, 或 `@Around` 等通知注解一起使用,来指定何时应用某个通知(如前置、后置或环绕通知)。如果你想在一个切点中排除特定的控制器(Controller),你可以创建一个`@Pointcut`,然后在其中使用`not()`或者`matches()`等条件来选择不匹配的那些。
例如:
```java
@Pointcut("execution(* com.example.yourpackage.*Controller+.*(..))")
public void controllerMethods() {
}
@Pointcut("@annotation(excludeAnnotation) && !controllerMethods()")
public void excludedControllerMethods(ExcludeAnnotation excludeAnnotation) {
// 这里excludeAnnotation是你自定义的一个注解,
// 它标记了你想要排除的Controller方法
}
```
在这个例子中,`controllerMethods()` 匹配所有控制器的方法,而 `excludedControllerMethods()` 则进一步排除了那些被`excludeAnnotation`标注的方法。你需要在每个需要排除的控制器方法上加上`excludeAnnotation`,以便它们不会被切面拦截。
@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方法。
阅读全文