为了账号安全,请及时绑定邮箱和手机立即绑定

我们为什么应该停止使用Spring框架了

标签:
Java 架构 Spring

这个标题通俗易懂,并且符合中文的口语表达习惯,直接点出了文章的核心观点,即讨论停止使用Spring框架的原因。

Spring 框架长期以来主导了 Java 生态系统,承诺通过依赖注入和强大的抽象提供了方便、快速上手和灵活性。但它是否真的兑现了这些承诺,而没有长远的代价?看看为什么 Spring,常被认为是开发者的捷径,最终可能弊大于利。

对便利的错觉

Spring 自称是一个让开发变得轻松快速的框架,特别是通过它的注解和代码生成。这些功能可能在初始设置阶段节省时间,但随着项目的发展,隐藏的成本也随之浮现。Spring 的快速胜利往往会带来反效果,随着调试和增强变得越来越困难,维护负担也随之显著增加。

如果你需要在Spring的常见用例之外做任何事情,你可能会遇到陡峭的学习曲线。这通常意味着你需要深入了解Spring的配置选项或神奇的方法,这会使调试和解决问题变得非常耗时。

注释:简化复杂性的魔力

Spring 最受批评的一点是它过度依赖注解。虽然注解可能让代码看起来更简洁,但它同时也会给开发者带来麻烦。例如,关键的 HTTP 细节,如标头、认证机制和查询参数,都被注解遮掩了,而不是直接处理这些细节。这种抽象限制了开发者对核心原理如 HTTP 或 SQL 的理解,而这些原理应该是任何可扩展应用的基础。

一个好主意被过度使用:依赖注入

Spring的依赖注入(DI)在合适使用时可以非常强大。然而,Spring的DI实现鼓励随意使用单例和注入元素,如果使用不当,会导致应用程序臃肿,依赖关系分散在整个代码库中。这种做法会导致设计不佳,组件缺乏明确的责任归属,依赖关系难以追踪和管理,形成一个难以测试和维护的类网络。

在传统的依赖注入实践中,注入依赖关系提高了灵活性和测试的便捷性。但Spring注解驱动的依赖注入常常导致全局单例对象和难以察觉的耦合,这最终对架构产生了不利影响。

自动生成的数据库查询:短期方案,长期隐患

Spring 对自动生成查询的依赖可能是一把双刃剑,这。虽然对于基本的 CRUD 操作来说可能很方便,但在复杂的应用程序中,它通常无法满足高性能和优化的 SQL 查询需求。优化查询以提高性能需要开发人员理解数据库的工作原理,而 Spring 的抽象可能会让开发者难以理解数据库的工作原理。

数据库查询应该仔细、高效并精心设计。相比之下,Spring 自动生成的查询可能会引入性能瓶颈,并掩盖数据实际是如何被检索的,导致意外的延迟和更高的费用。

这些抽象的概念不仅让人困惑,反而没有赋予力量

Spring的一个主要问题是它过度抽象,特别是在像HTTP和数据库交互这样的基本概念上。在健康的系统中,开发者应该清楚地看到请求是如何被处理的,数据又是如何在系统中流动的。然而,Spring的这种抽象方式鼓励开发者不去关注这些基本细节,转而依赖注解和自动生成的代码,让应用的关键部分成了一个黑盒。

这种方法在实际生产中尤其有问题,因为在实际生产中,了解应用程序如何与外部世界交互对调试和维护高效且安全的系统非常重要。维护和调试过程中,这种理解尤为关键。

性能开销和维护负担:

Spring的“魔法”可能使快速搭建应用程序变得更容易,但长期来看,它会带来显著的性能和维护成本。用Spring构建的应用程序往往会因为依赖注入、查询生成和抽象依赖等因素带来的额外开销而变得复杂。即使是简单的bug,也需要通过层层自动生成的代码和不透明的注解来追踪,使得调试过程变得非常复杂。

安全漏洞问题:总是让客户不得不升级框架。

我不会列出近年来在Spring框架中发现的所有CVE,但这里有一些2024年已知的CVE列表。

- CVE-2024–38820 (Spring Framework DataBinder 案例敏感匹配异常): 可能让攻击者绕过安全限制。
- CVE-2024–38819 & CVE-2024–38816 (功能性 Web 框架中的路径遍历漏洞): 可能让攻击者访问服务器上的未授权文件。
- CVE-2024–38807 (Spring Boot 加载器中的伪造签名漏洞): 可能让攻击者加载恶意代码。
- CVE-2024–38810 (使用 @AuthorizeReturnObjec 时缺少认证): 可能让未经授权访问敏感数据。
- CVE-2024–38809 (Spring Framework 通过条件 HTTP 请求可能导致的 DoS 攻击): 可能让攻击者发起拒绝服务攻击。
- CVE-2024–38808 (Spring 表达式 DoS 攻击漏洞): 另一个拒绝服务攻击漏洞。

我还记得2022年的CVE-2022–22965(Spring4Shell)。这是一个严重的远程代码执行漏洞,允许攻击者在受感染的系统上执行任意代码。许多客户因此不得不推迟他们的项目计划来修复这个漏洞。

每个软件都存在安全漏洞,但今年我不太满意的是,在特别是 CVE-2024–38819 这个漏洞中,Spring 要求客户购买它的企业许可证才允许批量更新。

这是关于Spring安全的漏洞公告: https://spring.io/security/cve-2024-38819

为为什么理解基础比学习Spring更有用?

与其掌握特定于Spring的模式,开发者最好专注于基础概念,比如HTTP、SQL以及良好的软件设计原则。通过这样做,他们可以构建不仅高效且性能更好的应用,还更容易在长期维护和调试过程中处理。依赖Spring的抽象会阻碍开发者的成长和理解,限制他们掌握可跨项目使用的技能。

总结:选择长期维护性而不是短期利益

虽然 Spring 提供了快速胜利的吸引力,但从长期来看,它对应用程序性能、可维护性和开发者知识的影响可能是有害的。Spring 的抽象和隐藏依赖可能感觉像是快捷方式,但它们却牺牲了代码的清晰度和控制权。开发者不应屈服于其最初的便利性,而应优先选择符合他们理解的框架或设计,从而能够在应用程序的每个方面保持完全的掌控。

春天虽然以便利著称,但这种便利常常只是表面现象,掩盖了潜在的复杂性,使得真正的成长受阻。与其依赖容易的Spring途径,不如从基础开始构建。你会获得一个更加坚实的基础,并创造出能够经受时间考验的应用程序。

谢谢你的阅读。瓦利德

我的每一篇文章都是亲手打造,体现了我的个人特色。通过阅读和分享它们,你不仅支持着我,也在推广真正的人类写作。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消