Spring基础(19)——AOP——定义Pointcut

Spring通过Pointcut接口描述切点,Pointcut由ClassFilter和MethodMather构成,通过ClassFilter定位到某些特定类上,也就是类过滤。通过MethodMather定位到某些特定的方法上,也就是方法过滤。

Pointcut关系图:

1、类过滤

Pointcut根据方法和类决定在什么地方织入通知。ClassFilter接口决定了一个类是否符合通知的要求,ClassFilter只定义了一个方法matches(Class clazz),其参数代表一个被检测类,该方法用于判别检测的类是否匹配过滤条件。

实现这个借口的类决定了一参数传入进来的类是否应该被通知。实现这个接口的类一般根据类名决定,但并不是必须这样。这个接口总是包含一个简单的ClassFilter接口实现 ClassFilter.TRUE。它是规范的、适合任何类的ClassFilter实例,适用于创建只根据方法决定符合要求的切入点。

2、方法过滤:

通过MethodMatcher接口可以实现方法过滤,MethodMatcher接口有3个方法,matches(Method, Class)方法根据目标类和方法决定一个方法是否该被通知,因为可以静态的判断,所以可以在AOP代理被创建时调用一个这个方法。这个方法的结果最终决定了通知是否被织入。

如果matches(Method,Class)返回true,将调用isRuntime()方法来决定MethodMatcher的类型,有静态和动态两种。

静态切入点的意思是通知总是被执行。如果切入点是静态的isRuntime()方法返回false

动态切入点根据运行时方法的参数值决定通知是否需要执行,如果切入点是动态的isRuntime()方法应该返回的true。与matches(Method,Class)方法一样,isRuntime()方法也只在创建代理类时被调用一次

如果一个切入点是静态的,matches(Method,Class,Object[])方法永远不会被调用,因为不需要根据参数的运行时值来决定通知是否需要被调用。对于动态切入点,目标方法每次被调用时,matches(Method,Class, Object[])方法都被调用,这样在这些方法被调用时都会增加负担。因此为了避免这些,应尽可能使用静态切入点。

3、匹配器

在Spring中有两种方法匹配器:静态方法匹配器和动态方法匹配器。

静态方法匹配器:它仅对方法名签名(包括方法名和入参类型及顺序)进行匹配

动态方法匹配器:会在运行时检查方法入参的值。

静态匹配仅会判断一次,动态匹配每次调用的方法的入参可能不一样,所以每次调用方法时都必须判断,因此动态匹配对性能的影响很大。在一般情况下动态匹配不常使用。方法匹配器的类型由inRuntime()返回值决定,返回false表示是静态方法匹配器,返回true是动态方法匹配器。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值