在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方法里面,然后在调用具体的方法实现。

最新文章

  1. XEN的启动信息输出到“Platform timer is 14.318MHz HPET”就暂停接收的解决办法
  2. jquery 的datatables插件问题
  3. linux eclipse c++配置
  4. Set Keep-Alive Values---C到C#代码的转换
  5. Knockoutjs官网翻译系列(二) Observable 数组
  6. android 遇到的细节 FAQ
  7. 收集的VS2013的使用小技巧( 不断总结中)
  8. 准备 macvlan 环境 - 每天5分钟玩转 Docker 容器技术(54)
  9. gulp管理静态资源缓存
  10. 【django之admin,单例模式】
  11. 学习安卓开发[5] - HTTP、后台任务以及与UI线程的交互
  12. leecode第二百三十一题(2的幂)
  13. python的一些内置模块
  14. 学习Unity -- 理解依赖注入(IOC)三种方式依赖注入
  15. cmd copy命令 文件复制【转】
  16. async和await学习笔记
  17. ASP.NET Core 3.0 实战:构建多版本 API 接口
  18. jdk免安装对应配置
  19. SpringBoot源码分析之SpringBoot的启动过程
  20. Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分

热门文章

  1. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
  2. redis集群搭建(伪集群)
  3. ElasticSearch 论坛搜索查询语句
  4. aishell数据处理为thchs30格式
  5. Swift-枚举enum理解
  6. 【Redis】- 主从复制
  7. GetTickCount 和getTickCount
  8. perf使用的问题,再看perf record,perf record 设置的采样频率,采样频率是如何体现在
  9. 添加路由时啥时候是dev啥时候是gw
  10. [C/C++] 原码、反码、补码问题