如题,希望大侠们指出,不能用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中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

是否要学SpringMVC的更多相关文章

  1. 【转】跟着开涛学SpringMVC

    跟着开涛学SpringMVC 第一章源代码下载 博客分类: 跟开涛学SpringMVC 跟开涛学SpringMVC  源代码请到附件中下载. 其他下载: 跟着开涛学SpringMVC 第一章源代码下载 ...

  2. 跟我学SpringMVC目录汇总贴、PDF下载、源码下载

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列

    Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列

  4. 学SpringMVC收藏

     一个较完整的SpringMVC工程的配置 2014-01-22 17:17:25 标签:java spring springMVC 配置 springSecurity web.xml 原创作品,允许 ...

  5. 《转载》跟我学SpringMVC

    在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller ...

  6. SpringMVC_架构 --跟海涛学SpringMVC(学习笔记)

    重点: 1.工作流程及实现原理 2.配置及使用方法 3.共同函数 前言 1.2.模型: 1.2.1.此处模型使用JavaBean,可能造成JavaBean组件类很庞大,一般现在项目都是采用三层架构,而 ...

  7. 一起学SpringMVC之异常处理

    在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...

  8. 一起学SpringMVC之文件上传

    概述 在Web系统开发过程中,文件上传是普遍的功能,本文主要以一个简单的小例子,讲解SpringMVC中文件上传的使用方法,仅供学习分享使用,如有不足之处,还请指正. 文件上传依赖包 如下所示,文件上 ...

  9. 一起学SpringMVC之国际化

    随着网络的发展,在Web开发中,系统的国际化需求已经变得非常的普遍.本文主要讲解SpringMVC框架对多语言的支持,仅供学习分享使用,如有不足之处,还请指正. 什么是国际化? 国际化(interna ...

随机推荐

  1. .net 使用Json(),maxJsonLength属性设置的值问题

    “使用JSON JavaScriptSerializer进行序列化或反序列化时出错.字符串的长度超过了为maxJsonLength属性设置的值” 今天业务找我说线上的国家地区都显示数字(地区ID),而 ...

  2. SQL Server安全(4/11):许可(Permissions)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  3. openjudge7834:分成互质组 解析报告

    7834:分成互质组 总时间限制:  1000ms 内存限制:  65536kB 描述 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? 输入 第一行是一个正整数n.1 &l ...

  4. 【转载】[jquery.validate]自定义方法实现"手机号码或者固定电话"的逻辑验证

    最近项目开发中遇到这样的需求“手机号码或者固话至少填写一个”,如下图所示: 项目采用的jquery.validate.js验证组件,目前组件不支持这种“或”逻辑的验证,于是就自己定义一个 jQuery ...

  5. C#连接Excel示例代码和驱动

    代码如下: string fileExt = Path.GetExtension(excelPath); string conn = ""; if (fileExt == &quo ...

  6. WPF的一些总是记不住的Tips

    Margin(Left,Top,Right,Bottom); HorizontalAlignment(Height的Opposite,水平对齐方式):VerticalAlignment(Width的反 ...

  7. 值栈(Structs2)

    1. 关于值栈: 1). 登陆 时, ${userName} 读取 userName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ValueStack: I. ...

  8. AFNetworking 3.1

    听说之后AFHttpWorking版本可能会影响到苹果的审核,今天下了最新版本的AFHttpWorking,并且做了简单的封装,我这里是通过cocoapods下载了两个工具 1=AFHttpWorki ...

  9. swipe.js 2.0 轻量级框架实现mobile web 左右滑动

    属性总结笔记如下: <style> .swipe { overflow: hidden; //隐藏溢出 清楚浮动 visibility: hidden; //规定元素不可见 (可以设置,当 ...

  10. Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution

    在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typ ...