JavaEE与Spring

Java社区中,Spring与Java EE之争是个永恒的话题。在这场争论中,来自两个阵营的布道师、架构师 与铁杆粉丝都在不遗余力地捍卫着本方的尊严,并试图说服对方加入到自己的阵营当中,但结果却是双方都很难说服对方,每一方都有充分的理由表明自己的选择是 正确的。参与到这场争论的有一些架构师,他们负责着平台的选择。那么对于普通开发者来说该如何思考这场旷日持久的Spring与Java EE之争呢?

Siva是一位充满激情的Java开发者、开源布道师、知名博主,擅长Java、Struts、hibernate、 Spring等各项技术与框架。Siva既使用过Spring,也使用过Java EE,但他既不是Spring的铁杆粉丝,也不是Java EE的忠实追求者。相反,他对于Spring与Java EE有着自己的理解和认识,并且在项目当中会根据具体需求选择适合的技术。近日,Siva分享了他对于Spring与Java EE的一些认识和理解,希望能对各位读者起到帮助作用。

业务方面

在很多组织中,技术选择并不完全是由开发者决定的。具体来说,如果你工作在一家大型的企业组织中,那么极有可能会有一个专门的架构师团队负责决定在项目中该使用什么平台、框架与库。除此之外,大型企业在选择技术平台时还会考虑如下几个方面:

  • 平台、语言、框架与库的成熟度
  • 商业支持
  • 许可费用等

作为一名开发者,你可能无法影响上述几方面的决策制定过程,特别是对于那些处于离岸开发中心的开发者来说更是如此。因此,对于开发者来说,你可能无需过多关注于上述几个方面。

如果你非常熟悉Spring,那么掌握Java EE也不是什么难事,反之亦然。

我 非常奇怪有人会说他是个Java EE专家,但却无法理解Spring,反之亦然。无论Java EE还是Spring都使用了同样的核心APIs(Servlet、JPA、JMS、BeanValidation等),差别在于到底是什么将这些东西粘 合到了一起,是Spring还是应用服务器。

虽然对于依赖注入(Spring DI、CDI)、REST(JAX-RS、SpringMVC)等存在着不同的APIs,但他们彼此之间的行为却是非常类似的。可能有人会说CDI在类型安全上要比Spring DI更好,比如说:

  • 如果只有一个Spring/CDI Bean,那么使用@Autowired或是@Inject都是没问题的。
  • 如果有两个Spring或CDI Bean实现,那么注入就会失败并抛出错误,说“找到了多个可注入的对象”。
  • 使用@Produces或@Bean注解的方法可以实现自定义的Bean提供器。

只要二者行为类似,那么我就不关心谁的实现是更加类型安全的,谁在内部实现中采用了基于String的映射。我想说的是,怎么可能有人是Spring专家但却无法理解Java EE呢,反之亦然。一个Spring专家要花多长时间才能掌握Java EE呢?

Spring与Java EE哪一个对开发者更加友好呢?

我 认为到现在为止,很多开发者应该能够认识到一项技术的成功与否其实并不完全取决于自身的优缺点,还要取决于开发者的使用率。我们要认识的重要一点是:“并 不是每一个软件开发者都是明星开发者,还有很多处于中等水平的开发者”。为了让人们能够使用某一个框架或技术,框架或技术本身要贴合这一部分人的需求。我 觉得Spring在这方面做得非常好,它提供了诸如Spring Boot、用户指南等工具帮助开发者上手。Spring Security、Spring Integration、Spring XD、Spring Social等项目都很好地解决了业务的需求。此外,Spring还提供了各种各样的模板,让人们能够轻松上手开发而无需编写大量的样板代码。

Java EE也通过JBoss Forge、Wildfly Swarm等工具帮助开发者上手。除了Picketlink之外,我几乎看不到有哪些Java EE框架提供了安全解决方案;但即便是Picketlink,我觉得也过于复杂了。我想表达的观点是“Spring能做到的事情,Java EE基本上也都能做”。区别在于哪一个会为普通开发者提供开箱即用的支持。

缺乏上下文的争论

当Spring阵营与Java EE阵营的人开始争论时,注定是没有终点的。但遗憾的是,争论很多时候都围绕着毫无意义或是过时的点上面,比如说下面这些:

大量使用XML

Java EE粉丝一开始就会说Spring大量使用了XML,我憎恶XML之类的。如果你还在使用Spring 2.5以下的版本,然后就认为Spring中充斥着大量的XML,那么我想说你醒醒吧,到http://spring.io看看。

EJB与JSF都是垃圾

Spring粉丝会猛烈抨击EJB与JSF,就好像他们还是EJB 2.x或JSF 1.x那样。如果仔细看看EJB 3.x与JSF 2.x,那么他们就不会有这个想法了。不要拿6年前EJB2.x的老眼光看待现在的EJB 3.x。

重量级与轻量级

这 里的“重量级”指的是运行时情况。在将托管Beans部署到Java EE容器中时,容器会为其生成代理并注入所有的企业服务(事务、安全等),对于Spring来说,则是通过Spring AOP来实现的。这里其实没有办法判定哪一种方式更加重量级,容器代理呢,还是Spring AOP代理,不过我觉得二者之间的差别并不太大。有些人会将部署的war包大小作为判断是否“重量级”的一个依据。在这种情况下,Java EE应用服务器 + war与Spring App + 126 jar之间的差别倒是很明显。

厂商锁定

我 认为选择平台时可以不依赖于某个特定的厂商是很重要的,不过纯粹基于可以迁移到另外一个实现这一理由来选择平台也是不恰当的。可以想想,你有多少机会会从 一个服务器迁移到另外一个服务器?选择一个平台时不必锁定到某个厂商是个“锦上添花”的行为,但绝不应该将其作为关键因素。

