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

 

 

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

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

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

 

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

架构只是对JDK的一种扩展,从这个角度讲,Spring和其他架构没有区别,Struts2提供MVC能力,Spring提供IOC及AOP能力,你觉得呢? 

想怎么换就怎么换。 

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

可能项目不太一样吧,我工作中的项目每个功能点都需要测试,Spring这种IOC和AOP的能力让我在测试一个点的时候,还需要考虑到配置文件里的东西,而且又得为了测试单独写配置文件,很奇怪,不知道你有啥高见。 

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

经历过,不过没有2000行的量,分了一些模块,每个模块配置300行吧。我觉得Annotation没有做到简化配置过程,反而让类变得不纯净。 

 

 

最近面试一个公司,算是国内数一数二的吧,问的全是某某架构的缺点,其中就有Spring,这个题挂了,郁闷,觉得自己修炼还不够啊,对问题看的不全面,希望你能指点我一下。

 

如果脱离了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,为什么用一个道理吧。毕竟一个框架发展了这么长时间,单纯的缺陷能完善的都完善了。

 

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

 

 

 

为啥小项目引入spring是噩梦呢?你说的是多小的项目?
我觉得小项目用spring作为一个工厂也很好啊。
怎么会破坏抽象结构呢?除非用aop。否则都是接口交互,和spring注入有什么关系。
annotation是把双刃剑,过度使用和不用都不好,这个要自己衡量。
摆脱不了spring是因为spring是个类的工厂,你会再自己写工厂么?那你能摆脱jdk不。不也是工具么。

目前还没感觉有啥可以替代spring的。因为spring包括了创建型设计模式的所有内容

 

为什么SpringMVC如此好用,还有人很多公司在新项目中用Struts2

 

1,内陆互联网行业相对不发达,传统IT公司向来更看重业务
2,老系统需要维护,没有重构动力
3,技术换代需要勇气和精力,要看架构师的意愿
4.等以后更先进的技术出来了,一样会有很多人抱着spring MVC不放手,这都是一种循环

5.struts2性能不比springmvc差,拖后腿的是struts2标签、ongl表达式等。都说SpringMVC比struts2的性能好,但是只要不使用struts的标签库性能还是很好的!

6.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
8.由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
9.由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
10. 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
11.SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
12.SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。