相关阅读

  • Spring AOP基础组件 Pointcut
  • Spring AOP基础组件 Advice

简介

持有AOP Advice和决定Advice适用性的过滤器(比如Pointcut)的基础接口;
Spring AOP基于符合AOP拦截API的MethodInterceptor支持通知,Advisor接口允许支持不同类型的通知,比如:前置通知、后置通知这些不需要通过拦截器实现的通知;

源码

public interface Advisor {// 空通知Advice EMPTY_ADVICE = new Advice() {};// 获取通知,可以是拦截器、前置通知、抛出异常通知等Advice getAdvice();// 是否和每个被通知的实例相关// 当前框架还未用到该方法,可以通过单例/多例,或者恰当的代理创建来确保Advisor的生命周期正确boolean isPerInstance();
}

实现子类

IntroductionAdvisor

简介

支持AOP 引介功能的Advisor的基础接口;

核心代码

public interface IntroductionAdvisor extends Advisor, IntroductionInfo {// 获取决定引介适用性的类过滤器ClassFilter getClassFilter();// 校验被通知的接口是否可以应用该IntroductionAdvisorvoid validateInterfaces() throws IllegalArgumentException;
}

DefaultIntroductionAdvisor

简介

IntroductionAdvisor的简单实现,默认地应用引介到任意类型;

核心代码

