@Pointcut
注解在 AspectJ 中用于定义一个切入点,它是一种表达式,用于匹配特定的连接点(通常是方法的执行或对象的构造)。切入点表达式可以基于方法的签名、方法的注解、方法的抛出异常、方法所属的类或包等属性。
以下是一些常见的 @Pointcut
表达式及其意义:
方法签名: 根据方法的名称、返回类型和参数来匹配方法。
@Pointcut("execution(* com.example.*.*(..))")
注解: 匹配被特定注解标记的方法。
@Pointcut("@annotation(com.example.MyAnnotation)")
异常抛出: 匹配可能会抛出特定异常类型的方法。
@Pointcut("execution(* *.*(..)) throws java.io.IOException")
方法属性: 匹配具有特定属性的方法,例如方法可见性。
@Pointcut("execution(public * *(..))")
类和包: 匹配特定类或包下的所有方法。
@Pointcut("within(com.example.mypackage..*)") // 或者 @Pointcut("within(com.example.MyClass)")
继承: 匹配继承自特定类的类中的方法。
@Pointcut("within(com.example.MySuperClass+)")
实现: 匹配实现了特定接口的类中的方法。
@Pointcut("within(com.example.MyInterface+)")
正则表达式: 使用正则表达式匹配方法的签名。
@Pointcut("execution(* com.example.*..*Method(..))")
组合: 组合多个切入点表达式。
@Pointcut("execution(* *.*(..)) && !within(com.example.ExcludedClass)")
参数匹配: 根据方法参数的类型或注解来匹配方法。
@Pointcut("execution(* *(..)) && args(java.lang.String, ..)")
返回类型匹配: 根据方法的返回类型来匹配方法。
@Pointcut("execution(java.lang.String+ *.*(..))")
this/ target/ args: 匹配方法调用者、被调用对象或参数。
@Pointcut("this(com.example.MyClass)") // 匹配 this 引用 Myclass 的实例 @Pointcut("target(com.example.MyClass)") // 匹配目标对象是 Myclass 的实例 @Pointcut("args(java.io.Serializable)") // 匹配方法参数中包含 Serializable 类型
@Pointcut
表达式非常灵活,可以单独使用,也可以组合使用,以精确地定义哪些方法或类应该被切面所影响。在实际应用中,这些表达式可以根据需要进行调整,以适应不同的业务场景和需求。