(一)从0开始写框架—开篇介绍

概述

  我们这个系列的文章叫做“从0开始写框架”,那从文章的标题可以知道,这系列的文章主要是讲:一个java框架是如何开发出来的。看到这里,可能已经有部分小伙伴不明觉厉了。
  但其实,开发一个框架并不是什么很神秘、很高大上的事情,就跟我们平时做业务类的项目差不多,这个差不多指的是开发形式上差不多。不一样的地方就在于思想上要做一个转变,我们要从使用别人提供的功能,转变为提供功能给别人使用。这看似很简单的一句话,但却非常关键,所以有必要再强调一次:“提供功能给别人使用”。有过框架开发经验的开发者都知道,在开发一个框架的过程中,都会不断的对自己说,“我这个功能是提供给别人用的,怎么才能让别人用起来简单一点,最好让别人少写代码”,“需要怎么提高性能和安全,让别人用起来安心一点”,“为了应对某些人有特殊的需求,所以必须要提高扩展性”。等等的这些话都是在我们开发一个框架的过程中,不断提醒自己的,而这些话,正是开发框架应该具备的思想,在这些思想指引下,我们才会想方设法的使用各种技术来实现目标。
  回到我们做业务项目上,更多的是要求快点把功能完成,为了达到这个要求,我们就会不断的提醒自己:“代码重复不要紧,后面有时间再重构”,“性能很差不要紧,后面有时间再优化”,但往往后面就不会重构和优化了,因为那时,项目可能已经很臃肿,看都不想去看了。这种情况,在开发框架项目上是绝对不能有的,所以说开发框架的话,一定要转变自己的思想。
  还有一部分的小伙伴看到这个标题后,可能会想,标题党又来了,什么写框架啊,到头来估计又是在讲概念,讲思想就完事了。首先,概念和思想是肯定要讲的,然后,我们才真正的从0开始去开发一个框架。但是,关键不是这个框架本身,而是做这个框架的过程,所以不要太在意接下来要做什么框架,解决什么问题。而是需要在意做框架的过程中,它的方法和思想,这样我们才能举一反三,触类旁通。

怎么理解“框架”

  可能很多小伙伴从学习java的那一刻起,就跟着老师说,这框架那框架的,但是老师从来没有提过什么是框架,自己也没有思考过,框架是什么,就知道这个就是框架了,那个不是框架,对框架的概念理解很模糊,那现在,我们就来普及一些基础常识,比如插件、框架、中间件这些术语的来龙去脉。
  首先,框架的出现是我们对于“复用性”的要求越来越高,不想重复造轮子,从最初的单个函数的复用,到面向对象中类的复用,再到由多个类组成的lib包,提供类库的复用。复用软件的抽象层次越来越高,而框架就在这种背景下产生的。框架复用是抽象层次的又一提升,框架的复用不仅仅是功能的复用,更是设计的复用。
  我们在来看看框架的含义:框架是一个半成品的应用,它封装了某领域内处理流程的控制逻辑,由于软件开发各种领域问题众多,所以框架必须具有针对性,比如,有针对底层通讯领域的框架,有针对分布式应用领域的框架,有针对对象关系映射领域的框架等等。框架这个半成品应用像是一个骨架,然后我们在这个骨架上添加血和肉,就是我们具体的业务代码了,然后组成一个完整的应用。
  框架我们就了解到这里,接着我们来扩展一下,看看什么是插件,什么是中间件。插件其实就类似我们上面提到的“类库”了,由于复用性的要求,我们需要把一些重复使用的功能抽取出来,而这个功能的实现又需要多个类组成,那么把这多个类打成一个包,以工具的形式提供某种类型的功能给别使用,就是类库或者说插件了,它不能单独成为一个应用。比如:二维码生成工具、文件操作工具、报表生成工具等等。打个比喻,如果说框架是骨架,我们的业务功能是血和肉,那么插件或者说工具类库就像是:牙齿、头发和指甲之类的了,有它们最好,没有也不会死。最后来看看什么是“中间件”,不同于刚刚说的框架和插件,框架、插件和我们的业务代码共同组成一个应用,而中间件它本身就是一个独立运行,并且是完整的一个应用,不是半成品应用,这种类型的应用主要是对外提供某种领域的网络服务给其他应用使用,比如:数据库服务中间件,分布式缓存中间件,消息队列中间件,搜索引擎中间件等等。打个比喻的话,就是你的合伙人,你的队友之类的,你们每个独立的个体相互合作,共同完成某个目标。

