首页 > 代码库 > 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_切面