第7章-模块化架构
背景:随着软件规模的增大以及功能复杂性的提高,越来越有必要将单个应用拆分为独立的块、组件、模块或者插件。每个这样的部件都是模块化架构邮寄组成单元,而且每个部件都应该是独立的,并提供定义良好的对外接口供外部调用
模块化应用程序之于普通面向对象程序,相当于结构化编程之于意大利面条代码,都是为了避免GOTO效果
通过检查模块间依赖,可以评估一个应用架构的好坏
一个模块不依赖于另一个模块,显然该模块中类不会直接访问另一个模块中的类,这使得整个程序架构更加清晰,因为它有效避免无关代码部分之间类似GOTO的跳转
解决方案:
每个模块都应该对外提供公开的API
包之间避免不必要的交叉引用
只要代码开始访问其他无关模块中内容,那么技术架构退化就不可避免,从一开始就使用模块化思想进行设计,这才是王道
####1、模块化设计的类型 1、界面有关的代码就不需要提供对外API 2、提供简单但又非常通用的功能类库模块 3、考虑其他第三方基于该模块进行二次开发可能性(PDF文档支持) 4、模块化架构将规范与集体实现分离,分别放置不同模块中 5、通常采用模块化类库
####2、组件定位和交互 副标题:模块化架构中那些发现注入和依赖注入的模式
模块化目的实现一个程序中各组成部分的松耦合
依赖注入 (Spring)(Inversion of Control, IOC) 组件注入方案 1、配置 2、注解:通过注解标识JavaBean,将其注入,减少人工手写配置。(反射,编译性注解) 3、SerivceLoader 4、Lookup
选用Lookup理由 1、兼容各个版本JDK 2、lookup考虑动态性,当模块卸载有监听 3、Lookup提供两类API,一个为客户端代码服务,查询已注册服务,另一类API为开发者服务,方便编写服务池
####3、编写扩展点 配置Lookup 通过META-INF/serivces 注册实现类
####4、循环依赖的讨论 不容许出现出现循环依赖
####5、满城尽是Lookup 事件总线 Rxjava
####6、Lookup滥用 建议用作框架设计,而不是各处都采用