首页 > 其他 > 详细

切面类型

时间:2020-04-11 21:30:59      阅读:72      评论:0      收藏:0      [点我收藏+]

切面类型

静态普通方法匹配切面

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有三个构造函数:

技术分享图片

切面类型

原文:https://www.cnblogs.com/woshi123/p/12682300.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!