http://www.iteye.com/topic/1126929
1. flounders --  发表时间:2012-09-25   

如题,希望大侠们指出,不能用Spring就觉得他什么都好,本帖子意在实际工作中,对是否将Spring引入项目及如何更好的使用Spring提出启发式意见。目前已有高人表达了自己对Spring的不满,让我开始反思,希望大家借此对Spring的不足提出自己的观点(同时也是某牛逼公司的面试题)。 
    我提出几点: 
    1,Spring的使用引入了新的复杂度,这点毋庸置疑(虽然可降低已有复杂度,但是小型项目引入Spring简直是噩梦)。 
    2,破坏了一些本来不该破坏的结构,比如一个类的完整抽象,现在需要通过看配置文件或Annotation才能完全理解, 
    3,单个功能的测试必须启动Spring容器。 
    4,感觉引入了Spring的项目,很难从Spring中脱离出来,我认为Spring对项目的耦合太过紧密,就像一个强有力的皮搋子吸住马桶口不放开。 

个人意见,希望大家指点。 
------------------------------------------------
liubey 写道
太偏激了LZ 你做过多少项目。。。

最近面试一个公司,算是国内数一数二的吧,问的全是某某架构的缺点,其中就有Spring,这个题挂了,郁闷,觉得自己修炼还不够啊,对问题看的不全面,希望你能指点我一下。 
-------------------------
   发表时间:2012-09-26   最后修改:2012-09-26 
有缺点不意味不用,面试官之是想看你能看到多少别人看不见的。如果你看不到一个东西的缺陷,如何能放心让你去用?





*****************************************************************
2. 不是引入了Spring项目,而是架构项目的时候选择了Spring。 
Spring是代表一种架构的体系,IOC架构,不像是Struts2或者JSF这样, 
想怎么换就怎么换。 

单个功能的测试不必启动Spring容器啊,你可以写个公共类来实例化你的类啊,用new 也可以啊,但是有Spring还有必要这样做吗? 

使用Annotation是为了简化Spring配置过程。 
您是没经历过Spring2.0阶段吧? 
知道Spring配置文件有4个XML,每个2000行的情况吗? 

*****************************************************************
3. guwei999 --发表时间:2012-09-25   
如果脱离了spring,事务用代码处理,无疑增加了很多的代码量,还有spring的MVC用起来也比struts2方便很多,至于测试,启动容器的目的是为了加载datasource吧,因为其他的你都能new出来, Annotation无论在配置spring还是hibernate的时候,都简化了很多的配置,当然你也可以继续用xml。至于什么叫纯净的代码,就没什么说的了,我不认代码里面夹杂着各种xml就纯净了。

好了,说下缺点,也是纯属个人想法,一切优雅的框架,都会造成执行效率的损失。而且增加了一些不确定性,只能认为它应该会执行出正确的结果,复杂多变的应用场景,没人能保证框架一定不会出一些隐含的低级bug,无法完全控制代码的健壮性,毕竟是人写出来的东西。说到这可能有人会反驳了,他一次bug都没碰上,这个时候应该监控一下虚拟机的运行情况,比如web项目在高并发的情况下,是不是频繁的进行GC,为什么会这样,想解决但是无从下手。我再做原来12530的会员接口时候,就碰上这个问题了,后来发现同样的查询压力测试,只用axis+jdbc的情况下,比使用spring+hibernate的平均响应时间低不少,至于怎么判断是否在做GC,就不在这里讨论了,有兴趣可以私聊

还有,让程序员的技术含量越来越低了,spring粘和的不是你的代码,而是思想。见过有的人离开了spirng,连个connection都那不到,更有甚者一年多的工作经验,不知道connection是什么东西,从培训到工作接触的都是框架,老师几句话带过的基础都就饭吃了。几百行有效代码的一个小j2se守护进程都往spring上套。

至于网上说的什么不支持分布式应用,缺少IDE支持之类的,都是应该叫局限性。

感觉公司面试问框架的缺点,就是想了解你使用的情景,以及遇到不尽人意的地方,不是鸡蛋里挑骨头,就好像到底是应该用c3p0还是proxool,为什么用一个道理吧。毕竟一个框架发展了这么长时间,单纯的缺陷能完善的都完善了。 


