IT 技术发展太快了,就像浪潮同样一波接着一波,朝你迎面扑来,稍不留神就会被巨浪卷至海底而不得翻身。咱们必需要学会抓住那些不变的本质或规律,只有这样才能屹立潮头而不倒,乘风破浪,作这个巨变时代的弄潮儿!前端
2003年,Rod Johnson 建立了 Spring,我在那一年开始了研究生实习。2005年参加工做,通讯行业,主力开发语言是 C/C++。在校勤工俭学时捣鼓过 JSP,2005年先后我开始自学 Spring 搭建我的网站,那时 Java 领域最火的开发框架组合就是:Struts + Spring + Hibernate,SSH。2009年,我跳槽到了移动互联网行业,主力开发语言逐渐转为 Java。2014年,我再次跳槽进了互联网金融行业,基于 Spring 扩展定制内部开发框架,从 Spring 用户变成了扩展开发者。2016年因参与内部云平台建设,我跟 Spring 的东家 Pivotal 公司还有过一次合做。随着微服务等技术的兴起,近些年我作了许多 Spring Boot\Spring Cloud 扩展定制和培训推广。web
一晃眼十五年过去了,从取代 EJB 的轻量级开发框架开始,到无比强大的生态圈,再到 Spring Boot\Spring Cloud 从新塑身成为云原生应用开发领域的首选框架。Spring 早已不是最初的模样了,在它身上发生过无数变化,但惟一不变的是它仍旧稳坐 Java 开发框架领域的头把交椅。或许大部分读者都熟悉 Spring 的使用,但你知道它背后的核心技术有哪些吗?这些年它都发生过哪些重大的变化?它演进至 Spring Boot/Spring Cloud 的缘由是什么?它的成功源于哪些关键的产品设计理念?...... 熟悉 Spring 的使用仅仅是"知其然",惟有"知其因此然",咱们才能真正融会贯通用好它。快来吧,千万不要错过!老兵用血汗经验为你剖析那些风云变幻中的不变量:spring
适读人群:开发、测试、架构、产品等数据库
Java EE 或 J2EE,都是 Java Platform Enterprise Edition 的简称,它是一套开发分布式企业级应用的规范和标准,由一整套服务(Services)、应用程序接口(APIs)和协议构成,下面是 J2EE 涵盖的13种技术规范:编程
生产力决定生产关系,而科学技术是第一辈子产力。Java 最先是由 Sun Microsystems 公司发明的高级编程语言,EJB 也是由 Sun Microsystems 公司推行的 J2EE 标准规范,而 Spring 却取代 EJB 成了事实标准,以世俗的眼光看,这是一个经典的以弱胜强的故事。当时,EJB 的背后有许多知名的商业公司提供强力支持,而 Spring 仅仅是 Rod Johnson 我的的玩票做品,为何最终结局出乎意料呢?其实,弱是没法胜强的,只是当时世人看不懂 Spring 比 EJB 强在什么地方,如今咱们再去剖析就知道它强在技术上,先进的技术造就了 Spring 的轻量和易用,再加上开源免费的商业模式,最终赢得用户。安全
那究竟哪些核心技术造就了 Spring 的辉煌呢?除了最著名的控制反转 IOC、依赖注入 DI 和面向切面编程 AOP 等外,还有 MVC、Taglib、ORM、Annotation 等,以及对 J2EE 其余标准规范的支持,包括:JDBC、JNDI、RMI、JMS 等,接下来咱们简单介绍一下这些关键技术,若是想更加深刻的了解,你们能够找资料作专题学习。架构
Spring 做为开源框架,为了下降企业应用的开发复杂度的人建立,但如今它已经不限于企业应用这个领域了,而是一个轻量级的控制反转 IoC(Inversion of Control)和面向切面 AOP(Aspect Oriented Programming)的容器框架。经过 IoC 技术让应用达到松耦合的目的,经过面向切面编程分离业务逻辑与系统服务。IoC 容器负责管理全部应用对象的配置和生命周期,将简单的组件配置、组合成为复杂的应用。mvc
控制反转 IoC 的另一个说法就是依赖注入 DI(Dependency Injection),它规范了对象与被依赖对象之间的装配过程,对象经过构造器参数、工厂方法参数、属性设置函数来声明依赖关系。IoC 容器提供装配和管理 Bean 功能,整个装配过程由 IoC 容器调度控制的,它在建立对象实例过程当中将其所依赖的实例注入,这跟 Bean 直接经过构造器或者 Service Locator 模式本身控制初始化或定位所依赖实例的过程是相反的。 app
从装配这个角度看,Spring 对业务是非侵入性的,业务代码不依赖 Spring,即剥离 Spring 从新换一套框架或者本身写一套组装代码,原先的业务代码是能够重用的。IoC 最初的目的就是充分利用 OO 的多态性,经过配置文件而不是硬编码来实例和装配对象,这样就为具有了为不一样客户场景提供服务的灵活性。 框架
Java 数据库链接 JDBC(Java DataBase Connectivity)是用于执行 SQL 语句的 Java API,能够为多种关系数据库提供统一访问:
2002年,老兵哥我本科毕业,当时正是 J2EE、EJB 最火的时候,许多业内知名的大公司(例如:Sun Microsystems、Oracle、IBM 等)都在推进 EJB 相关技术的发展和落地。当年仍是年轻小伙的美国人 Rod Johnson 认为 EJB 太过于臃肿,并非全部项目都适用 EJB 这种重型框架,他坚信有其余更加优雅的解决方案。为了验证本身的想法,Rod Johnson 在2002年10月出版了一本书《Expert one on one J2EE development without EJB》,在书中他剖析了 J2EE、EJB 框架中存在的一些关键缺陷。Rod Johnson 坚决地认为:
同时,他提出了一套基于普通 Java 类依赖注入的轻量级解决方案,而且以一个在线座位预约系统为例演示了如何在不使用 EJB 的状况下构建高质量、可扩展的系统。为了构建这个演示应用,他编写了超过 30,000 行的基础结构代码,随书籍开源而别普遍引用。因为该开源工程的根包命名为:com.interface21,因此你们最初称这套开源框架为:Interface21,它就是 Spring 的前身,这是一个无意插柳柳成荫的故事。
随着 Interface21 被愈来愈多的用户承认及使用,Rod Johnson 拥有了跟 EJB 平起平坐的勇气和信心,后来他就开始全职投入,并在2004年3月24日对外发布了 Spring Framework 1.0 final。当时,整个 Spring 就是一个完整的项目,全部功能都包含在这个项目当中,其中包含最核心的控制反转 IOC 和面向切面编程 AOP,除此以外还包括:JDBC、Mail、ORM、事务、定时任务、Spring MVC等配套功能。
站在今天回望过去,当年 Rod Johnson 还作对了一件事情,就是拥抱开放、开源,在 Spring 1.x 阶段就已经支持许多第三方开源框架了,例如:Struts、Hibernate、iBatis、模板引擎等。从 Spring 诞生到如今的十五年左右时间,正是软件开源运动蓬勃发展的十五年。Spring 借助开源社区的力量,汇聚全球贡献者,才造成了无比强大的生态圈,才具有了与传统软件业巨头竞争的能力,而 EJB 选择了封闭,差之毫厘谬以千里。
Spring 1.x 主要知足了当时正在兴起的企业应用规模化开发需求,当时 J2EE 应用的经典架构是分层架构:表现层、业务层、持久层,最流行的组合就是 SSH:Struts、Spring、Hibernate。Spring 1.x 仅仅支持基于 XML 的配置,确保用户代码不依赖 Spring。Spring 1.x 主要包含了如下功能模块:aop、beans、context、core、dao、ejb、jdbc、jndi、mail、metadata、orm、remoting、scheduling、transation、ui、util、validation、web 等。
相对于 Spring 1.x,2.x 并无发生太大的改动,主要是在 1.x 的基础上渐进式的加强,增长了下述新的功能模块:cache.ehcache、instrument、jca、jms、jmx、scripting、stereotype 等。
Spring 以简单适配的方式集成第三方开源组件,随着它自己的功能愈来愈丰富,以及生态圈愈来愈强大,单个项目工程已经没法知足开发、维护和使用的要求了,Spring 3.x 将原先单个工程项目拆解成多个子项目,这样方便用户按需选用,不像先前的版本,无论用与不用都要引入所有模块。化整为零,这个变化带来了很是大的影响,Spring 不只是功能模块的堆积了,它开始标准化集成相关的技术了,这有利于构建更加庞大的生态,也更利于得到新的用户。
为何这么说呢?原先 Spring 是一个总体,用户选不选它是比较大的技术决策,而如今每一个组件都是能够单独引入的,相对原先的决策范围变小了,风险也就下降了,用户能够先小范围试用,下降了用户上车的难度。等用户使用上 Spring 的组件,那么跟用户就创建了链接,让用户有更多机会了解 Spring,从而影响用户选用更多的组件。
Spring 框架被拆解成多个组件,它能够为不一样应用架构提供基础的支持,包括消息、事务管理、持久化和前端组件等,它不只包括 Servlet-based 的 Spring MVC 前端 Web 框架,还包括 Spring WebFlux 等响应式 Web 框架,用户能够按需选择。
沿着 Spring 3.x 组件化的方向,4.x 继续升级演进升级,Spring Framework 扩充了 Groovy、Messaging、Webmvc、Tiles二、Websocket 等功能组件。同时,Spring 还有条升级主线就是适配 Java 的版本,全面支持Java 8.0,支持 Lambda 表达式等。随着 RESTful 架构风格被愈来愈多的用户所采用,Spring 4.x 也提供了 RestController 等注解新特性。
软件技术更新换代很是迅速,稍不留神就可能落后于时代,Spring 5.x 紧跟 Java 相关技术的更新迭代,不断适配最新版本的 Java,同时不断重构优化自身核心框架代码,支持函数式、响应式编程模型。咱们说历史有其必然律,曾经屠龙的勇士终将变成恶龙,近十年的升级演进让 Spring 愈来愈强大的同时也变得异常复杂,曾经靠轻量化、易于使用等特色打败了 EJB,现现在却变得跟 EJB 同样臃肿了,Spring 可否挣脱这个历史的必然律吗?
老兵哥是从 2.x 开始加入 Spring 阵营的,期间跟随 Spring 的升级演进一路走来,对它还算是熟悉了解的,这背后沉淀着十年左右的背景知识及使用经验。但对于刚刚参加工做不久的新人来讲,Spring 显得太庞大、太复杂了。任何专业技能的精进都离不开长时间的学习和实践,但现实告诉咱们,新人才是大部分企业中应用开发的主力人群。可否适应环境变化知足这些新生力量的诉求,将决定 Spring 可否继续稳坐 Java 应用开发框架的头把交椅。
老兵哥近两年在公司内部推广微服务架构,微服务的实现方法有许多种,但关键要从用户视角出发。如今九零后是主力开发人群,完整的 Spring 技术栈对他们来讲挑战太大了,他们缺少足够的动力学习如此繁杂的技术。这时候咱们必需要从技术视角转换成产品视角,了解用户的真实想法,下降他们学习使用 Spring 的难度。
在这个关键的时间点上,Spring 不忘初心,从新回到轻量化这个出发点上,采用约定优先配置的理念对复杂度作了封装,对用户屏蔽了许多实现细节。就像计算机的芯片技术异常复杂,但普通用户不须要懂太多电子电路知识就可使用,如今新人们也不要掌握太多背景知识就可使用 Spring Boot 作开发了。这是咱们技术人广泛缺少的产品思惟,常常遇见以复杂炫技的技术人,再牛的技术,若是不能被更多用户使用,那也终将被淘汰。产品思惟就是站在用户的视角看问题,往用户方向多走一步。对于如此大致量的 Spring 来讲,这不啻于涅槃再生。
考虑到咱们每一个人的工做学习状况不一样,平时遇到的问题也不一样,本文内容没法覆盖全部人遇到的问题,欢迎你们留言提问,也欢迎关注公众号「 IT老兵哥 」交流互动,谢谢!
**本系列其余文章索引以下:**Spring 核心技术与产品理念剖析【下】