说说我为什么开始放弃 Spring Framework

如题所述

作为Java开发人员,Spring框架是我最常用的框架之一。Spring这个名字简洁而有寓意,它代表着程序员的春天,同时Spring还象征着弹性,提供强大的扩展性。然而,在使用Spring的过程中,我逐渐开始质疑它的一些核心特性。

首先,Spring带来了强大的魔法,如自动注入(IoC)和面向切面编程(AOP),这些特性使得代码管理更加高效,增强了代码的可增强性。然而,动态技术也带来了新的挑战。Java本来是一个静态类型语言,拥有严格的类型约束,但Spring的动态技术打破了这种约束。SpEL(Spring Expression Language)是一个动态表达式语言,虽然提供了简洁的逻辑构建方式,但缺乏类型检查,这使得在IDE中没有足够的提示功能。这样的设计使得编写代码时存在潜在的危险,如变量名错误但程序仍能运行的情况,虽然参数拼接总是null,但导致了使用相同缓存数据。使用API形式可以避免此类问题,但便利性会有所下降。

其次,Spring的复杂度问题也不容忽视。Spring框架在设计时遵循面向接口和面向对象的原则,导致了继承和依赖关系的复杂性。复杂的代码结构和动态字节码技术的运用使得阅读源码变得困难,方法跳转和理解实现逻辑需要花费大量时间。虽然这对于解决复杂问题至关重要,但在遇到错误排查或调试代码时,这一复杂性会成为障碍。

随着生态的不断发展,Spring已成为一个庞大的框架,学习曲线陡峭,需要较高的成本才能熟练掌握。这种复杂性导致了所谓的“Spring八股文”现象,即大量的面试题和攻略在互联网上流行。中等规模的Spring Boot项目通常需要消耗1G的内存,而部署一个Spring Boot实例所消耗的内存,足以部署五六个vert.x实例。某些项目甚至需要长达1分半的启动时间,这导致了资源占用和性能问题。

Spring的不可靠性也逐渐显现。动态技术带来了一系列坑,如事务失效的12种场景等。这些坑不仅增加了代码的复杂性,也使得问题难以察觉和解决。有些公司甚至禁止使用声明式事务,因为它们可能导致不明显的副作用,如缓存和校验失效。AOP技术的滥用也带来了不确定性,使得代码的执行路径难以追踪,增加了代码维护的难度。更糟糕的是,Spring Boot的自动配置可能存在安全风险,恶意代码可以通过自动配置在启动阶段执行。

经过深思熟虑,我发现Spring并不完美。动态字节码和代理技术虽然提供了灵活性,但也牺牲了静态语言的严谨性,使得编译期错误难以发现,只有运行时才能揭示问题。虽然IoC降低了耦合性,但我认为并非必须。在实际项目中,代码往往没有太多实现,不需要无缝替换或热插拔,而更高层次的抽象可能会导致失去部分原生特性的损失,甚至增加程序的复杂度。面向对象和面向接口的设计原则并不总是适用,有时过度设计反而会增加开发的复杂性。

基于以上考量,我决定不再局限于使用Spring框架。虽然Spring是一个有影响力的框架,但团队的一致性并非必须。探索其他解决方案对于我来说更具吸引力。在Java语言中,尽管存在不便之处,但动态字节码和代理技术并非解决所有问题的良药。了解其他语言并拓宽视野对于提升技术能力至关重要,这有助于打破固有思维模式,开阔开发者的思维格局。
温馨提示:内容为网友见解,仅供参考
无其他回答

说说我为什么开始放弃 Spring Framework
其次,Spring的复杂度问题也不容忽视。Spring框架在设计时遵循面向接口和面向对象的原则,导致了继承和依赖关系的复杂性。复杂的代码结构和动态字节码技术的运用使得阅读源码变得困难,方法跳转和理解实现逻辑需要花费大量时间。虽然这对于解决复杂问题至关重要,但在遇到错误排查或调试代码时,这一复杂性会成为...

学了Spring还有必要学其他的J2EE Framework吗?
你好,你说的哪两个web* 都是类似于tomcat的应用服务器,跟j2ee的框架没有半毛钱关系。而且学习这个东西,要根据需求来定,如果你工作了,就视工作的内容而定,这样最有成效。如果还是学生,那么多学点总是没有害处的。

Spring Framework 的理解
Spring的核心在 springframework beans 更高抽象层面是BeanFactory BeanFactory是一个非常轻量级的容器 关于可维护性的思考 Spring之类的技术确实带来了应用系统的可维护性的提高吗?Ioc AOP之类的技术 本质上都是将原本位于应用程序代码中 硬编码 逻辑 剥离出来放到了配置文件中(或者其他形式) 主流声音都是认为...

spring有什么缺点吗
a. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。c. 通...

Spring Cloud 2022 正式发布!我的天,OpenFeign​ 要退出历史舞台了...
创建 Eureka 2.x 新分支的目的是为了与 JakartaEE 兼容而已,让 Spring Cloud Netflix 可以兼容 Spring Framework 6.0 和 Spring Boot 3.0,仅此而已。4、Spring Cloud OpenFeign 功能完成公告 由于 Spring 现在提供了自己的 HTTP 接口客户端解决方案,比如在最新的 Spring Boot 3.0 中实现接口调用...

怎么看一个项目 是不是用了spring
1.最基本的方法查看项目wEB-INF\\lib文件夹下有没有spring.jar或spring-framework...jar的包 当然,不排除有非常非常非常无聊的开发者,放了spring的jar包,却没用spring 2.查看有没有配置文件内部写了 <beans> <bean id这种的类型,一般写么些的都是Spring配置文件 3.查看代码中有没有 ApplicationC...

如果你是程序员,请你用自身经历比较一下.NET和JAVA
我认为JAVA和.NET程序应该是相补相承的,即两者相结合,为什么呢,我就谈下我的工作经历吧 还记得2003年初,我到了DELL公司实习,所承担的工作任务就是建立一个Web Application供多个有密切联系的部门使用,以提高部门间的协作程度。在选择用什么技术来做这个Web Application的时候,我放弃了比较熟悉的ASP,进而选择了ASP....

怎么看springframework版本(如何看spring版本)
springboot2.3.4用的是几版本的spring1、版本是0的,因为这种spring的版本,它里面的后面的这个数字就是它代表了它的版本型号。2、springBoot3支持java17。SpringBoot3依赖于SpringFramework2,后者使用与Java17不兼容的CGLIB和ASM版本。但是Spring6和SpringBoot3版本才开始正式支持Java17。3、Spring官方...

spring是不是spring framework
Spring是独特的,因为若干个原因:◆它定位的领域是许多其他流行的framework没有的。Spring致力于提供一种方法管理你的业务对象。◆ Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。因此从你的学习中,你可得到最大的价值。例如,你...

真香!这篇文章终于让我弄懂了啥是Spring framework
Spring的体系结构由多个模块组成,包括Spring Framework Runtime、Data Access\/Integration、Web、Core Container、AOP、Aspects、Instrumentation、Messaging和Test模块。这些模块共同构成了Spring的强大功能,为开发者提供了完整的开发环境和工具。在Spring开发中,需要JDK、Tomcat、Eclipse或IntelliJ IDEA等工具。开发...

相似回答
大家正在搜