*****************************************************************
4. jetdan --  发表时间:2012-09-25   
    1,Spring的使用引入了新的复杂度,这点毋庸置疑(虽然可降低已有复杂度,但是小型项目引入Spring简直是噩梦)。 
 
小型项目必需要使用spring吗? 其实也不能论大小来说,当你想要方便地使用某些特性的时候,比如说ioc,切面,声明式事务等等,那就应该用spring,你都需要那么多spring能轻易集成并且串联的功能,为什么还要不使用spring呢?
 
当然如果项目用不上这些特性,也没说一定要用spring。

    2,破坏了一些本来不该破坏的结构,比如一个类的完整抽象,现在需要通过看配置文件或Annotation才能完全理解, 
 
这是ioc容器共有的特征,当然,一个好的ide,比如IntelliJ IDEA 在:重构、导航方面,你几乎不会感觉到因为使用ioc而带来的不便。

    3,单个功能的测试必须启动Spring容器。 
 
启动慢了点,不过在编码上用Spring JUnit Runner注解也不会多敲多少代码。
 
    4,感觉引入了Spring的项目,很难从Spring中脱离出来,我认为Spring对项目的耦合太过紧密,就像一个强有力的皮搋子吸住马桶口不放开。
Spring的存在能很大程度上降低项目本身的耦合,但是Spring不同于应用于特定域的框架。 它涵盖了各个方面:mvc, 事务抽象,切面编程,任务抽象,安全框架……  但是它尽可能程度上做到了每个模块的松散耦合,mvc可以用struts,或者它的Spring mvc,orm框架可以用好多牌子的……  我想也没有其它的框架做到它那样松散耦合。
至于要替换Spring 本身,会有这样的场景吗? 
 
附:又一个: tools + ioc + mvc + db + aop + tx + html
http://jodd.org/

*****************************************************************
5. whking2003 --发表时间:2012-09-26   最后修改:2012-09-26 
    1,Spring的使用引入了新的复杂度,这点毋庸置疑(虽然可降低已有复杂度,但是小型项目引入Spring简直是噩梦)。 
    java可以说不适合小项目,也没必要用java做小项目。大项目,时间长,参与的人次多,必然会带来复杂度,所以,这点复杂度引入,再相比Spring当初面对的EJB那一套,已经是很不错了。没有复杂度的项目,你做它干吗?
    2,破坏了一些本来不该破坏的结构,比如一个类的完整抽象,现在需要通过看配置文件或Annotation才能完全理解, 
    这个保留意见,说实话,IOC有好处,但是要求全面IOC,任何模块都要IOC,我觉得确实没必要。比如各种系统,都有一些后台admin模块,就是一些CRUD,也没什么重构要求,数据表大家都烂熟于胸的,其实可以随意一些。
    3,单个功能的测试必须启动Spring容器。 
    这个嘛,没办法,EJB也要启动容器,Webserver也许也要启动,单元测试都不愿意写,功能模块之间有依赖,但是谁都不愿意提供和维护测试数据脚本,那就只能大家都天天在搞SIT。
    4,感觉引入了Spring的项目,很难从Spring中脱离出来,我认为Spring对项目的耦合太过紧密,就像一个强有力的皮搋子吸住马桶口不放开。 
    这点严重同意,神马“非侵入框架”,都是骗人的,不说别的,你就光把你项目中的配置文件全换一遍试试?配置文件这玩意儿,多了也算是侵入,我曾经所在的某个项目,各种配置文件加起来的维护难度,已经大大超过代码了。代码起码还有eclipse里面F3跳来跳去,再不行还能debug。

