原创声明 :本文系作者原创,谢绝个人、媒体、公众号或网站 未经授 权 转载,违者追究其法律责任。
框架设计的本质是一个非常大的话题,专门为此写一本书都有可能,不过写书远远超出笔者的能力。本文从一个很小的点切入,仅简单介绍笔者理解的框架设计的本质,并基于此分析部分开源框架的内部实现。如果您有不一样的观点,欢迎留言探讨。受限于笔者的能力范围,本文介绍和分析的框架均使用 Java 语言实现,但这并不意味着本文介绍的框架设计的本质仅适用于 Java,事实上它适用于任何一门编程语言实现的软件框架。
维基百科软件框架词条列出了软件框架与软件库或应用之间关键的三点区别:
反转控制 (Inversion of Control) - 框架控制应用的流程,而不是调用者。
扩展性 (extensibility) - 应用可以扩展框架的功能。
框架本身不可修改 (non-modifiable framework code) - 应用扩展框架的功能且无需修改框架自身的代码,即遵循 OCP 原则。
所以,软件框架设计的本质是为软件框架设计一套良好的扩展机制。在框架中,实现丰富的功能很重要,更重要的是框架有一套良好的扩展机制,基于这套扩展机制用户不仅可以扩展框架的功能,还能替换框架已实现的功能。
观察 Java 社区的开源框架,优秀的框架都有一套良好的扩展机制,这套机制可以使框架应对不断变化的业务需求。比如:
Tapestry 5 开发了可扩展的 IOC 容器 。
Spring Web MVC 建立在 Spring IOC 之上。
Dubbo 实现了一套扩展机制 ExtensionLoader 。
下面以 Spring Web MVC 为例分析一下在 Spring IOC 之上如何实现它的扩展机制。
Spring Web MVC 的核心是 DispatcherServlet,DispatcherServlet 使用一些接口处理 HTTP 请求生成 HTTP 响应,比如 HandlerMapping 接口把 HTTP 请求
映射到一个处理器以及一些前置、后置拦截器,ViewResolver 接口把逻辑视图解析为渲染 HTTP 响应的 View 对象。
DispatcherServlet 初始化时,首先使用工具方法 org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors 从 Spring ApplicationContext 中获取接口的实现,找不到则从配置文件 DispatcherServlet.properties 获取默认实现类并注册到 ApplicationContext 中。如果应用需要使用自定义的渲染引擎渲染 HTTP 响应,实现 ViewResolver 接口并把实现类注册到 Spring ApplicationContext 中就能扩展 ViewResolver,
替换或扩展 Spring Web MVC 的默认实现。
结合前面介绍的框架三要素简单分析一下 Spring Web MVC 的扩展机制:
构建在 Spring IOC 之上;
实现 Spring Web MVC 定义的 接口 来扩展框架的功能;
在 Spring IOC 中注册自定义实现的类就能使用扩展的功能,不需要修改框架的代码。
本文介绍了笔者理解的软件框架设计的本质:设计一套良好的扩展机制,并分析了 Spring Web MVC 的扩展机制。那么问题来了,设计框架时如何设计、实现一套满足以上三个要素的轻量级通用可扩展机制呢?欢迎各位看官在留言中提供您的设计、实现方案。
软件框架:https://en.wikipedia.org/wiki/Software_framework
IOC 容器:http://tapestry.apache.org/ioc.html
OCP 原则:https://en.wikipedia.org/wiki/Open/closed_principle
Tapestry 5:http://tapestry.apache.org/
Spring Web MVC:https://projects.spring.io/spring-framework/
Dubbo:http://dubbo.io/
金融级分布式交易的技术路径
素描单元化
分布式事务综述
分布式事务解决方案与适用场景分析
分布式系统数据层设计模式
蚂蚁通信框架实践
蚂蚁消息中间件 (MsgBroker) 在 YGC 优化上的探索
长按二维码关注我们 ▶▶▶
点击【阅读原文】获取招聘信息或发送简历到 sofa@cloud.alipay.com,期待您的加入!