在回答题主的问题以前,我先要简单介绍一下什么是JavaEE,什么是Spring。node
JavaEE是一组创建在JavaSE之上的标准,解决企业级开发中的一系列问题。请特别留意,它仅仅是个标准,是对一系列接口的约定,众多厂商围绕这个标准作实现。如JBoss,WebSphere等。第一个版本的JavaEE 1.2在1999年被发布,到2017年的JavaEE 8,已经经历了将近20年。python
那么JavaEE都有哪些标准,解决了什么问题呢?我这里简单列举一下主要的标准:程序员
看到这些,你可能机会发现,你平时其实常用其中一些标准接口,即使你认为你在用Spring。web
什么是Spring呢?Spring最先能够追溯到2002~2004年。在那几年做者Rod Johnson出版了两本书:“Expert One-on-One J2EE Design and Development“和“Expert One-on-One J2EE Development without EJB“,和最初几个版本的Springframework。spring
早期的Spring定位于解决J2EE在实际使用上的一系列问题,由于JavaEE的API实在是太难用了。Rod估计是趟了很多大坑,因而总结了一套最佳实践,并总结到了一套框架里。其中最重要的,就是所谓IoC(控制反转)。docker
通过多年发展,Spring发布了不少组件:spring-mvc
spring中其实大量使用或者实现了JavaEE标准。好比spring-mvc是在servlet基础之上的封装。spring自己并不提供容器,而是支持使用任何支持servlet标准的容器(如tomcat,jetty等)。spring-data也实现了JPA,经过标准接口对进行CRUD等。tomcat
归根到底Spring只是想更好的解决实际问题。JavaEE的实现作得好的就用,作得很差的用比较恰当的方式独立实现或者封装。俗称“接地气”。网络
见过很多人喜欢用“JavaEE vs Spring”来提问引战。可是,由上面的介绍能够看到JavaEE和Spring并不对立。做为开发工程师,其实仍是哪一个能解决问题,生态好,支持好,成本低就用哪一个。并且混着用也没有什么大的问题。mvc
随着时间的发展,JavaEE已经愈来愈落后,这是因为它的体制形成的。JavaEE的制定是由几大巨头按期开会协商经过,发布。而后个大容器实现厂商跟进。但这样太慢了。互联网的发展速度已经远不是这样一个僵化的体制可以适应的。反观Spring相对就快速的多。Spring本身就是一家公司,以为整个社区什么东西最前沿,最急缺就马上响应去作了。好比,Restful刚流行,你是愿意等一年半载出JAX-RS标准,而后再出Jersey,才能用;仍是选择直接用Spring MVC直接就把事办了?结果不言而喻。对解决问题的态度是两者目前境遇不一样的主要缘由。
最先期JavaEE是领导者,全部的技术厂商要想在这个圈子里混,必须跟着标准走。而Spring逐渐占据领导地位以后,JavaEE的一些标准反而要跟着Spring走。CDI就是一个很好的例子。Spring IoC是整个框架的核心。它解决了在Java中只能import类,却import不了组件的问题。这个问题在js,python之类的环境中都是小菜一碟。可是Java中,若是没有IoC,程序员就要花大量的时间写new和set,组装整个服务的引用关系(你不以为这很不人道吗?)。Spring流行以后,JavaEE在2009年才发布CDI标准。其样子就是活脱脱的把Spring的Annotation换了个名字而已。
若是说将来的发展,我认为JavaEE早已经没有了将来。JavaEE里那些作得很好的,或者和其余框架可以很容易相融的标准继续存在;那些被骂成翔的,好比JSF;或者一开始就没有市场的,好比CDI,会成为Wiki上的一段段文字记录。但,Spring也不必定好过。在Java体系内他也要面临play,vert.x的冲击;在体系外,它会受到其余语言环境的巨大压力,如nodejs,python和go。说Spring灵活是相对于JavaEE而言。
不管标准、框架、服务,都是为了解决问题而存在,而不是如“多么的OO”,“多么的标准”,“多么的概念清晰“。哪一个工具解决的好,解决的快,就用哪一个。最近2~3年,docker+微服务的发展进一步的强化了这个现实。大量的新技术会随着业务领域造成本身的生态。
这实际上是好事,不是吗?