1、定义方式不同:
@Pointcut:是Spring AOP框架提供的注解,用于定义切点表达式。例如:@Pointcut(“execution(* com.example.service..(…))”)。
自定义注解:需要自己创建一个新的注解,并在切面类上使用该注解来定义切点。例如:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation {
// 注解内容
}
2、使用场景不同:
@Pointcut:适用于通用的切点表达式,可以应用于多个切面方法。例如,一个通用的日志记录切点,可以在多个切面方法中使用。
自定义注解:适用于特定场景下的切点表达式,通常只在一个切面方法中使用。例如,一个特定的权限校验切点,只在需要进行权限校验的方法上使用。
3、扩展性:
@Pointcut:可以通过修改切点表达式来实现不同的切面逻辑,具有一定的扩展性。
自定义注解:可以通过修改注解内容来实现不同的切面逻辑,扩展性较强。
4、总之,@Pointcut和自定义注解都可以实现切面增强,具体选择哪种方式取决于实际需求和场景。如果需要通用的切点表达式,可以使用@Pointcut;如果需要特定场景下的切点表达式,可以选择自定义注解。
5、实例:
//1、使用@Pointcut实现日志记录切面增强:
@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {
}
@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("执行方法前:" + joinPoint.getSignature().getName());
}
@After("serviceMethods()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("执行方法后:" + joinPoint.getSignature().getName());
}
}
//用自定义注解实现权限校验切面增强:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissionCheck {
String value();
}
@Aspect
@Component
public class PermissionCheckAspect {
@Before("@annotation(permissionCheck)")
public void checkPermission(JoinPoint joinPoint, PermissionCheck permissionCheck) {
String requiredPermission = permissionCheck.value();
// 进行权限校验的逻辑
}
}