切面类型

切面类型

静态普通方法匹配切面

StaticMethodMatcherPointcutAdvisor 代表一个静态方法匹配切面,他通过StaticMethodMatcherPointcut来定义切点,并通过类过滤和方法名来匹配所定义的切点。

静态正则表达式方法匹配切面

RegexpMethodPointcutAdvisor 是正则表达式方法匹配的切面实现类,该类是功能齐全的实现类,一般情况下无需扩展该类。它有如下属性:

  1. advice (advice-ref) :增强类的设置
  2. pattern (patterns):正则表达式定义目标类的全限定名的匹配模式串
  3. order: 切面在织入时对应的顺序

动态切面

DynamicMethodMatcherPointcut 是一个抽象类,它将 isRuntime() 标识为 final 且返回 true ,这样其子类就一定是一个动态切点。该抽象类默认匹配所有的类和方法,因此需要通过拓展该类编写符合要求的动态切点。

Spring会在创建代理织入切面时,对目标类中的所有方法进行静态切点检查;在生成织入切面的代理对象后,第一次调用代理类的每一个方法时都会进行一次静态切点检查。(其实没多大意义)

代理对象第一次执行方法时,会依次执行静态切点检查(静态类切面检查、静态方法切面检查)、动态切点检查。如果这一次静态检查排除了该方法,下一次调用该方法时将不进行任何检查。

对于第一次执行时,静态切点检查时匹配的方法(静态方法检查的方法返回true)且进行了动态检查的方法,在后续调用该方法时,将直接执行动态切点检查。

流程切面

DefaultPointcutAdvisor 和 ControlFlowPointcut 实现了Spring中的流程切面。流程切点代表由某个方法直接或间接发起调用的其他方法

ControlFlowPointcut 有两个构造函数,分别是 ControlFlowPointcut(Class clazz) 和 ControlFlowPointcut(Class clazz,String methodName)。第一个构造函数指定一个类作为流程切点;第二个构造函数指定一个类中的某一个方法作为流程切点。

流程切面和动态切面从某种程度上来说可以算是一类切面,因为二者都需要在运行期间判断动态的环境。对于流程切面来说,代理对象在每次调用目标类方法时,都需要判断方法调用堆栈中是否满足流程切点要求的方法。因此,和动态切面一样,流程切面对性能的影响也很大。

复合切点切面

ComposablePointcut 可以将多个切点以并集或交集的方式组合起来,提供了切点之间的复合运算功能。

引介切面

IntroductionAdvisor 接口同时继承 Advisor 和 IntroductionInfo 接口,IntroductionInfo 接口描述了目标类需要实现的新接口。

IntroductionAdvisor 和 PointcutAdvisor 接口不同,它仅有一个ClassFilter过滤器 而没有 MethodMatcher,这是因为引介切面的切点是类级别的,而 Pointcut 切点是方法级别的。

IntroductionAdvisor 有两个实现类,分别是DefaultIntroductionAdvisor 和 DeclareParentsAdvisor ,前者是引介切面最常用的实现类,后者用于实现使用 AspectJ 语言的 DeclareParent 注解表示的引介切面。

DefaultIntroductionAdvisor有三个构造函数:

猜你喜欢

转载自www.cnblogs.com/woshi123/p/12682300.html