首页 > 代码库 > 22_AOP_切面

22_AOP_切面

【Spring AOP 如何定位连接点】

1.增强提供了连接点的方位信息:如织入到方法前面、后面等。

2.切点描述的是织入到哪些类的哪些方法上。

 

【切点】

  Spring通过org.springframework.aop.Pointcut接口描述切点,Pointcut由ClassFilter和MethodMatcher构成,通过ClassFilter定位到某些特定的,通过MethodMatcher定位到某些特定的方法。这样,Pointcut就拥有了描述某些类的某些特定方法的能力。

技术分享

可以看到:

  ClassFilter只定义了一个方法matches(Class clazz),其参数代表一个被检测的类,该方法判别被检测的类是否匹配过滤条件。

Spring提供了两种方法匹配器:静态方法匹配器和动态方法匹配器。

1.静态方法匹配器

  仅对方法名签名(包括方法名和入参类型及顺序)进行匹配。静态匹配仅判断一次。

2.动态方法匹配器

  会在运行期间检查方法入参的值。动态匹配因为每次调用方法的入参可能不一样,导致每次调用方法都必须判断,因此动态匹配对性能的影响较大。

  一般情况,动态匹配不常使用。

方法匹配器的类型由MethodMatcher接口的isRuntime()方法决定,返回false表示是静态方法匹配器,返回true表示是动态方法匹配器。

 

【切点类型】

Spring提供了6种切点:

1.静态方法切点:org.springframework.aop.support.StaticMethodMatcherPointcut

  StaticMethodMatcherPointcut是静态方法切点的抽象基类,默认情况下匹配所有的类。StaticMethodMatcherPointcut有两个重要的子类:NameMethodMatcherPointcut和AbstractRegexMethodPoint。前者提供简单的字符串匹配方法签名,后者使用正则表达式匹配方法签名。

2.动态方法切点:org.springframework.aop.support.DynamicMethodMatcherPointcut

  DynamicMethodMatcherPointcut是动态方法切点的抽象基类,默认情况下它匹配所有的类。DynamicMethodMatcherPointcut已过时!!使用DefaultPointcutAdvisor和DynamicMethodPointcut动态方法匹配器代替。

3.注解切点

4.表达式切点

5.流程切点

6.复合切点

 

【切面类型】

Spring使用org.springframework.aop.Advisor接口表示切面的概念。

一个切面同时包含横切代码和连接点信息。切面分为三类:一般切面、切点切面、引介切面。

1.一般切面:Advisor

  它仅包含一个Advice,Advice包含了横切代码和连接点的信息,所以Advice本身就是一个简单的切面,只不过它代表的是所有目标类的所有方法。由于这个横切面过于宽泛,所以一把不会直接使用。

2.切点切面:PointcutAdvisor

  包含Advice和Pointcut两个类。我们可以通过类、方法名以及方法方位等信息灵活定义切面的连接点,提供更具适用性的切面。

3.引介切面:IntroductionAdvisor

引介切面是对应引介增强的特殊的切面,它应用于类层面之上,所以引介切点适用ClassFilter进行定义。

 

22_AOP_切面