文档章节

重新思考spring,反思为什么让人讨厌

墨子Zhai
 墨子Zhai
发布于 2017/01/23 15:21
字数 1207
阅读 2370
收藏 3

为什么我讨厌spring

1、spring类项目中,总有一类的扫瞄组件什么的(比如:component-scan)标签的功能,如果由容器去做就很方便了。但是现在我们都是在 每个war中都配置,就显得对开发者不太友好了。
2、spring 项目的配置比较复杂。现在流行“约定优于配置”。
3、spring web项目中,spring的运行时架构:
    底层是tomcat一类的容器,在我们的项目war包中,又有一层是bean容器,在这之上是我们的业务代码,这种架构就有些别扭了!
    作为一个开发者我当然希望它更加的简单,应该在servlet容器层,提供bean容器,而不是在我们的代码中!
    那为什么spring 这么多年来一直不改变呢,我的认为是spring的定位问题,它不但要在容器环境中运行,还要在非容器环境都要运行,为了这种统一,就只能牺牲掉一些轻便性。作为一名web开发者,不可忍。
4、spring有很多运行环境,比如tocat, jetty, undertow等,最常用的当然是tomcat。但tomcat近十年以来,都没什么创新进步!一方面是自己固化的定位; 一方面是tomcat的开发者人数太少。看看(https://github.com/apache/tomcat/graphs/contributors)在2017-1-23时,tomcat的代码贡献者也就11个人,核心的贡献者只有一个人。
5、现在的spring项目中, 配置和注释都用,配置也太多,增加了开发的复杂度。
6、现在再重新审视,spring 把代码(bean)写入xml配置中去,是不是用的太泛滥了?代码最直接有效的就是代码!!代码写进xml配置,就能减轻软件的复杂度!哈哈,自欺欺人吧。
7、还有spring 生态圈,老是喜欢些锦上添花的事,集成这个集成那个,太复杂,一点都不轻量级。还有spring 生态圈,老是喜欢些锦上添花的事,集成这个集成那个,太复杂,一点都不轻量级。
可能是想革别人的命容易,革自己的命。spring的 gradle(它们是一个公司)想革maven的命, 但spring 这十多年有多少创新呢? 革自己的命难啊。 不要说spring5 !

8、Spring MVC,做为一个web层框架,在业务逻辑层只能spring。 spring MVC和spring 紧密耦合,没得选择,不爽。
9、上述若干原因,客观上造成了spring很多项目都是“巨石应用”的问题。一个war包20MB是起步,200MB大家也见怪不怪习惯了。 java升不了级,jar包版本升级不敢动,都是spring 巨石应用害的。

      一个大的项目,或一个项目群,最好在纵向按业务功能分成多个模块,横向酌情按Controller, Business logical,Dao等来分层打包。比如一个纵向的业务Controller及之上的打一个war, Business logical及之下的打在一个jar里,以便于在不同模块中做共享,减少冗余代码。 但spring式项目,大家好像都不习惯这么做,还是一个巨石应用搞定!


那为什么用spring做开发还是要多一些呢? 
1、spring确实不算太差(无论是以前或现在),
2、当年ejb2确实难用(以至于很多开发人员对EJB的印象还停留在ejb2)。
3、最重要的一方面是当年spring的市场起来了,开发者建立了固化习惯,即便是spring的发展并无多少创新和进步。 
4、java web行业的成熟,进步的动力不是很足。
5、大家用spring 做开发太多,以至于认为spring 就是j2ee。大家应该有准确的认识,spring是spring, javaEE是javaEE;  spring和javaEE即相关,又有相互区别和竞争。总得来说spring 基于javaEE标准,而又不遵照javaEE标准,而自己建立了一个自己的生态体系。


关于spring boot.

Spring boot是可以嵌入tomcat, jetty, undertow的。
嵌入式Tomcat早就存在,测试表明undertow比tomcat性能更好。
比起wildfly Swarm, akka, vert.x, sparkjava, AOL Microserver, Dropwizard ,KumuluzEE, 我确认spring boot算不上什么创新,只能算是有一些技术跟进罢了。

如果对待spring呢?
你现在可以继续一直用spring啊,但不要盲从,比如使用ejb3.2、jax-rs开发也很好啊。带着审视的态度,跳出自己的小范畴,多一点研究,多一点思考。特别是新的项目,重新考虑,做出更好的选择。
现在微服务,微框架,非基于servlet的javaWeb的出现和发展,大家可以有更多的选择了。

 

© 著作权归作者所有

墨子Zhai
粉丝 9
博文 32
码字总数 19665
作品 0
深圳
架构师
私信 提问
加载中

评论(17)

平安OSC
平安OSC

引用来自“DevidGe”的评论

看了博主的文章,我在反思:
博主用一种东西是否真正去了解他的生态圈呢?
SpringBoot难道不是约定大于配置吗?
Tomcat跟Spring有毛关系?
Spring Cloud 不正是解决现在流行的微服务架构问题吗?

博主吐槽SpringBoot,而SpringBoot只是一个基层,需要开发人员将架构一层层搭建起来,而不仅仅是SpringBoot。

Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!

xml配置是Spring2和3时代的东西了,使用者也要学会进度。(公司框架升不了级是公司的问题)。

生态很重要!生态很重要!生态很重要!

引用来自“墨子Zhai”的评论

生态也是用来打破的。 google native cloud , istio 就是spring cloud的终结者。
终结不了,走着瞧
墨子Zhai
墨子Zhai 博主

引用来自“DevidGe”的评论

看了博主的文章,我在反思:
博主用一种东西是否真正去了解他的生态圈呢?
SpringBoot难道不是约定大于配置吗?
Tomcat跟Spring有毛关系?
Spring Cloud 不正是解决现在流行的微服务架构问题吗?

博主吐槽SpringBoot,而SpringBoot只是一个基层,需要开发人员将架构一层层搭建起来,而不仅仅是SpringBoot。

Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!

xml配置是Spring2和3时代的东西了,使用者也要学会进度。(公司框架升不了级是公司的问题)。

生态很重要!生态很重要!生态很重要!
生态也是用来打破的。 google native cloud , istio 就是spring cloud的终结者。
白丝魔理沙
白丝魔理沙

引用来自“白丝魔理沙”的评论

博主是踩了太多人尾巴了,一大堆人工作中用着Spring,你跟他们说这个框架固步自封,老旧不堪,且问题多多,他们当然不高兴啦。
对我来说,用spring配置来管理接口依赖,失去了编译时检查这种对静态语言最重要的事情就是不可容忍的。
Guice是个很好的DI实现。

引用来自“墨子Zhai”的评论

谢谢理解,你的想法和我的第六条比较相似。事实上我是从spring2.0开始做开发的。

另外,spring现在支持注释方式管理接口依赖,但事实上很多人还是用配置方式。强烈抨击这种数十年来一成不变的现象。
我刚工作的时候也是spring2.0加hibernate3.0加struts1.1
注释方式管理依赖,依然是在运行时才能发现问题。
墨子Zhai
墨子Zhai 博主

引用来自“白丝魔理沙”的评论

博主是踩了太多人尾巴了,一大堆人工作中用着Spring,你跟他们说这个框架固步自封,老旧不堪,且问题多多,他们当然不高兴啦。
对我来说,用spring配置来管理接口依赖,失去了编译时检查这种对静态语言最重要的事情就是不可容忍的。
Guice是个很好的DI实现。
谢谢理解,你的想法和我的第六条比较相似。事实上我是从spring2.0开始做开发的。

另外,spring现在支持注释方式管理接口依赖,但事实上很多人还是用配置方式。强烈抨击这种数十年来一成不变的现象。
墨子Zhai
墨子Zhai 博主

引用来自“无著方知尘亦珍”的评论

虽然有一些是事实存在的问题,但你没搞清楚spring的定位。IOC和AOP是spring的基石,你先了解下这2种技术是为了解决什么吧。

非servlet的web的确是比较轻量级,但是servlet的优势是“标准”。在一些不是那么重要的项目中,说实话只要你能用,随便你用什么,但很多项目不是只有你一个人玩。

spring提供了xml和java config两种方式进行配置,复不复杂就看你自己了,任何东西都有一个使用的层级,一般来说,越细的东西越轻量级,越广泛的东西则更加重视灵活,Grails这个框架足够的“约定优于配置”吧?你看能适合多少企业?适合哪些业务?

“spring有很多运行环境” spring除了自身的ioc容器和jvm,从来就不存在什么其它的运行环境,这个就得牵扯出你说的另一个问题了“集成这个集成那个”,这些所谓的环境只是集成而已。
至于集成,你用哪个库不是集成?人家只是帮你集成好而已,又不是跟Grails一样整个打包给你的,让你不可选。

“spring MVC和spring 紧密耦合” spring本身就是DI,耦合这个事是掌握在开发者手里的,如果一个框架是基于另一个框架开发的就算“紧密耦合”,感觉好像是这样的,那你找个不耦合的?不依赖其它库就不是紧密耦合?

“spring的 gradle(它们是一个公司)想革maven的命”,不说什么革命的事,在java应用开发中可以说90%(猜的)以上maven足够了,但剩下的10%呢?你了解过基于配置和基于脚本的各自优缺点么?在混合语言开发中(不光是基于jvm的语言),在复杂的依赖体系里(比如spring)这种依赖并不是什么依赖多的问题,而是需要动态依赖,对于开发框架来说,需要的是足够的健壮,足够的灵活和兼容,这种开发环境不是maven能解决的。你看看spring boot也没有死板的非得用gradle。

“一个大的项目,或一个项目群,最好在纵向按业务功能分成多个模块”这种打包,架构的事,是你应用自身的事,关spring什么事?
IOC和AOP,也是ejb的重要组成部分,你要知道。这不是spring特有的。还有你如查只会且一直只用spring。我觉得我一时半会也给你说不清的。
白丝魔理沙
白丝魔理沙
博主是踩了太多人尾巴了,一大堆人工作中用着Spring,你跟他们说这个框架固步自封,老旧不堪,且问题多多,他们当然不高兴啦。
对我来说,用spring配置来管理接口依赖,失去了编译时检查这种对静态语言最重要的事情就是不可容忍的。
Guice是个很好的DI实现。
墨子Zhai
墨子Zhai 博主

引用来自“无著方知尘亦珍”的评论

引用来自“墨子Zhai”的评论

引用来自“无著方知尘亦珍”的评论

虽然有一些是事实存在的问题,但你没搞清楚spring的定位。IOC和AOP是spring的基石,你先了解下这2种技术是为了解决什么吧。

非servlet的web的确是比较轻量级,但是servlet的优势是“标准”。在一些不是那么重要的项目中,说实话只要你能用,随便你用什么,但很多项目不是只有你一个人玩。

spring提供了xml和java config两种方式进行配置,复不复杂就看你自己了,任何东西都有一个使用的层级,一般来说,越细的东西越轻量级,越广泛的东西则更加重视灵活,Grails这个框架足够的“约定优于配置”吧?你看能适合多少企业?适合哪些业务?

“spring有很多运行环境” spring除了自身的ioc容器和jvm,从来就不存在什么其它的运行环境,这个就得牵扯出你说的另一个问题了“集成这个集成那个”,这些所谓的环境只是集成而已。
至于集成,你用哪个库不是集成?人家只是帮你集成好而已,又不是跟Grails一样整个打包给你的,让你不可选。

“spring MVC和spring 紧密耦合” spring本身就是DI,耦合这个事是掌握在开发者手里的,如果一个框架是基于另一个框架开发的就算“紧密耦合”,感觉好像是这样的,那你找个不耦合的?不依赖其它库就不是紧密耦合?

“spring的 gradle(它们是一个公司)想革maven的命”,不说什么革命的事,在java应用开发中可以说90%(猜的)以上maven足够了,但剩下的10%呢?你了解过基于配置和基于脚本的各自优缺点么?在混合语言开发中(不光是基于jvm的语言),在复杂的依赖体系里(比如spring)这种依赖并不是什么依赖多的问题,而是需要动态依赖,对于开发框架来说,需要的是足够的健壮,足够的灵活和兼容,这种开发环境不是maven能解决的。你看看spring boot也没有死板的非得用gradle。

“一个大的项目,或一个项目群,最好在纵向按业务功能分成多个模块”这种打包,架构的事,是你应用自身的事,关spring什么事?
我觉得说spring就不要谈javaEE的标准了吧。它自己基本javaEE标准,但又不完全遵照标准。所以不要说spring标准事。 Pivotal应该即不是jcp成员,也不是javaEE组织的成员吧(我没有核对此事,但应该是这样的)。

"集成这个集成那个,集成的东西太多",参看: http://spring.io/projects ,摊子铺的太大,反而核心基本的东西臃肿,而非常复杂(当然大家都适应了,但没有对比就没有伤害,哈哈。)。

是你应用自身的事,关spring什么事?不是吗? spring的容器机制,不便于模块化,更不要提动态模块化。

你参与过中大型项目么。你所谓的某些别的框架做的更好的地方,那都是点,而不是面。做项目要考虑整体因素,单凭一两个框架根本搞不定,而且还得考虑技术以外的因素,spring成为事实上的标准可不是光靠吹得来的,你说的那些东西可不只有你清楚,又不是没人玩过那种超简便的框架,但你看看一旦公司技术选型,有几个用上的。
我的结论和目标:
你现在可以继续一直用spring啊,但不要盲从,比如使用ejb3.2、jax-rs开发也很好啊。带着审视的态度,跳出自己的小范畴,多一点研究,多一点思考。特别是新的项目,重新考虑,做出更好的选择。
墨子Zhai
墨子Zhai 博主

引用来自“无著方知尘亦珍”的评论

引用来自“墨子Zhai”的评论

引用来自“无著方知尘亦珍”的评论

虽然有一些是事实存在的问题,但你没搞清楚spring的定位。IOC和AOP是spring的基石,你先了解下这2种技术是为了解决什么吧。

非servlet的web的确是比较轻量级,但是servlet的优势是“标准”。在一些不是那么重要的项目中,说实话只要你能用,随便你用什么,但很多项目不是只有你一个人玩。

spring提供了xml和java config两种方式进行配置,复不复杂就看你自己了,任何东西都有一个使用的层级,一般来说,越细的东西越轻量级,越广泛的东西则更加重视灵活,Grails这个框架足够的“约定优于配置”吧?你看能适合多少企业?适合哪些业务?

“spring有很多运行环境” spring除了自身的ioc容器和jvm,从来就不存在什么其它的运行环境,这个就得牵扯出你说的另一个问题了“集成这个集成那个”,这些所谓的环境只是集成而已。
至于集成,你用哪个库不是集成?人家只是帮你集成好而已,又不是跟Grails一样整个打包给你的,让你不可选。

“spring MVC和spring 紧密耦合” spring本身就是DI,耦合这个事是掌握在开发者手里的,如果一个框架是基于另一个框架开发的就算“紧密耦合”,感觉好像是这样的,那你找个不耦合的?不依赖其它库就不是紧密耦合?

“spring的 gradle(它们是一个公司)想革maven的命”,不说什么革命的事,在java应用开发中可以说90%(猜的)以上maven足够了,但剩下的10%呢?你了解过基于配置和基于脚本的各自优缺点么?在混合语言开发中(不光是基于jvm的语言),在复杂的依赖体系里(比如spring)这种依赖并不是什么依赖多的问题,而是需要动态依赖,对于开发框架来说,需要的是足够的健壮,足够的灵活和兼容,这种开发环境不是maven能解决的。你看看spring boot也没有死板的非得用gradle。

“一个大的项目,或一个项目群,最好在纵向按业务功能分成多个模块”这种打包,架构的事,是你应用自身的事,关spring什么事?
我觉得说spring就不要谈javaEE的标准了吧。它自己基本javaEE标准,但又不完全遵照标准。所以不要说spring标准事。 Pivotal应该即不是jcp成员,也不是javaEE组织的成员吧(我没有核对此事,但应该是这样的)。

"集成这个集成那个,集成的东西太多",参看: http://spring.io/projects ,摊子铺的太大,反而核心基本的东西臃肿,而非常复杂(当然大家都适应了,但没有对比就没有伤害,哈哈。)。

是你应用自身的事,关spring什么事?不是吗? spring的容器机制,不便于模块化,更不要提动态模块化。

你参与过中大型项目么。你所谓的某些别的框架做的更好的地方,那都是点,而不是面。做项目要考虑整体因素,单凭一两个框架根本搞不定,而且还得考虑技术以外的因素,spring成为事实上的标准可不是光靠吹得来的,你说的那些东西可不只有你清楚,又不是没人玩过那种超简便的框架,但你看看一旦公司技术选型,有几个用上的。
我不想理你! 但还要说一句: 因为你没有看完,更不知我的结论和目标。
无著方知尘亦珍
无著方知尘亦珍

引用来自“墨子Zhai”的评论

引用来自“无著方知尘亦珍”的评论

虽然有一些是事实存在的问题,但你没搞清楚spring的定位。IOC和AOP是spring的基石,你先了解下这2种技术是为了解决什么吧。

非servlet的web的确是比较轻量级,但是servlet的优势是“标准”。在一些不是那么重要的项目中,说实话只要你能用,随便你用什么,但很多项目不是只有你一个人玩。

spring提供了xml和java config两种方式进行配置,复不复杂就看你自己了,任何东西都有一个使用的层级,一般来说,越细的东西越轻量级,越广泛的东西则更加重视灵活,Grails这个框架足够的“约定优于配置”吧?你看能适合多少企业?适合哪些业务?

“spring有很多运行环境” spring除了自身的ioc容器和jvm,从来就不存在什么其它的运行环境,这个就得牵扯出你说的另一个问题了“集成这个集成那个”,这些所谓的环境只是集成而已。
至于集成,你用哪个库不是集成?人家只是帮你集成好而已,又不是跟Grails一样整个打包给你的,让你不可选。

“spring MVC和spring 紧密耦合” spring本身就是DI,耦合这个事是掌握在开发者手里的,如果一个框架是基于另一个框架开发的就算“紧密耦合”,感觉好像是这样的,那你找个不耦合的?不依赖其它库就不是紧密耦合?

“spring的 gradle(它们是一个公司)想革maven的命”,不说什么革命的事,在java应用开发中可以说90%(猜的)以上maven足够了,但剩下的10%呢?你了解过基于配置和基于脚本的各自优缺点么?在混合语言开发中(不光是基于jvm的语言),在复杂的依赖体系里(比如spring)这种依赖并不是什么依赖多的问题,而是需要动态依赖,对于开发框架来说,需要的是足够的健壮,足够的灵活和兼容,这种开发环境不是maven能解决的。你看看spring boot也没有死板的非得用gradle。

“一个大的项目,或一个项目群,最好在纵向按业务功能分成多个模块”这种打包,架构的事,是你应用自身的事,关spring什么事?
我觉得说spring就不要谈javaEE的标准了吧。它自己基本javaEE标准,但又不完全遵照标准。所以不要说spring标准事。 Pivotal应该即不是jcp成员,也不是javaEE组织的成员吧(我没有核对此事,但应该是这样的)。

"集成这个集成那个,集成的东西太多",参看: http://spring.io/projects ,摊子铺的太大,反而核心基本的东西臃肿,而非常复杂(当然大家都适应了,但没有对比就没有伤害,哈哈。)。

是你应用自身的事,关spring什么事?不是吗? spring的容器机制,不便于模块化,更不要提动态模块化。

你参与过中大型项目么。你所谓的某些别的框架做的更好的地方,那都是点,而不是面。做项目要考虑整体因素,单凭一两个框架根本搞不定,而且还得考虑技术以外的因素,spring成为事实上的标准可不是光靠吹得来的,你说的那些东西可不只有你清楚,又不是没人玩过那种超简便的框架,但你看看一旦公司技术选型,有几个用上的。
墨子Zhai
墨子Zhai 博主

引用来自“DevidGe”的评论

看了博主的文章,我在反思:
博主用一种东西是否真正去了解他的生态圈呢?
SpringBoot难道不是约定大于配置吗?
Tomcat跟Spring有毛关系?
Spring Cloud 不正是解决现在流行的微服务架构问题吗?

博主吐槽SpringBoot,而SpringBoot只是一个基层,需要开发人员将架构一层层搭建起来,而不仅仅是SpringBoot。

Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!Spring 不仅仅只有SpringMVC!

xml配置是Spring2和3时代的东西了,使用者也要学会进度。(公司框架升不了级是公司的问题)。

生态很重要!生态很重要!生态很重要!
首先,我没有反对大家用,另外我清楚spring的强大生态,并独立于javaEE, 基于标准,却不遵循标准,而自成体系。

Tomcat跟Spring没有关系? 真没有。这不符合实际情况!
Intellij使用心得(三) -- 关于错误提示

有童鞋跟我说,他有强迫症,换到Intellij,各种 ,红的黄的一堆,让人头大啊有没有!首先说一句,Intellij的错误检查更丰富更严格,有的时候确实是代码不规范引起的问题,这个时候检查一下代...

黄亿华
2013/06/07
0
3
我为何停止使用 Spring

作者:张龙 来源:infoq Johannes Brodwall是一位程序员、解决方案架构师、用户组与会议组织者、会议演讲者与布道师。Johannes一直在不遗余力地将敏捷原则应用到大型软件项目中,不过他真正感...

殊麒
2013/12/27
19.2K
69
Spring Boot系列——5分钟构建一个应用

5分钟构建一个应用?没错!一点没有夸张,甚至不用5分钟就可以快速搭建并启动一个应用。 环境配置 1、JDK版本:Java8 2、IDE版本:Intellij IDEA 2018.1 3、系统:MAC OS 构建步骤 1、创建项...

Jackie_Zheng
2018/08/19
0
0
越写悦快乐之《爆款写作课》读后感之情人节特辑

今天的越写悦快乐系列文章为大家带来写作修炼的一本书《爆款写作课》,也就是我们007的战友弗兰克的作品,希望对你的写作水平的打磨和精进有所启发。 作者介绍 弗兰克,两个孩子的父亲,曾为...

韬声依旧在路上
02/14
0
0
spring security 3 动态获取权限

主要讲如何动态获取,因为之前是spring容器启动时获取数据库中的权限。 在配置过程中,出现了不生效的问题。 之前的代码:这种方式不生效 ApplicationContext ctx = new ClassPathXmlApplica...

hello_bear
2015/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
19
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部