public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFilter, Ordered, Serializable {private final Advice advice;private final Set<Class<?>> interfaces = new LinkedHashSet<>();public DefaultIntroductionAdvisor(Advice advice, @Nullable IntroductionInfo introductionInfo) {// 校验AdviceAssert.notNull(advice, "Advice must not be null");this.advice = advice;if (introductionInfo != null) {Class<?>[] introducedInterfaces = introductionInfo.getInterfaces();if (introducedInterfaces.length == 0) {throw new IllegalArgumentException("IntroductionInfo defines no interfaces to introduce: " + introductionInfo);}// 应用引介接口信息for (Class<?> ifc : introducedInterfaces) {addInterface(ifc);}}}public DefaultIntroductionAdvisor(DynamicIntroductionAdvice advice, Class<?> ifc) {// 校验AdviceAssert.notNull(advice, "Advice must not be null");this.advice = advice;addInterface(ifc);}public void addInterface(Class<?> ifc) {Assert.notNull(ifc, "Interface must not be null");if (!ifc.isInterface()) {throw new IllegalArgumentException("Specified class [" + ifc.getName() + "] must be an interface");}this.interfaces.add(ifc);}@Overridepublic Class<?>[] getInterfaces() {return ClassUtils.toClassArray(this.interfaces);}@Overridepublic void validateInterfaces() throws IllegalArgumentException {for (Class<?> ifc : this.interfaces) {// 校验当前Advice是否支持所有的interfacesif (this.advice instanceof DynamicIntroductionAdvice &&!((DynamicIntroductionAdvice) this.advice).implementsInterface(ifc)) {throw new IllegalArgumentException("DynamicIntroductionAdvice [" + this.advice + "] " +"does not implement interface [" + ifc.getName() + "] specified for introduction");}}}@Overridepublic Advice getAdvice() {return this.advice;}@Overridepublic boolean isPerInstance() {return true;}@Overridepublic ClassFilter getClassFilter() {// 返回自身return this;}@Overridepublic boolean matches(Class<?> clazz) {// 匹配任意类型return true;}
}

PointcutAdvisor

简介

Pointcut驱动的Advisor的基础接口;
含盖了除引介Advisor外几乎所有的Advisor

核心代码

public interface PointcutAdvisor extends Advisor {// 获取PointcutPointcut getPointcut();
}

StaticMethodMatcherPointcutAdvisor

简介

同时作为StaticMethodMatcherPointcutAdvisor的基础抽象类;

核心代码

public abstract class StaticMethodMatcherPointcutAdvisor extends StaticMethodMatcherPointcutimplements PointcutAdvisor, Ordered, Serializable {// 默认空通知private Advice advice = EMPTY_ADVICE;public StaticMethodMatcherPointcutAdvisor(Advice advice) {// 校验AdviceAssert.notNull(advice, "Advice must not be null");this.advice = advice;}@Overridepublic Advice getAdvice() {return this.advice;}@Overridepublic boolean isPerInstance() {return true;}@Overridepublic Pointcut getPointcut() {// 返回自身return this;}
}

AspectJPointcutAdvisor

简介

适配AbstractAspectJAdvicePointcutAdvisor接口;

核心代码

public class AspectJPointcutAdvisor implements PointcutAdvisor, Ordered {private final AbstractAspectJAdvice advice;private final Pointcut pointcut;public AspectJPointcutAdvisor(AbstractAspectJAdvice advice) {// 校验AdviceAssert.notNull(advice, "Advice must not be null");this.advice = advice;this.pointcut = advice.buildSafePointcut();}@Overridepublic boolean isPerInstance() {return true;}@Overridepublic Advice getAdvice() {return this.advice;}@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

AsyncAnnotationAdvisor

简介

Spring Async功能的实现,支持通过@Async注解和javax.ejb.Asynchronous注解来激活异步方法执行的Advisor

核心代码

public class AsyncAnnotationAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware {private Advice advice;private Pointcut pointcut;public AsyncAnnotationAdvisor(@Nullable Supplier<Executor> executor, @Nullable Supplier<AsyncUncaughtExceptionHandler> exceptionHandler) {// 默认支持Async和javax.ejb.Asynchronous,故size为2Set<Class<? extends Annotation>> asyncAnnotationTypes = new LinkedHashSet<>(2);asyncAnnotationTypes.add(Async.class);try {asyncAnnotationTypes.add((Class<? extends Annotation>)ClassUtils.forName("javax.ejb.Asynchronous", AsyncAnnotationAdvisor.class.getClassLoader()));}catch (ClassNotFoundException ex) {// If EJB 3.1 API not present, simply ignore.}// 根据异步执行器和异常处理器生成Advicethis.advice = buildAdvice(executor, exceptionHandler);// 生成Pointcutthis.pointcut = buildPointcut(asyncAnnotationTypes);}@Overridepublic Advice getAdvice() {return this.advice;}@Overridepublic Pointcut getPointcut() {return this.pointcut;}protected Advice buildAdvice(@Nullable Supplier<Executor> executor, @Nullable Supplier<AsyncUncaughtExceptionHandler> exceptionHandler) {// 使用AnnotationAsyncExecutionInterceptorAnnotationAsyncExecutionInterceptor interceptor = new AnnotationAsyncExecutionInterceptor(null);interceptor.configure(executor, exceptionHandler);return interceptor;}protected Pointcut buildPointcut(Set<Class<? extends Annotation>> asyncAnnotationTypes) {ComposablePointcut result = null;// 遍历注解类型集合,得到一个ComposablePointcutfor (Class<? extends Annotation> asyncAnnotationType : asyncAnnotationTypes) {// 匹配类,忽略方法(MethodMatcher.TRUE)Pointcut cpc = new AnnotationMatchingPointcut(asyncAnnotationType, true);// 匹配方法,忽略类(ClassFilter.TRUE)Pointcut mpc = new AnnotationMatchingPointcut(null, asyncAnnotationType, true);if (result == null) {result = new ComposablePointcut(cpc);}else {result.union(cpc);}result = result.union(mpc);}// 若不存在注解类型,则认为全匹配return (result != null ? result : Pointcut.TRUE);}
}

BeanFactoryCacheOperationSourceAdvisor

简介

Spring Cache功能的实现,基于CacheOperationSource实现的Advisor,内部持有Advice实例;

核心代码

public class BeanFactoryCacheOperationSourceAdvisor extends AbstractBeanFactoryPointcutAdvisor {// 判断当前方法是否有缓存注解,被CacheOperationSourcePointcut用来实现切入点逻辑@Nullableprivate CacheOperationSource cacheOperationSource;// 使用基于CacheOperationSource的CacheOperationSourcePointcut作为pointcutprivate final CacheOperationSourcePointcut pointcut = new CacheOperationSourcePointcut() {@Override@Nullableprotected CacheOperationSource getCacheOperationSource() {return cacheOperationSource;}};@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

BeanFactoryTransactionAttributeSourceAdvisor

简介

Spring 注解驱动的事务管理功能的实现,基于TransactionAttributeSource实现的Advisor,内部持有Advice实例;

核心方法

public class BeanFactoryTransactionAttributeSourceAdvisor extends AbstractBeanFactoryPointcutAdvisor {// 判断当前方法是否有@Transactional注解,被TransactionAttributeSourcePointcut用来实现切入点逻辑@Nullableprivate TransactionAttributeSource transactionAttributeSource;// 使用基于TransactionAttributeSource的TransactionAttributeSourcePointcut作为pointcutprivate final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() {@Override@Nullableprotected TransactionAttributeSource getTransactionAttributeSource() {return transactionAttributeSource;}};@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

TransactionAttributeSourceAdvisor

简介

Spring 注解驱动的事务管理功能的实现,基于TransactionAttributeSource实现的Advisor,内部持有TransactionInterceptor实例;

核心代码

public class TransactionAttributeSourceAdvisor extends AbstractPointcutAdvisor {// 被TransactionAttributeSourcePointcut用来实现切入点逻辑@Nullableprivate TransactionInterceptor transactionInterceptor;// 使用基于TransactionAttributeSource的TransactionAttributeSourcePointcut作为pointcutprivate final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() {@Override@Nullableprotected TransactionAttributeSource getTransactionAttributeSource() {return (transactionInterceptor != null ? transactionInterceptor.getTransactionAttributeSource() : null);}};@Overridepublic Advice getAdvice() {Assert.state(this.transactionInterceptor != null, "No TransactionInterceptor set");return this.transactionInterceptor;}@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

DefaultPointcutAdvisor

简介

几乎最通用的PointcutAdvisor的实现,可以使用任意类型Pointcut和除引介外任意类型Advice

核心代码

public class DefaultPointcutAdvisor extends AbstractGenericPointcutAdvisor implements Serializable {private Pointcut pointcut = Pointcut.TRUE;public DefaultPointcutAdvisor(Pointcut pointcut, Advice advice) {this.pointcut = pointcut;setAdvice(advice);}public void setPointcut(@Nullable Pointcut pointcut) {this.pointcut = (pointcut != null ? pointcut : Pointcut.TRUE);}@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

NameMatchMethodPointcutAdvisor

简介

使用NameMatchMethodPointcutAdvisor

核心代码

public class NameMatchMethodPointcutAdvisor extends AbstractGenericPointcutAdvisor {private final NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();public NameMatchMethodPointcutAdvisor(Advice advice) {setAdvice(advice);}public void setMappedName(String mappedName) {this.pointcut.setMappedName(mappedName);}public void setMappedNames(String... mappedNames) {this.pointcut.setMappedNames(mappedNames);}public NameMatchMethodPointcut addMethodName(String name) {return this.pointcut.addMethodName(name);}@Overridepublic Pointcut getPointcut() {return this.pointcut;}
}

RegexpMethodPointcutAdvisor

简介

使用AbstractRegexpMethodPointcutAdvisor

核心代码

public class RegexpMethodPointcutAdvisor extends AbstractGenericPointcutAdvisor {@Nullableprivate String[] patterns;@Nullableprivate AbstractRegexpMethodPointcut pointcut;public RegexpMethodPointcutAdvisor(String pattern, Advice advice) {setPattern(pattern);setAdvice(advice);}public RegexpMethodPointcutAdvisor(String[] patterns, Advice advice) {setPatterns(patterns);setAdvice(advice);}@Overridepublic Pointcut getPointcut() {synchronized (this.pointcutMonitor) {if (this.pointcut == null) {this.pointcut = createPointcut();if (this.patterns != null) {//设置正则表达式this.pointcut.setPatterns(this.patterns);}}return this.pointcut;}}protected AbstractRegexpMethodPointcut createPointcut() {// 使用JdkRegexpMethodPointcutreturn new JdkRegexpMethodPointcut();}
}

Spring AOP基础组件 Advisor相关推荐

  1. Spring AOP基础组件 Pointcut

    相关阅读 Spring AOP基础组件 Advice Spring AOP基础组件 Advisor 简介 定义了切面的匹配点,即哪些类的哪些方法:在Spring AOP中匹配点主要是class(Cla ...

  2. Spring AOP基础组件 Joinpoint

    相关阅读 Spring AOP基础组件 Pointcut Spring AOP基础组件 Advice Spring AOP基础组件 AopProxy 简介 Joinpoint表示通用的运行时连接点: ...

  3. 了解动态代理:Spring AOP基础

    为什么选择AOP: 要了解AOP(面向方面​​的编程),我们需要了解软件开发中的"横切关注点". 在每个项目中,都有一定数量的代码在多个类,多个模块中重复执行,例如几乎所有类和所有 ...

  4. SSM框架笔记10:Spring AOP基础

    Spring AOP基础   AOP:Aspect-Oriented Programming 面向切面编程.   Spring的AOP作用在于解耦.AOP让一组类共享相同的行为(比如事务管理.日志管理 ...

  5. 【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】

    每篇一句 基础技术总是枯燥但有价值的.数学.算法.网络.存储等基础技术吃得越透,越容易服务上层的各种衍生技术或产品 相关阅读 [小家Spring]Spring AOP原理使用的基础类打点(AopInf ...

  6. 聊聊spring aop中的advisor组件

    1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...

  7. Spring Aop基础使用

    说到Spring,想必大家一定就马上想到了,哦Spring不就是帮助管理Bean对象,封装数据源,提供事务管理的东西么.的确,平常在使用Spring的时候,用到最多的就是Spring提供的这些功能了, ...

  8. Spring框架学习笔记05:Spring AOP基础

    文章目录 一.Spring AOP (一)AOP基本含义 (二)AOP基本作用 (三)AOP与OOP (四)AOP使用方式 (五)AOP基本概念 任务:骑士执行任务前和执行任务后,游吟诗人唱赞歌 (一 ...

  9. Spring AOP基础—JDK动态代理

    JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类 ...

最新文章

  1. 文本文件 java_简单的用java实现读/写文本文件的示例
  2. vba手机号码归属_Android手机号码归属地的查询
  3. Linux内核的并发与竞态、信号量、互斥锁、自旋锁
  4. C#实现多态之一抽象
  5. 210127阶段三进程间通信-消息队列
  6. php7 返回值,7.6.4 函数返回值
  7. 携程试点每周两天居家办公反响热烈,76%的员工主动报名
  8. 【MySQL】Linux 命令启动 mysql
  9. springmvc + ibatis 框架的搭建
  10. laravel html转pdf和转图片 (laravel-snappy的使用记录)
  11. matlab液压仿真实例,基于MATLAB-simulink的液压系统动态仿真.pptx
  12. 计算机word文档无法工作,电脑docx打不开怎么办(word文档无法打开的解决方法)...
  13. 流媒体 - 02 常用命令(gst+ffmpeg+v4l2)
  14. Oracle:ORA-12505解决办法
  15. 较为简洁明了的KMP算法解释
  16. tds系统无法连接服务器,OpenLDAP - TDS - 无法联系LDAP服务器(-1)
  17. 3D打印的材料有哪几种?
  18. dnf加物理攻击的卡片有哪些_dnf哪些卡片是加物理攻击力的?
  19. C语言中判断浮点数是否等于0
  20. Hadoop 2.7 不停服升级到 3.2 在滴滴的实践

热门文章

  1. Excel中ISERROR()函数
  2. 计算机语言中的逻辑型数据,零基础易语言入门教程(五)之逻辑型数据类型
  3. 详细介绍ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation
  4. 一款基于 Spring Boot 开发的 OA 项目,接私活必备!
  5. esp8266声控灯代码
  6. 使用LM386制作Arduino音乐播放器
  7. 通过命令查看CentOS版本的几种方法,经过搜集整理得到
  8. 网站色调色彩搭配之情感表现
  9. 监控硬盘与普通硬盘有什么分别,被删除视频恢复方法。
  10. SpringBoot整合SQLite