我们不需要外部程序库

这就是所谓的“为了争论而争论”。给我看看有哪个应用不需要其他依赖?如果你说你要开发自己的日志库,编写自己的HTTP客户端、开发自己的通用库,那么我只能说这样的开发者也算是奇葩了,放着现成的不用,还要“重新发明轮子”。

你现在使用的是X,你应该迁移到Y

我 发现很多社区站点都存在这样的观点,特别是在Reddit。当有人发出关于Java EE与Spring的帖子时,就会有两拨人参与进来,猛烈抨击对方,原因就是对方没有使用自己钟爱的平台。先想一想,如果Spring是垃圾,那怎么还会 有那么多人使用并喜欢它呢。如果Java EE不好,那为何还会有人从Spring迁移到Java EE上呢。每个平台都有长处。你要做的就是尊重他人。如果可能,问一下他们为何要选择这个平台,是不是有你不知道的理由在里面呢?

作 为一名热情的Java开发者,我真心希望在关于Java EE与Spring之间的争论中能找到我之前不了解的东西,比如说“在哪些情况下,Spring要比Java EE更合适;在哪些情况下,Java EE要比Spring更好”。我希望Spring与Java EE更够形成良性竞争,让自身变得越来越好。这样,无论谁最终赢得了竞争,受益的还是广大开发者们,因为他们拥有了更为强大的平台。

转自http://www.infoq.com/cn/news/2015/07/spring-javaee

开发者眼中的Spring与JavaEE的更多相关文章

  1. 【转载】开发者眼中的Spring与Java EE

    转载自:http://www.infoq.com/cn/news/2015/07/spring-javaee 在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵 ...

  2. 转载:开发者眼中最好的 22 款 GUI 测试工具

    对于很多同学来说gui程序的测试是一个难点,所以我从网上转载了一篇关于gui测试的一篇文章,里面罗列的很多工具,大家可以尝试一下学习学习. 英文原文:22 best GUI testing tools ...

  3. 10年架构师告诉你,他眼中的Spring容器是什么样子的

    相关文章 如何慢慢地快速成长起来? 成长的故事之Spring Core系列 你是如何看待Spring容器的,是这样子吗? Spring的启动过程,你有认真思考过吗?(待写) 面向切面编程,你指的是Sp ...

  4. 开发者眼中最好的 22 款 GUI 测试工具

    1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地 ...

  5. jQuery开发者眼中的AngularJS

    文章来源:http://blog.jobbole.com/76265/ AngualrJS是一个很贴心的web应用框架.它有很不错的官方文档和示例:经过在现实环境中的测试著名的TodoMVC proj ...

  6. JavaEE与Spring

    在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵营的布道师.架构师与铁杆粉丝都在不遗余力地捍卫着本方的尊严,并试图说服对方加入到自己的阵营当中,但结果却是双方 ...

  7. 什么是JavaEE,什么是Spring

    作者:大宽宽链接:https://www.zhihu.com/question/268742981/answer/341770209来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  8. Spring框架概述

    Spring是最流行的Java企业级应用开发框架,全球数以百万的开发者在使用Spring框架创建高性能.易测试.可重用的代码. Spring框架的核心特性可以应用于任何Java应用,但扩展的JavaE ...

  9. 畅谈Spring设计哲学

    自己从学习编程开始到现在有一个习惯:一直喜欢把软件开发中的技术和思路放到实际生活中去类比考虑.自己平常也喜欢开一些关于软件哲学的书籍,事实证明这些书籍对自己的学习新技术很有很大的帮助.数学是一切学科的 ...

随机推荐

  1. Nginx auto_index和auth_basic

    Nginx auto_index和auth_basic 1.nginx auto_index nginx站点目录浏览功能,默认情况下为关闭 启用或禁用目录列表输出 开启这个功能的前提是站点目录下没有首 ...

  2. sql NextResult()多个结果集

    转自  http://blog.csdn.net/limlimlim/article/details/8626898 注意:当SQL语句中出现两条Select语句,例如:string sql = &q ...

  3. JavaScript历史状态管理

    1.API (1)history.pushState:能够在不加载新页面的情况下改变浏览器的 URL history.pushState({name:"Nicholas"}, &q ...

  4. C++ 智能指针详解(转)

    C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常 ...

  5. 对于刚開始学习的人Xcode最经常使用的快捷键

    对于刚開始学习的人而言,好多人都是直接使用鼠标进行操作.差点儿非常少使用快捷键,从而再练习编程时比别人慢那么一点,今天就把刚開始学习的人最经常使用的几个快捷键给大家总结下,当然欢迎大家补充. (1)c ...

  6. c语言字符串赋值

    char *p="asdf";能运行 定义一个字符指针,并用它指向常量字符串"asdf"的首地址 char *p;p="asdf"; 能运行 ...

  7. MVC组件分析

    MVC组件分析   2 System.Web.Mvc V 4.0.0.0 组件分析 2.1 Routing组件(路由选择) Routing的作用就是负责分析Url Action的要求• 必须是一个公有 ...

  8. .net core 2.0小白笔记(一):开发运行环境搭建

    小白一枚,有任何不妥之处敬请指教 这里不讨论什么设计模式,什么架构,什么什么,就是入门,简单的入门,虽然能跨平台,但是这里还是在win的环境下进行,不扯的那么远 其实官网文档写的挺不错的了,就是偶尔有 ...

  9. 如何去掉MapReduce输出的默认分隔符

    我们在用MapReduce做数据处理的时候,经常会遇到将只需要输出键或者值的情况,如context.write(new Text(record), new Text("")),这样 ...

  10. java之JDK动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...