Spring AOP基础组件 Advisor
相关阅读
- 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
简介
同时作为StaticMethodMatcherPointcut
的Advisor
的基础抽象类;
核心代码
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
简介
适配AbstractAspectJAdvice
为PointcutAdvisor
接口;
核心代码
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
简介
使用NameMatchMethodPointcut
的Advisor
;
核心代码
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
简介
使用AbstractRegexpMethodPointcut
的Advisor
;
核心代码
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相关推荐
- Spring AOP基础组件 Pointcut
相关阅读 Spring AOP基础组件 Advice Spring AOP基础组件 Advisor 简介 定义了切面的匹配点,即哪些类的哪些方法:在Spring AOP中匹配点主要是class(Cla ...
- Spring AOP基础组件 Joinpoint
相关阅读 Spring AOP基础组件 Pointcut Spring AOP基础组件 Advice Spring AOP基础组件 AopProxy 简介 Joinpoint表示通用的运行时连接点: ...
- 了解动态代理:Spring AOP基础
为什么选择AOP: 要了解AOP(面向方面的编程),我们需要了解软件开发中的"横切关注点". 在每个项目中,都有一定数量的代码在多个类,多个模块中重复执行,例如几乎所有类和所有 ...
- SSM框架笔记10:Spring AOP基础
Spring AOP基础 AOP:Aspect-Oriented Programming 面向切面编程. Spring的AOP作用在于解耦.AOP让一组类共享相同的行为(比如事务管理.日志管理 ...
- 【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】
每篇一句 基础技术总是枯燥但有价值的.数学.算法.网络.存储等基础技术吃得越透,越容易服务上层的各种衍生技术或产品 相关阅读 [小家Spring]Spring AOP原理使用的基础类打点(AopInf ...
- 聊聊spring aop中的advisor组件
1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...
- Spring Aop基础使用
说到Spring,想必大家一定就马上想到了,哦Spring不就是帮助管理Bean对象,封装数据源,提供事务管理的东西么.的确,平常在使用Spring的时候,用到最多的就是Spring提供的这些功能了, ...
- Spring框架学习笔记05:Spring AOP基础
文章目录 一.Spring AOP (一)AOP基本含义 (二)AOP基本作用 (三)AOP与OOP (四)AOP使用方式 (五)AOP基本概念 任务:骑士执行任务前和执行任务后,游吟诗人唱赞歌 (一 ...
- Spring AOP基础—JDK动态代理
JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler动态创建一个符合某一接口的实例,生成目标类 ...
最新文章
- 文本文件 java_简单的用java实现读/写文本文件的示例
- vba手机号码归属_Android手机号码归属地的查询
- Linux内核的并发与竞态、信号量、互斥锁、自旋锁
- C#实现多态之一抽象
- 210127阶段三进程间通信-消息队列
- php7 返回值,7.6.4 函数返回值
- 携程试点每周两天居家办公反响热烈,76%的员工主动报名
- 【MySQL】Linux 命令启动 mysql
- springmvc + ibatis 框架的搭建
- laravel html转pdf和转图片 (laravel-snappy的使用记录)
- matlab液压仿真实例,基于MATLAB-simulink的液压系统动态仿真.pptx
- 计算机word文档无法工作,电脑docx打不开怎么办(word文档无法打开的解决方法)...
- 流媒体 - 02 常用命令(gst+ffmpeg+v4l2)
- Oracle:ORA-12505解决办法
- 较为简洁明了的KMP算法解释
- tds系统无法连接服务器,OpenLDAP - TDS - 无法联系LDAP服务器(-1)
- 3D打印的材料有哪几种?
- dnf加物理攻击的卡片有哪些_dnf哪些卡片是加物理攻击力的?
- C语言中判断浮点数是否等于0
- Hadoop 2.7 不停服升级到 3.2 在滴滴的实践
热门文章
- Excel中ISERROR()函数
- 计算机语言中的逻辑型数据,零基础易语言入门教程(五)之逻辑型数据类型
- 详细介绍ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation
- 一款基于 Spring Boot 开发的 OA 项目,接私活必备!
- esp8266声控灯代码
- 使用LM386制作Arduino音乐播放器
- 通过命令查看CentOS版本的几种方法,经过搜集整理得到
- 网站色调色彩搭配之情感表现
- 监控硬盘与普通硬盘有什么分别,被删除视频恢复方法。
- SpringBoot整合SQLite