具体目的

  该铺垫的东西我们已经铺垫好了,接下来就要准备动手开发这个框架了。通过上面对框架的了解,我们知道,每个具体的框架都是在解决特点领域问题的,那这样的话,我们接下来要开发的这个框架是解决什么领域的问题呢?这个领域的选择也是不能随意的,首先,需要排除那些老旧的领域:比如ORM、MVC这些领域,因为这些领域制造不了多少话题。还要排除解决方案非常成熟的领域:比如底层通讯,分布式应用,这些领域因为发展的时间比较长,都比较成熟和完善了,也就没有多大的必要再拿来研究。那经过排除之后,我们就选择现在比较热门的话题,面试的时候也是经常问到的,并且现阶段,还没有一个非常成熟的解决方案,就是:“分布式事务”,我们用这个领域的问题作为载体,去开发一个分布式事务框架。但是,还是需要再强调一下,我们的目的是学习框架的开发过程,而不是这个具体的分布式事务框架。

注:阿里在18年年底开源了一个分布式事务框架:fescar。地址为:https://github.com/alibaba/fescar,虽然现阶段还不是很完善,但看阿里官方的规划,后面的版本是会越来越强大的,大家有时间可以上去学习一下。

  在开发这个分布式事务框架的过程中,我们会学到很多技术,学习这些技术才是我们开发这个框架的目的,而这些技术又是在平时我们做业务类的项目很少有机会接触的,具体如下:

  • 注解的使用
      我们这里所说的注解的使用,并不是指平时我们做业务功能时,贴一个注解就完事的那种用,而是去定义一个注解,然后给该注解赋予一个意义,也就是说,我贴了这个注解,能帮我完成什么功能。在我们做业务项目的过程中,是很少有机会让我们去定义注解的,而做框架就不一样了,我们上文提到的,做框架其中一个思想:易用性,如果你想让你的框架,在给别人用的时候,是很简单的,那就需要考虑使用注解了,被人不用怎么去写代码,只需要贴个注解,然后框架就帮他做完了事情。
  • 并发的使用
      很多小伙伴经常反映,java下的并发包(concurrent)下的东西很少使用,我们如果是做业务类的项目,那确实是这样的,但是如果我们要做框架,那就不是了,因为性能和安全也是做框架的一个指导思想,每时每刻都需要思考,什么功能需要使用多线程来提高性能,什么功能又会不会因为并发,导致出现安全问题。在开发的时候就需要精心设计了,而不是说开发完了再优化,不然的话,我相信做出来的框架不会有人敢冒险使用的。
  • SPI的使用
      SPI是Service Provider Interface的简写,这项技术也是平时我们做业务项目没机会接触的,我们知道,一个好的框架,肯定是一个扩展性很强的框架,这个在我们上文讲开发框架的指导思想时也提到了,也就是扩展性。接下来我们再慢慢揭开SPI的神秘面纱。
  • 设计模式的使用
      最后需要提及的技术就是设计思想,这个可以说是一个框架的灵魂了,我们在讲框架概念的时候提到,框架就是对软件“复用性”的要求越来越高的产物,使用硬编码是肯定不能达到“复用性”的要求的,所以,各种设计模式就应运而生了。在开发框架的过程中,我们会接触一些业务项目没机会接触的设计模式,比如动态代理模式,工厂模式,策略模式,适配器模式。
      学习以上的这些技术才是我为什么要写这个专题文章的目的,我想每一个程序猿都有一个小目标,不是赚一个亿,而是做架构狮,当然,架构狮是会写业务代码的,因为任何开发语言的架构狮都是从一线开发成长起来的,但是只会写业务代码的程序猿是不可能做架构狮的,而掌握以上技术,就是成为架构狮的第一步。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,783评论 2 89
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 一身黄袍蔽自由 不闻百姓疾苦声 臣子野心宫角斗 寡人甘自为庶人
    山屈生阅读 138评论 0 0
  • 有时,人真是孤独。 ---------林宇轩------转载必经本人同意--- 有朋友,有工作,有同事,有家人,但...
    蜀锦景泰蓝阅读 218评论 0 1
  • 为了安装Ubuntu和树莓派,我在两个U盘中都绕录了不同的系统。但是安装完,想恢复U盘的正常使用,方法如下: 在w...
    玩er2017阅读 1,879评论 0 0