什么是JavaEE,什么是Spring
链接:https://www.zhihu.com/question/268742981/answer/341770209
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在回答题主的问题之前,我先要简单介绍一下什么是JavaEE,什么是Spring。
JavaEE是一组建立在JavaSE之上的标准,解决企业级开发中的一系列问题。请特别留意,它仅仅是个标准,是对一系列接口的约定,众多厂商围绕这个标准做实现。如JBoss,WebSphere等。第一个版本的JavaEE 1.2在1999年被发布,到2017年的JavaEE 8,已经经历了将近20年。
那么JavaEE都有哪些标准,解决了什么问题呢?我这里简单列举一下主要的标准:
- Servlet:定义了如何处理Web请求,这个相信大家最熟悉
- Java Server Faces:定义了如何使编写Web界面
- JAX-RS:定义了如何编写RESTFul的接口
- EJB:定义了如何编写“企业Bean”
- JPA:定义了如何编写ORM和数据存取
- JTA:定义了如何编写事务相关的代码
- JMS:定义了如何编写消息队列程序
- CDI:定义了如何编写依赖注入
- JAX:定义了如何编写XML程序
- JAX-WS: 定义了如何编写基于XML的网络服务,即SOAP
- ……
看到这些,你可能机会发现,你平时其实经常使用其中一些标准接口,即便你认为你在用Spring。
什么是Spring呢?Spring最早可以追溯到2002~2004年。在那几年作者Rod Johnson出版了两本书:“Expert One-on-One J2EE Design and Development“和“Expert One-on-One J2EE Development without EJB“,和最初几个版本的Springframework。
早期的Spring定位于解决J2EE在实际使用上的一系列问题,因为JavaEE的API实在是太难用了。Rod估计是趟了不少大坑,于是总结了一套最佳实践,并总结到了一套框架里。其中最重要的,就是所谓IoC(控制反转)。
经过多年发展,Spring发布了很多组件:
- spring-core:Spring的Bean的管理,控制反转和程序上下文
- spring-mvc: web开发中的model-view-controller
- spring-data: 数据层访问和封装
- spring-boot: spring全家桶自助配置和部署管理工具
- spring-batch:一个简单的批处理框架
- spring-cloud:支持与许多云服务接口的整合
- spring-security:认证和权限管理
- ……
spring中其实大量使用或者实现了JavaEE标准。比如spring-mvc是在servlet基础之上的封装。spring本身并不提供容器,而是支持使用任何支持servlet标准的容器(如tomcat,jetty等)。spring-data也实现了JPA,通过标准接口对进行CRUD等。
归根到底Spring只是想更好的解决实际问题。JavaEE的实现做得好的就用,做得不好的用比较恰当的方式独立实现或者封装。俗称“接地气”。
见过不少人喜欢用“JavaEE vs Spring”来提问引战。但是,由上面的介绍可以看到JavaEE和Spring并不对立。作为开发工程师,其实还是哪个能解决问题,生态好,支持好,成本低就用哪个。而且混着用也没有什么大的问题。
随着时间的发展,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+微服务的发展进一步的强化了这个现实。大量的新技术会随着业务领域形成自己的生态。
这其实是好事,不是吗?
什么是JavaEE,什么是Spring的更多相关文章
- JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- JavaEE开发之Spring中的条件注解组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- JavaEE开发之Spring中的条件注解、组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- javaEE中的spring配置笔记
0 JavaEE的工程目录 0.1 WebContent 项目的主目录,在eclipse新建工程时可以自己命名,部署时会把该文件夹的内容发布到tomcat的webapps里. 该目录下可以建立 ...
- 【JavaEE】SSH+Spring Security自定义Security的部分处理策略
本文建立在 SSH与Spring Security整合 一文的基础上,从这篇文章的example上做修改,或者从 配置了AOP 的example上做修改皆可.这里主要补充我在实际使用Spring Se ...
- 【JavaEE】SSH+Spring Security基础上配置AOP+log4j
Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中 ...
- 【JavaEE】SSH+Spring Security+Spring oauth2整合及example
现在加最后一样,就是oauth2,现在很多网站都有对应的移动版本,那么移动端访问服务端的服务怎么控制权限,我知道的主要是两种方法,第一是模拟浏览器,访问服务的时候会生成session,之后在移动端缓存 ...
随机推荐
- javascript框架设计(读书笔记)
我觉得多看几本进阶的书 与其十本书读一遍,不如一本书读十遍 读书的启示: 读好书(看推荐) 精读(重复看) 能读厚书(javascript权威指南) Object.keys Object.keys=O ...
- 关于MVC与三层架构
详情 回答一: 当然啊,你要明白三层架构的MVC的区别和联系: 三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式.首先你要明白MVC分别代表的是什么意思. M ...
- C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳) 在使用 TcpClient 网络连接中常常会发生客户端连接异常断 ...
- JavaScript入门(三)
JavaScript入门篇—JSONP的应用 什么是JSONP 个人理解:将服务器端返回的json数据封装成JavaScript对象,非正式传输协议. JSONP解决了什么问题 Ajax不支持跨域请求 ...
- Puppet自动化管理配置
Puppet:开源系统配置和管理工具 随着虚拟化和云计算技术的兴起,计算机集群的自动化管理和配置成为了数据中心运维管理的热点.对于 IaaS.Paas.Saas 来说,随着业务需求的提升,后台计算机集 ...
- 详细的Hadoop的入门教程-完全分布模式Fully-Distributed Operation
1. 前面在伪分布模式下已经创建了一台机器,为了统一命名,hostname更名为hadoop01.然后再克隆2台机器:hadoop02. hadoop03:将第一台机器hadoop01上的伪分布停止, ...
- localStorage、sessionStorage、Cookie的区别及用法
1.webstorage 本地存储,存储在客户端,包括localStorage和sessionStorage. (1)localStorage:生命周期是永久,这意味着除非用户显示在浏览器提供的UI上 ...
- android中的webview白屏问题
最近在使用WebView的时候,发现了一个小问题,很多初学者应该会注意不到! WebView的layerType属性有三个值. 1.none,默认值, 2.software,软件加速, 3.hard ...
- linux设备驱动程序--gpio控制
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
- 树莓派无显示屏连接wifi
在烧好Raspbian系统的TF卡boot分区新建 wpa_supplicant.conf 文件,内容如下(修改自己的WIFI名和密码,key_mgmt根据路由器配置),保存后启动树莓派即可自动连接W ...