Spring源码解析-Advice中的Adapter模式
2024-09-24 18:56:16
在spring中与通知相关的类有:
以Advice结尾的通知接口
MethodBeforeAdvice AfterReturningAdvice ThrowsAdvice
以Interceptor结尾的拦截器
MethodBeforeAdviceInterceptor AfterReturningAdviceInterceptor ThrowsAdviceInterceptor
以Adapter结尾的适配器
MethodBeforeAdviceAdapter AfterReturningAdviceAdapter ThrowsAdviceAdapter
先了解一下Adapter模式
而这三者间的关系以MethodBefore为例:
下面以MethodBefore为例,看一下源码。
先看一下AdvisorAdapter接口
public interface AdvisorAdapter { boolean supportsAdvice(Advice advice); MethodInterceptor getInterceptor(Advisor advisor); }
MethodBeforeAdviceAdapter类
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { @Override
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
} @Override
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
} }
而MethodBeforeAdviceInterceptor是具体的实现。
例外在看一下MethodBeforeAdviceInterceptor类
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable { private MethodBeforeAdvice advice; /**
* Create a new MethodBeforeAdviceInterceptor for the given advice.
* @param advice the MethodBeforeAdvice to wrap
*/
public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
Assert.notNull(advice, "Advice must not be null");
this.advice = advice;
} @Override
public Object invoke(MethodInvocation mi) throws Throwable {
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );
return mi.proceed();
} }
实现了MethodIntercepter接口,在调用invoke进行拦截的时候,是先调用before方法里面,然后在调用具体的方法实现。
最新文章
- XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法
- jquery 的datatables插件问题
- linux eclipse c++配置
- Set Keep-Alive Values---C到C#代码的转换
- Knockoutjs官网翻译系列(二) Observable 数组
- android 遇到的细节 FAQ
- 收集的VS2013的使用小技巧( 不断总结中)
- 准备 macvlan 环境 - 每天5分钟玩转 Docker 容器技术(54)
- gulp管理静态资源缓存
- 【django之admin,单例模式】
- 学习安卓开发[5] - HTTP、后台任务以及与UI线程的交互
- leecode第二百三十一题(2的幂)
- python的一些内置模块
- 学习Unity -- 理解依赖注入(IOC)三种方式依赖注入
- cmd copy命令 文件复制【转】
- async和await学习笔记
- ASP.NET Core 3.0 实战:构建多版本 API 接口
- jdk免安装对应配置
- SpringBoot源码分析之SpringBoot的启动过程
- Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分
热门文章
- Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
- redis集群搭建(伪集群)
- ElasticSearch 论坛搜索查询语句
- aishell数据处理为thchs30格式
- Swift-枚举enum理解
- 【Redis】- 主从复制
- GetTickCount 和getTickCount
- perf使用的问题,再看perf record,perf record 设置的采样频率,采样频率是如何体现在
- 添加路由时啥时候是dev啥时候是gw
- [C/C++] 原码、反码、补码问题