`
zuiyanwangyue
  • 浏览: 164953 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

spring aop中应用的适配器模式

阅读更多

spring aop框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型,上述三种通知类型是spring aop框架定义的,它们是aop联盟定义的Advice的子类型。

位于org.springframework.aop.framework.adapter包中的AdvisorAdapter是一个适配器接口,它定义了自己支持的Advice类型,并且能把一个Advisor适配成MethodInterceptor(这也是AOP联盟定义的借口),以下是它的定义

public interface AdvisorAdapter {
	// 将一个Advisor适配成MethodInterceptor
	MethodInterceptor getInterceptor(Advisor advisor);
	// 判断此适配器是否支持特定的Advice
	boolean supportsAdvice(Advice advice);
}

 这个接口允许扩展spring aop框架,以便处理新的Advice或Advisor类型,其实现对象可以把某些特定的Advice类型适配成AOP联盟定义的MethodInterceptor,并在spring aop框架中启用这些通知类型。通常spring用户不需要实现这个接口,除非想把更多的Advice和Advisor引入到spring中时。

spring aop框架本身为这个接口提供了很好的实现,例如为了支持MethodBeforeAdivce、AfterReturningAdvice、以及ThrowsAdvice这三种通知类型,spring在org.springframework.aop.framework.adapter包中分别为它们定义了相应的适配器,在此仅以AfterReturningAdviceAdapter为例

class AfterReturningAdviceAdapter implements AdvisorAdaptor, Serializable {
	// 此适配器仅支持AfterReturningAdivce类型
	public boolean supportsAdvice(Advice advice) {
		return advice instanceof AfterReturningAdivce;
	}
	// 把特定的Advisor适配成MethodInterceptor
	public MethodInterceptor getInterceptor(Advisor advisor) {
		AfterReturningAdivce advice = (AfterReturningAdivce) advisor.getAdvice();
		return new AfterReturningAdviceInterceptor(advice);
	}
}

 其中,AfterReturningAdviceInterceptor也是org.springframework.aop.framework.adapter包中定义的

public class AfterReturningAdviceInterceptor implements MethodInterceptor,
		AfterAdvice, Serializable {
	private final AfterReturningAdvice advice;

	public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
		this.advice = advice;
	}

	// 实现MethodInterceptor中定义的invoke方法
	public Object invoke(MethodInvocation mi) throws Throwable {
		Object ret = mi.proceed();
		this.advice.afterReturning(ret, mi.getMethod(), mi.getArguments(), mi.getThis());
		return ret;
	}
}

 那么,这些适配器在spring aop框架中是如何发挥作用的呢,位于org.springframework.aop.framework.adapter包中的AdvisorAdapterRegistry接口定义了管理AdvisorAdapter的语义

public interface AdvisorAdaptorRegistry {
	// 为某一Advisor返回所有适合它的方法拦截器
	MethodInterceptor[] getInterceptors(Advisor advisor);
	// 注册AdvisorAdapter 
	void registerAdvisorAdapter(AdvisorAdapter adapter);
	// 将一个Advice包装成一个Advisor
	Advisor wrap(Object advice);
}

 它的默认实现是DefaultAdvisorAdapterRegistry,它也同样位于org.springframework.aop.framework.adapter包中,我们在如下的定义中可以看到,MethodBeforeAdivceAdapter、AfterReturningAdviceAdapter以及ThrowsAdviceAdapter已经被事先注册到了DefaultAdvisorAdapterRegistry中

public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry,
		Serializable {
	private final List adapters = new ArrayList(3);

	public DefaultAdvisorAdapterRegistry() {
		registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
		registerAdvisorAdapter(new AfterReturningAdviceAdapter());
		registerAdvisorAdapter(new ThrowsAdviceAdapter());
	}
	// .......
}

 这个包中的GlobalAdvisorAdapterRegistry只不过为DefaultAdvisorAdapterRegistry提供了单例模式的实现,典型的获得DefaultAdvisorAdapterRegistry实例的代码是AdvisorAdapterRegistry registry=GlobalAdvisorAdapterRegistry.getInstance();如果我们想把自己定义的AdvisorAdapter注册到spring aop框架中也是可以的,除了把我们自定义的AdvisorAdapter当作一个最普通的bean注册到spring的IOC容器之外还需要注册spring中定义的一个bean,那就是AdvisorAdapterRegistrationManager,它也位于org.springframework.aop.framework.adapter包中,有兴趣的朋友可以看看它的源码,再简单不过了,它只不过是实现了BeanPostProcessor接口,并在postProcessAfterInitialization方法中检测bean是否实现了AdvisorAdapter,如果实现了就把它注册到全局的AdvisorAdapter管理器中。

分享到:
评论

相关推荐

    Java 经典设计模式讲解以及项目实战

    Spring设计模式简介:主要是讲述Spring源码中运用到的一些设计模式 Ibatis设计模式简介:主要是讲述Ibatis源码中运用到的一些设计模式 设计模式简介 1 单例模式 2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法...

    掌握Spring设计模式:Java工程师必备指南

    代理模式和观察者模式在Spring AOP和事件驱动模型中得到了广泛应用,提供了强大的切面和事件处理能力。策略模式和模板方法模式则分别提供了资源访问的灵活性和统一处理逻辑的框架。最后,责任链模式在Spring的AOP...

    Spring-IOC::label:手写实现了Spring框架的基本功能,存在了注解以及xml配置,并且实现了引用注入等功能,还实现了SpringMVC的简单功能

    我的春天Spring IOC容器简单实现,实现了一些基本的核心...适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式,spring MVC中也是用到了适配器模式适配Controller。(体现了一点)去做: AOP实现循环依赖

    春天来了,继续手写自己的Spring,从0到1,从IOC到DI、AOP、MVC四个阶段,项目已经传到了github和码云上面

    熬了半个多月的时间,每天坐在电脑面前十几个小时,从Spring官网拉下来了spring-framework这个项目的源码,边看源码,边从网上找资料,整个项目中使用的设计模式也是非常的经典,如工厂模式:BeanFactory,代理模式...

    SSM 梳理 面试题整理

    8. Spring 中的设计模式(解释) 9. 简单介绍一下 Spring bean 的生命周期(11步) 10. Spring 能帮我们做什么 11. 描述一下 Spring 的事务 12. 什么是 Spring IOC 容器,IOC 的优点是什么? 13. 什么是 Spring 的...

    asp.net知识库

    从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 ...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 创建模式 抽象工厂模式 工厂方法模式 建造这模式 原型模式 单例模式 行为模式 责任链模式 命令模式 解释器模式 迭代器模式 ...

    java面试题库2021.pdf

    目录 一、 JavaSE 部分 1、 Java 基础 ①Java 基础部分(基本语法, Java 特性等) ...③适配器模式 2、 创建型模式 ①单例模式 3、 行为型模式 ①策略模式 ②观察者模式 4、 所有模式汇总 十、 场景题 十一、 UML

    领域驱动设计与模式实战

    2.4 针对具体应用程序类型的设计模式 2.5 领域模式 2.6 小结 第3章 TDD与重构 3.1 TDD 3.1.1 TDD流程 3.1.2 演示 3.1.3 设计效果 3.1.4 问题 3.1.5 下一个阶段 3.2 模拟和桩 3.2.1 典型单元测试 3.2.2 声明独立性 ...

    Java全套知识体系

    文章目录一、Java基础1.1 多线程1.2 内存优化1.3 日志输出log4j21.4 lombok二、Java框架2.1 Spring2.1.1 IOC\AOP2.1.2 事务2.2 SpringMVC2.2.1 六大组件介绍和分析2.2.2 策略模式适配器模式2.3 MyBatis2.3.1 框架...

    CloudStack二次开发帮助文档

    CLOUDSTACK中使用SPRING 17 6.1. CLOUDSTACK组件 18 6.2. 如何声明一个CLOUDSTACK组件 19 6.3. AUTO-WIRING 19 6.4. CLOUDSTACK SPRING组件的编码约定 20 6.4.1. 注意自动注入的时间 20 6.4.2. 公用构造器 20 6.4.3...

    基于SpringBoot+Druid+Mybatis+Vue+Elementui的小区物联网平台项目源码+数据.rar

    adapt 对接不同的门禁 考勤 停车 适配器 包,重要,二开主要开发适配器 aop 系统切面处理 登录拦截 外部api token拦截校验等 api 给设备提供接口 如开门设备上报地址 car 心跳 HC小区管理系统 车辆处理 config ...

    sample-crud-scala:用 Scala 编写的示例 CRUD

    示例 CRUD 应用程序 这是示例 Scala 应用程序,表示为: 后端的前端的基本上它是项目的非常直接的端口应用技术与原来的主要区别是所有后端都是用编写的下面是一系列基于 Java 的技术: — 嵌入式 Web 容器;...

Global site tag (gtag.js) - Google Analytics