zz Spring 是一种反模式
Java 将会消亡 – Martin Vysny – 第一性原理思考
原文标题“Java 将会消亡”, 我并不认可 Java 会消亡一说, 作者还处于 FP 亢奋期,而我已经从 FP 回归 OO,这个话题有机会再展开。”Spring 是一种反模式” 是第二节的标题。
让我们引用一下原文:
Spring 是一种反模式
正如上面演示的那样,Spring 是为了弥补 Java 的缺点而发明的,并且自那以后,它不知何故发展成为启动 Java 项目时事实上的首选。引用为什么是 Spring?:
Spring 使 Java 编程对每个人来说都更快、更轻松、更安全。Spring 专注于速度、简单性和生产力,使其成为世界上最受欢迎的 Java 框架。
真是一派胡言。让我们揭穿这个营销垃圾的真面目。但首先,简单和轻松之间有一个非常重要的区别。Spring 允许您以一种简单的方式管理事务,没错,但这样做会带来 20 MB 的垃圾,并迫使您使用依赖注入等复杂模式。而这很难被视为“简单”。在向我讲述简单之前,请尝试调试一个 200 行长的堆栈跟踪,该跟踪指向 Spring 事务魔法深处的某个地方,在抽象和代理的意大利面条中。
轻松编写代码并不意味着最终的解决方案会简单。
**注意这个说法:简单并不等于容易。 simple is not easy.
因此,Spring 代码片段可能看起来很简单,但下面的冰山绝对不简单。
从任何意义上来说,它都不是“更安全”的:只要记住当它突然开始应用恶意拦截器时它是多么安全,因为在beans.xml作为传递依赖项拉入的 jar 中的某个地方有一个隐藏的东西。
速度:是的。在我使用 Spring 开发的应用程序中,你点击运行,等待 30-60 秒,它会初始化 bean,然后才会失败,因为 Spring XML 或@Component其他什么地方的某个深处存在运行时配置错误。
也许在输出代码方面有生产力,但绝对不是在运行速度和可维护性方面。
更快?在什么情况下?绝对不是在运行时:CPU 需要浪费大量周期来处理大量 Spring 抽象和动态生成的代理才能到达您的代码。也许比用普通的 Java 7 编写代码更快。
当然,我可以牺牲一些运行时速度,只要我能得到一些回报。例如,现在我有了 JDK 和 GC,我再也不会使用 C++ 了。但牺牲速度并获得反模式作为回报,这对我来说听起来不是什么好生意。
刚刚读了《为什么我讨厌Spring》(原文链接失效)。
那么,让我们重写上面的 Spring 引言,可以吗?
Spring 使 Java 编程变得更快、更简单。Spring 不知何故成为了世界上最流行的 Java 框架。
是的,没有人因为从 IBM 购买而被解雇,对吧?Spring 的营销非常出色,但也仅此而已。它是一种反模式,在一门不差劲的编程语言中是没有立足之地的。甚至它在 Java8+ 中的使用也值得怀疑。
依赖注入是一种反模式
好的,关于可维护性的话题。随着代码库的扩大,代码的维护变得比开发重要得多。在维护时,你绝对需要完全控制你的代码库。你必须能够清楚地知道给定函数的作用。有关更多详细信息,请参阅我的“代码局部性” 文章。
Spring 和任何依赖注入框架所做的恰恰相反。在@Inject
注入东西时,你完全无法控制要注入的内容。它是一个类,还是一个使用某些类定义库的黑魔法动态创建字节码并进行类加载的代理类?它还能序列化吗?不可变的?POJO?几乎不可能!当你调用注入的东西的方法时,会应用哪些拦截器?它们在哪里定义?当我的调试器不断输入名为的动态创建的方法时,我该如何调试这个垃圾$$$Proxy$Whatever?
如果我包含一个 jar,它会突然重新配置 Spring 并添加一些我最初不想要的拦截器,该怎么办?我现在如何推断代码的正确性?
你不能。使用依赖注入,不可能推断代码的正确性,因为你不可能知道还会执行什么。
但不仅依赖注入本身是一种反模式,松散耦合本身也是一种反模式。当然,如果能更清楚地向同事传达你的想法,那么可以添加一两个接口(另请参阅文学编程- 核心思想是你为你的同事而不是计算机编写代码)。但你添加的抽象和松散耦合越多,维护者就越难推理代码本身。
注意:松散耦合本身也是一种反模式,微服务无疑也是,我在解决这个问题,但这是毫无疑问的事实。
所有抽象都是可维护代码的敌人。当它们带来清晰度时使用它们,但要谨慎使用。
Spring 正在杀死 Java
Spring 太难学了:学习曲线的“简单”形象被第一个指向 Spring 深处的庞大堆栈跟踪打破了。Spring 也是一种反模式。它是邪恶的,最好的编程方式是不要使用 Spring。
然而,Spring 现在已经深深扎根于 Java 社区。许多人认为 Java 和 Spring 是不可分割的。然而,Spring 学习起来很困难,维护起来也很麻烦,它正在损害 Java 社区,阻止程序员寻找其他解决方案。它就像一个寄生虫,吸食 Java 宿主并在此过程中杀死宿主。如果 Java 不能摆脱这个寄生虫,它就会随之消亡。而且,Java 毕竟是 Java,我不能说它会被怀念。
Java 8 还行(因为它有闭包)。但 Java 无法与 Kotlin 竞争,未来会遇到困难;它被 Spring 玷污了,这让它的地位更加糟糕。
带有 Spring 的 Java 肯定会消亡。没有 Spring 的 Java 也可能会消亡,但这将需要更长的时间。
另外,不要学习 Spring——投入大量时间去学习一门过时的技术是没有意义的。
对于矮子看戏的大众来说,大家都用 Spring 我为什么不用,那是因为你只写过增删改查没写过真正的程序。
作为架构师话我们也喜欢开发一个框架提供简单的界面给下游程序员用,Spring 就是这种类型的东西。但是你要我们自己用,我就要想想值不值了。我主要会看这个框架是不是够薄,是不是可以直接穿透。
遗憾的是,很多公司的程序员入行以后就只能玩spring,没有机会真正的编程了,等他们干了十几年,就误以为这是最好的东西。
反思我自己也是,d2js 设计的比 spring boot 之流好很多,很薄,甚至也可以直通 java,但是同样也有这样的问题,一个 d2js 的高手算是程序员高手吗?答案是显然的。
zz Spring 是一种反模式的更多相关文章
- [转]为什么我说ORM是一种反模式
原文地址:http://www.nowamagic.net/librarys/veda/detail/2217 上周我在在上讨论了ORM,在那以后有人希望我澄清我的意思.事实上,我曾经写文章讨论过OR ...
- SQL反模式学习笔记2 乱穿马路
程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标: 存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...
- 《SQL 反模式》 学习笔记
第一章 引言 GoF 所著的的<设计模式>,在软件领域引入了"设计模式"(design pattern)的概念. 而后,Andrew Koenig 在 1995 年造了 ...
- ORM 是一种讨厌的反模式
本文由码农网 – 孙腾浩原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! (“Too Long; Didn’t Read.”太长不想看,可以看这段摘要 )ORM是一种讨厌的反模式,违背 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- Java的三种代理模式(Spring动态代理对象)
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- Python编程中的反模式
Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务 ...
- Apache Hadoop最佳实践和反模式
摘要:本文介绍了在Apache Hadoop上运行应用程序的最佳实践,实际上,我们引入了网格模式(Grid Pattern)的概念,它和设计模式类似,它代表运行在网格(Grid)上的应用程序的可复用解 ...
- 开发反模式 - SQL注入
一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FR ...
随机推荐
- 14 Positional Encoding (为什么 Self-Attention 需要位置编码)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- kotlin协程——>select 表达式(实验性的)
select 表达式(实验性的) select 表达式可以同时等待多个挂起函数,并 选择 第⼀个可⽤的. 在通道中 select 我们现在有两个字符串⽣产者:fizz 和 buzz .其中 fizz ...
- 9.24 csp(没学会的网络流)
T1.商品 因为边界 l , r 是线性移动的,所以答案可以线性改变,直接用set维护连续段(小于l的和大于r的)的个数,并维护ans即可. 因为set的一个小错误调了两个小时,代码打成了一坨,结果最 ...
- 使用 KubeKey v3.1.1 离线部署原生 Kubernetes v1.28.8 实战
今天,我将为大家实战演示,如何基于操作系统 openEuler 22.03 LTS SP3,利用 KubeKey 制作 Kubernetes 离线安装包,并实战离线部署 Kubernetes v1.2 ...
- 云原生周刊:2024 年 K8s 基准报告 | 2024.4.8
开源项目推荐 Argo CD Image Updater Argo CD Image Updater 是一个自动更新 Argo CD 管理的 Kubernetes 工作负载容器镜像的工具.简而言之,它 ...
- 云原生爱好者周刊:玩 Kubernetes 游戏,赢取免费机票
云原生一周动态要闻: Grafana 8.2.2 发布 OSM(Open Service Mesh)发布 v1.0 的第一个候选版本 谷歌宣布推出 Google Distributed Cloud K ...
- Saas多租户数据权限设计(参考RuoYi)
导航 引子 场景梳理 基于角色的访问控制(RBAC) 多租户系统的权限设计 RuoYi系统的数据权限设计 最终设计方案 参考 本文首发<智客工坊-Saas多租户数据权限设计(参考RuoYi)&g ...
- 玩黑悟空要配什么显卡?ToDesk云电脑一招搞定!
近期国产游戏大作<黑神话·悟空>的预售开启,许多玩家对于如何配置自己的电脑以畅玩这款画质卓越.支持全景光追的3A大作产生了浓厚的兴趣. 尤其是显卡的选择,成为了玩家们关注的焦点.<黑 ...
- v-bind属性,v-model属性
一.v-bind v-bind动态绑定指令 默认情况下标签自带属性的值是固定的,可以使用v-bind:'需要绑定的值'='表达式' 所谓动态绑定动态的含义是我们不必修改页面template模板的代码, ...
- 创建一个专属的 CLI
作为一个前端,基本上每次初始化项目都会用到脚手架,通过一些脚手架可以快速的搭建一个前端的项目并集成一些所需的功能模块,避免自己每次都手动一个一个去安装.安装各个包的这个过程其实没啥营养,通过封装一个脚 ...