我觉得,引入Spring框架,复杂度是有的,但是Spring本身的设计,宣传,都很到位。Spring本身已经很复杂,但是对于它的Client程序员来说,思路还是很清晰的,不会让人找不到北。 
java做的应该都是有一定规模的项目,所以,引入Spring,我觉得复杂度上,没什么不好的。 
但是,Spring真正的价值,是在于:它让绝大多数java coder有了统一的思维模式,大大降低了入行门槛!这点意义非凡,这是java程序员队伍规模这么大,通用性很强,雇主可以随意招人的主要原因。也是广大java coder可以到处跳槽换工作的原因。反正大家不管什么工作经历,SSH总该会用吧?那么,在这个前提下,项目至少能跑起来。剩下的再说。 

__双刃剑啊__~~ 


--------------------------------
whking2003 写道
它让绝大多数java coder有了统一的思维模式,大大降低了入行门槛!
关键是很多JavaCoder只是会用Spring,缺不理解其为何要那么做。你让他自己写代码,我保证他肯定还是各种new,如果不是Spring,他绝对不会让自己去搞神马IoC、AOP。。。所以是否统一了,还真的难说。。。 


私以为Spring带来的是一种架构和设计理念,IoC降低了耦合度,从而使得代码的可扩展性和可维护性大大增加。AOP使得代码重用大大提高。我喜欢Spring带来的IoC和AOP,不局限于Spring。 

------------------------------
LZ有个事你没考虑,如果不用Spring 这些东西你怎么实现,自己公司写一套实现吧,别的公司也写一套实现吧,新来的员工你怎么培训?这就跟设计模式一样,程序员间的共同语言了 

---------------------------
spring 代表企业应用开发一类问题的最佳实践

*****************************************************************
6. flounders --发表时间:2012-09-29   

顶,现在来分析,spring会使程序员懒惰,培养了coder对已有解决方案的依赖,尤其是spring已经提供的模块,日常开发没有问题, 但遇到一些棘手的问题,不容易分析,因为以前都是spring帮你做的!我建议,用spring可以,不过要慎用!不要把他当做神器,而只是当做你的可选项之一!也是你的一个值得品鉴的开源框架,不管从代码规范角度还是功能性方面,spring做的都不错,不过我反对用一门技术只说其能解决什么问题、有什么优点,我觉得对于一项技术的全面掌握,对缺点的理解是非常重要的,比如javadoc的缺点(这也是面试时问的),javadoc不能强制说明某个类(或方法)应用场景以及缺陷,项目暴露出的功能和性能问题很多其实就是由于javadoc的自阐述性不够造成的,这是javadoc最大的败笔,一些比较在乎的程序员(比如spring的coder们),在必要的地方会加上这些说明,这些是我一次失败面试经历所获得的启发。 
-------------------------------------------------------
flounders --发表时间:2012-09-29   
litianyi520 写道
我们应用框架是应用它的优点,项目里并非只能应用一种框架,适当的选择,才是正解。 
我想jsp能搞定几个页面,你也不会用什么框架吧。

不知道一项技术有什么缺点或者局限性,毫不怀疑的就使用它?总觉得这样做没什么追求,作为一个coder,得有洞察技术的能力,不仅仅知道其优点。你说的“适当选择”,其中就考虑到了缺点的因素,不是吗? 

*****************************************************************n
7. 呵呵 这个帖子有意思啊 我也真想知道Spring有什么不好的。可是想想好像真想不出来呢,可能是我爱屋及乌吧。

不过硬要说点Spring坏处的话,我的感觉就是Spring把我们的编程模式化了,觉得什么项目都是DAO,SERVICE,然后Bean 
之间的组装,很容易把我们变成了蓝领Coder。 

个人的建议里,你写代码时先不要想着Spring,而应该用OOP的思路去开发,做好后,再来用Spring组装。或者说,你的代码脱离Spring能不能照样跑。这样才能让Spring为我所用,而不是让Spring绑架了我们。 

回顾自己的编程经历,大概是这样的: 
  1)早期自己的代码就是"Dao+Service+Web+事务管理",一切奔Spring这个主题去 
  2)后来我就先OOP,然后再在Spring中组装,我的代码脱离Spring自己通过new Object 手工整合后也是可以跑的(当然一些Spring提供的功能,如事务管理是没有的),然后再用Spring组装之。 

  一言以蔽之:先OOP而后Spring,就可让Spring为我所用!

-------------------------------------------------------

05-11 18:15