是否要学SpringMVC
如题,希望大侠们指出,不能用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的更多相关文章
- 【转】跟着开涛学SpringMVC
跟着开涛学SpringMVC 第一章源代码下载 博客分类: 跟开涛学SpringMVC 跟开涛学SpringMVC 源代码请到附件中下载. 其他下载: 跟着开涛学SpringMVC 第一章源代码下载 ...
- 跟我学SpringMVC目录汇总贴、PDF下载、源码下载
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
Spring Web MVC中的页面缓存支持 ——跟我学SpringMVC系列
- 学SpringMVC收藏
一个较完整的SpringMVC工程的配置 2014-01-22 17:17:25 标签:java spring springMVC 配置 springSecurity web.xml 原创作品,允许 ...
- 《转载》跟我学SpringMVC
在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller ...
- SpringMVC_架构 --跟海涛学SpringMVC(学习笔记)
重点: 1.工作流程及实现原理 2.配置及使用方法 3.共同函数 前言 1.2.模型: 1.2.1.此处模型使用JavaBean,可能造成JavaBean组件类很庞大,一般现在项目都是采用三层架构,而 ...
- 一起学SpringMVC之异常处理
在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...
- 一起学SpringMVC之文件上传
概述 在Web系统开发过程中,文件上传是普遍的功能,本文主要以一个简单的小例子,讲解SpringMVC中文件上传的使用方法,仅供学习分享使用,如有不足之处,还请指正. 文件上传依赖包 如下所示,文件上 ...
- 一起学SpringMVC之国际化
随着网络的发展,在Web开发中,系统的国际化需求已经变得非常的普遍.本文主要讲解SpringMVC框架对多语言的支持,仅供学习分享使用,如有不足之处,还请指正. 什么是国际化? 国际化(interna ...
随机推荐
- Azure China (12) 域名备案问题
<Windows Azure Platform 系列文章目录> (1) 默认情况下,我们在创建的Azure 服务,默认使用的DNS地址为: http://xxx.chinacloudapi ...
- web项目中,视图层中关于相对路径和绝对路径
1.在jfinal项目中 因为一直使用的jfinal,没感觉路径问题. 举个栗子,项目名字叫做test.访问一个Controller的映射为/user/add.这样,在浏览器地址栏直接:localho ...
- ROS 多台电脑间进行通信
版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5773822.html 在我看来,ROS最牛逼的地方就是它的通信机制了,不仅仅是进程间 ...
- SQL --分组【Group By】
Group By:对数据进行分组,分组之后的数据就是“分组信息”,和原来表的信息,就没有联系了, 分组之后,可以取到分组数据,就是根据什么字段分组,就能取到字段的名字了.还能使用聚合函数. Group ...
- VUE2.0不可忽视的很多变化
今天使用webpack-sample初始一个vue-cli项目,在app.vue文件中添加了个钩子函数ready,可是ready内的事件一直不执行,检查了webpack文件和package.json也 ...
- 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage
Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...
- 使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台
使用VS Code 开发.NET Core 应用程序 部署到Linux 跨平台. 前面讲解了VSCode开发调试 .NET Core.都只是在windows下运行. .NET Core真正的核心是跨平 ...
- 如何获取配置文件Web.config的AppSetting节点数据
ConfigurationManager必须要先在工程里添加system.configuration.dll程序集的引用. 1 System.Configuration.ConfigurationMa ...
- 精品干货丨APP常用导航框架
文章目的:在整体上把握移动端App的导航框架,理解每种导航所具有的优点.局限性和其所适用的范围. 文章用心:典型APP案例(源码:http://www.jinhusns.com/Products/Do ...
- Netbeans 8.2将支持PHP 7
首先,将PHP项目的PHP版本设置为PHP 7.0. PHP 7其中一项新特性是返回类型声明,即PHP的函数和方法可以声明指定类型的返回值: PHP 7的另一项精彩的改进就是参数的标量类型声明,Net ...