【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

开发者眼中的 Spring 与 Java EE

  • 2015-07-10
  • 本文字数:2716 字

    阅读完需:约 9 分钟

在 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 更够形成良性竞争,让自身变得越来越好。这样,无论谁最终赢得了竞争,受益的还是广大开发者们,因为他们拥有了更为强大的平台。

InfoQ 也发表过多篇关于 Spring 与 Java EE 之间比较的文章,那么亲爱的读者,你对二者有哪些看法呢,不妨与大家共同分享。

2015-07-10 09:5912171
用户头像

发布了 88 篇内容, 共 258.1 次阅读, 收获喜欢 7 次。

关注

评论

发布
暂无评论
发现更多内容

OpenHarmony标准设备应用开发(一)——HelloWorld

OpenHarmony开发者

Hello World ! OpenHarmony 标准设备

【CI/CD研讨会报名,截止最后一天】全程参会,还有惊喜奖品等你拿!

龙智—DevSecOps解决方案

cicd 持续集成 jenkins CI/CD 持续发布

Apache Impala架构解析及与Hive、SparkSQL的性能比较

编程江湖

提效24.3%!看OA预算管理系统的低代码开发实践

鲸品堂

低代码开发

OceanBase 在证券行业基金资管场景落地实践与解决方案

OceanBase 数据库

证券 oceanbase

Java篇|忘记格式化代码,把女朋友鸽了

Jianmu

Java 自动化 持续集成 建木CI 格式化代码

通过IPv6隧道实现天翼云云主机IPv4和IPv6双栈接入

天翼云开发者社区

网络

看完微信抢红包算法你就明白,为啥你不是手气最佳

华为云开发者联盟

算法 微信红包 手气最佳 剩余金额随机法 割线法

华为云GaussDB专家走进课堂,跟莘莘学子聊聊数据库

华为云开发者联盟

数据库 人才培养 华为云 GaussDB 华为云数据库

在 Rainbond 中一键安装高可用 Nacos 集群

北京好雨科技有限公司

开源 Kubernetes nacos PaaS rainbond

TDengine 助力智慧燃气,支撑数百万智能终端的接入管理

TDengine

为什么要做等保二级,有什么好处?

行云管家

网络安全 等保 等保2.0

助力数字经济 明源云助力不动产行业打造数字新引擎

科技热闻

提高企业产品交付效率系列(1)—— 企业应用一键安装和升级

北京好雨科技有限公司

Kubernetes PaaS rainbond

从0到100:基于微信小程序的羽毛球馆预约系统的开发笔记

CC同学

“既要性能,也要安全”,这样的Rust,谁不喜欢!

非凸科技

rust 编程语言 软件开发 招聘

想做好分布式架构?这个知识点一定要理解透!

博文视点Broadview

NetCore性能排查

神农写代码

FabEdge V0.5.0 新特性:支持跨集群服务访问

BoCloud博云

开源 边缘计算 cncf

中科柏诚:用数字技术纾困解难,助力中小企业恢复成长活力

联营汇聚

TDengine 在智慧矿山系统中的应用

TDengine

java培训-Redis 原理与知识总结分享 不愁面试

@零度

redis JAVA开发

安利一个小众但实用的导航网站(推荐收藏)

小炮

导航网站

还搞不明白,一次性给你总结好网络层概念

华为云开发者联盟

网络协议 IP 网络层 组网

给工厂做开发,竟然喝着咖啡听“交响”?

阿里云云效

云计算 阿里云 DevOps 研发 研发提效

行业分析| 音视频呼叫邀请适用于多领域

anyRTC开发者

音视频 WebRTC 语音通话 视频通话 呼叫邀请

四大功能!带你初识 Fabric | 容器网络系列第2期

BoCloud博云

云原生 容器网络方案

2022年中国音频行业产品洞察分析

易观分析

音频体验 在线音频

Spark的job、stage和task的机制论述

编程江湖

web前端培训-通过JS 可以读取电脑上所有数据

@零度

JavaScript 前端开发

教育行业可以用云管平台吗?有案例介绍吗?

行云管家

云计算 企业上云 云管平台 云管理

开发者眼中的Spring与Java EE_Java_张龙_InfoQ精选文章