http://www.iteye.com/topic/1131284
1.JavaTear2014 --   发表时间:2013-07-17   最后修改:2013-07-17 

Spring应用比较广泛,本身应该没有什么大问题,只不过就是越来越庞大了,复杂了! 
如果喜欢轻量级别的朋友,我在这里推荐一个(总共也不过500k),它包含Ioc,orm,event,log,job等,已有项目采用这个工具进行开发的,性能还可以! 

Blog:     http://blog.csdn.net/javatear/article/details/8994151
下载地址: http://pan.baidu.com/share/home?uk=2218126399

---------------
sharong --发表时间:2013-07-29   
很多互联网高并发应用启动一次要10分钟以上,但是因为都是nginx配置的集群,在前端感觉不到 

------------------------------------
小te --   发表时间:2013-07-16   
鱼言风语 写道
不支持热部署,是其为数不多的较大的缺点

JRebel就支持Spring的热部署,改个注解什么的都不用重启服务器。 
Eclipse Marketplace里可以在线装,不过这货是收费的,可以试用十多天。 

***************************************
2.iceofst --   发表时间:2013-07-17   
Spring 确实可以使应用程序松耦合,这没有问题。但是DI为我们的带来多大益处我不是特别清楚。 
做了几个项目。项目里面绝大部分类都在用Spring进行管理。很多人写服务的时候都是思维定式:接口+实现类+Spring bean。 

搞到后面,我自己都麻木了。最近一直在思考,Spring到底为我们带来了什么益处,我们是不是正确的、按照框架提供者的初衷在用这个框架,而不是看到别人用我就用。 

我个人理解: 
在不改变架构的前提下,类和类之间的依赖关系是不会消除的。 
我们可以通过各种手段转移类的依赖关系,甚至依赖的方向。 
DI就是一个很好的例子,他做了两件事情:1.把类的依赖关系转移到了框架进行管理,2.反转依赖关系的方向,由框架提供依赖的对象而非自己去取。 

这样做的好处是,使类之间的依赖具有很高的灵活性。我们可以很方便的切换类的实现,而调用方只用单纯的面向接口编程。 

但是问题来了,我们程序里面,确实需要用到上述特性的场景有哪些? 
比如: 
更易于测试。但是相比专门的测试框架(比如jmock)并没有优势。 
粘合剂。确实方便了多个框架的整合,但是用代码方式来整合也很简单。 

大家是什么想的,求指点。 

---------------------------------
小te--发表时间:2013-07-18  
我觉得Spring可以分为两部分来看: 
1)IoC/DI/AOP 
2) 基于IoC/DI/AOP的集成了其他优秀开源框架的一体化框架 

第一部分前面已经说了中心作用就是“解耦”。 

第二部分可以横向对比一下Ruby里的Rails和PHP里的Zend Framework,都有类似的框架,这些框架之间都有相互借鉴。 

区别就是其它语言的类似框架都是从头到尾自己搞的,而spring是个另类,自己本身的东西很少,都是集成别人的。这得益于java开源世界里资源丰富,没有必要重复发明轮子。Ruby on Rails的插件也很多,不过这个是反的,别人是针对Rails来写插件,Spring则是主动把别的已有框架适配进来,这一点上Spring更高明些。 

另一个区别是其它web服务器端语言一般都是动态的,动态语言的特点是在运行时可以改变自身结构,所以实现插件化非常容易。而Java是静态或者说是半动态的,在Java里要实现类似于动态语言可插拔的特性就要用Spring这样的IoC/AOP框架,因为JDK本身并不提供这样的功能,Spring相当于是对虚拟机进行了hack。 


回过来再说前面的解耦。 
对象之间有一种关系叫依赖关系,就是一个类里调另一个类,另一个类当参数传进去。 
为了降低两个类之间的耦合,我们通常会引入接口,一个类去调另一个类的接口,而不直接调这个类,就是所谓的针对接口编程。 
当然使用接口是有前提的,就是这部分功能会变动会扩展时才有必要引入接口,我总不能为了低耦合搞得系统到处都是接口吧,过度设计是没有必要的。 
问题来了,如果只是一个普通的类没有设计接口怎么来扩展加新功能,而且这个类还是第三方的只有架包没有源码。这时用Spring的DI就简单了,你只需要新写一个类继承原来的类,然后修改一下xml里的bean的配置就把原来的类替换掉了。(当然你只能访问父类里public和protected的数据和方法,private的操作不了) 

AOP也是一样的,用JDK标准的做法你只能拦截实现了指定接口的类,而用了Spring就不一样了,一个普通的类你也可以拦截,用不着接口。AOP典型运用场景比如事物、日志,把规则配上就有了,用不着写程序了。 


再说一下你说的另一个问题,就是在service层写大量的接口。我们知道接口的作用是可以替换成不同的实现,但实际上对于大多数系统service层可能就一种实现,以后也不会替换成其它实现了。那有没有必要写接口,我认为仍然是有必要的。因为service也就是俗称的业务逻辑层表达了这个系统的行为,就是说service确定之后你这个系统能做哪些事情就确定了,所以service的接口是需要认真设计而且也不应该随便修改的。因此service应该被抽取成接口,而且应该加上详尽的注释,service方法的命名可以略长要能清楚的表达这一功能逻辑的意思。 

与之相对应的是DAO层的接口问题。搞java的操作数据库都习惯用DAO,DAO的全称是Data Access Object,业务层调用DAO来访问系统数据。典型的DAO设计模式有一个工厂类、一个接口、一个实现类,网上能找到的示例一般也都是这个样子的。但是,当你使用任何一种设计模式最好是能搞清楚使用场景和它最初的来源。在java里引入DAO最初是为了解决数据库迁移问题,有了DAO就可以用替换实现类的方式在不同数据库之间切换,当时搞java的那帮人甚至yy有了DAO我以后可以不用数据库换成用文件来存数据。所以看清楚了,解决数据库迁移问题,可以在不同数据库之间切换,这正是hibernate干的事情!所以如果你有用hibernate没有手写SQL就没有必要给DAO加接口,如果你有写SQL但肯定不会换数据库也没有必要给DAO加接口,即便是你有写SQL以后也可能会更换数据库那也没有必要现在就给DAO加接口,因为换的时候再加是一样的。 


所以我们对系统进行设计和架构一定是基于场景的。系统设计的一个基本技巧是分析出对业务来说哪些是变量哪些是固定值,一个系统不可能任意灵活,过度设计同样会让系统变得复杂难以维护。基于分析,基于框架,留出必要的扩展就够了。 

---------------------------
低下头是人间 --   发表时间:2013-07-28   最后修改:2013-07-28 
指出几个问题: 
1. 动态语言的特性是运行时可以改变某个类的结构,比如增加一个方法 
Spring并没有使java具备此特性,它也没有对jvm进行任何hack 

2. SpringAOP并没有实现针对类进行代理的功能,它只是使得拦截变得可配置而已。针对类进行代理这一功能是通过cglib实现的。 

3. java引入dao是为了解决java类与数据库表的映射问题,与数据库迁移一点关系都没有。 

********************************************

3. zh_harry -- 发表时间:2013-07-19   
witcheryne 写道
说几个Spring缺点: 
1. Spring 就不应该出来,那时候我就会应为EJB太麻烦,不会走Java这条路。 
2. Spring 为什么没有归到 java 扩展包中,并且成为java默认配置。每次建项目都要配。 
3. Spring ORM太邪恶了,我已经快忘了Hibernate中的方法如何使用。 
4. Spring AOP平时很少用,一般配置好一次不会再动,面试总是有人问,出了知道这是面向切面,其他的没印象。 
5. Spring 为什么要支持JRuby, Groovy之类的脚本。这样我就可以直接使用JRuby或者Groovy作为上层语言,而不是Java中嵌入这类脚本。 

Spring缺点太多了,楼下继续补充.

兄弟你太邪恶了

---------------------------------------
4.Spring Security可以略过. Apache Shiro +1 

去年年底打算重构项目的权限部分,Spring Security & Apache Shiro 同步研究,  最终被Apache Shiro的简单征服了. 
现在用的很舒服. 
-----------------------
小te--发表时间:2013-07-22   最后修改:2013-07-23 
Spring Security比较鸡肋,因为Spring Security是由acegi转过来的,跟spring亲生的Spring MVC可以说是两个级别的东西。 

国内的权限系统通常会比较复杂,而基于Spring Security稍微复杂一点儿的权限系统你就需要自己扩展一堆东西。扩展一堆东西就为了复用一点点功能,跟自己重头实现一个权限系统基本也相差无几了。而且Spring Security的API接口设计得一点儿也不友好,文档也不行,很多时候你不得不去看源码。唯一的好处就是因为是基于Spring的,所以你确实可以基于它扩展出任意复杂的权限系统来。 

我还是五年前用的,当时Spring刚发布3.0版本,Spring Security刚从acegi改名过来。那时候java领域实在是没有比Spring Security好点儿的权限系统了,所以也不得不用它。 





Spring的缺点有哪些--Ext扩展的更多相关文章

  1. Spring @Aspect进行类的接口扩展

    Spring @Aspect进行类的接口扩展: XML: <?xml version="1.0" encoding="UTF-8"?> <be ...

  2. Ext扩展的QQ表情选择面板

    Ext扩展的QQ表情选择面板 define(function () { EmoteChooser = function(cfg){ this.width=340; this.height=112; t ...

  3. 深入理解Spring系列之八:常用的扩展接口

    转载 https://mp.weixin.qq.com/s/XfhZltSlTall8wKwV_7fKg Spring不仅提供了一个进行快速开发的基础框架,而且还提供了很多可扩展的接口,用于满足一些额 ...

  4. Spring Cloud OAuth2(二) 扩展登陆方式:账户密码登陆、 手机验证码登陆、 二维码扫码登陆

    概要 基于上文讲解的spring cloud 授权服务的搭建,本文扩展了spring security 的登陆方式,增加手机验证码登陆.二维码登陆. 主要实现方式为使用自定义filter. Authe ...

  5. 面试官:你知道Spring中有哪些可以让我们扩展的地方么

    大家都知道我这段时间陆续更新了Spring系列源码分析以及各种扩展点的文章,到了今天可以总算可以更新这篇文章了 首先列举一下一个经典的面试题:Spring中Bean的生命周期: 开始初始化容器 加载B ...

  6. 从Spring容器的角度理解Dubbo扩展点的加载时机

    对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool.那么这样的扩展点在程序运行的哪个节点调用的呢?跟踪之前性能监控扩展点 ...

  7. Spring Cloud 中自定义外部化扩展机制原理及实战

    Spring Cloud针对Environment的属性源功能做了增强, 在spring-cloud-contenxt这个包中,提供了PropertySourceLocator接口,用来实现属性文件加 ...

  8. ext 扩展控件—moneyField

    /** *数字控件 *带大写提示,和千分位 **/ Ext.define(appNameSpace+'.utils.MoneyField', { extend : 'Ext.form.field.Te ...

  9. Spring Cloud Eureka集群 动态扩展新节点

    场景描述: Eureka的集群节点有两个,互相注册形成集群,已经支持动态刷新(不知道怎么让Eureka支持动态刷新的可以参考http://www.cnblogs.com/flying607/p/845 ...

随机推荐

  1. 基于Bootstrap+jQuery.validate Form表单验证实践

    基于Bootstrap jQuery.validate Form表单验证实践 项目结构 :     github 上源码地址:https://github.com/starzou/front-end- ...

  2. 大数据开发实战:Stream SQL实时开发一

    1.流计算SQL原理和架构 流计算SQL通常是一个类SQL的声明式语言,主要用于对流式数据(Streams)的持续性查询,目的是在常见流计算平台和框架(如Storm.Spark Streaming.F ...

  3. 大数据开发实战:Hadoop数据仓库开发实战

    1.Hadoop数据仓库架构设计 如上图. ODS(Operation Data Store)层:ODS层通常也被称为准备区(Staging area),它们是后续数据仓库层(即基于Kimball维度 ...

  4. ifdef ANDROID总是不好用

    在vs的proprocessor definition中定义了ANDRIOD, 但是执行下面的代码的时候,总是说ANDROID is not defined.     #ifdef ANDROID   ...

  5. 【Python】使用geopy由经纬度找地理信息

    from geopy.geocoders import Nominatim geolocator = Nominatim() location = geolocator.reverse("3 ...

  6. Provide your license server administrator with the following information.error code =-42,147

    ArcEngine应用程序开发中,许可不必不可少的.一般采取两种方式来获取许可——License控件和AoInitialize类,但今天在VS2010打开程序时,隔一会弹出错误窗口:Provide y ...

  7. debian下配置网络 安装无线网卡驱动 Broadcom BCMXX系列

    解决方案来自于debian官网  https://wiki.debian.org/wl 1.加入源 deb http://http.debian.net/debian/ wheezy main c ...

  8. 安装MySQL-python报错:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory或者 build\lib.win-amd64-2.7\_mysql.pyd : fatal error LNK1120: 56 unresolved externa

    解决办法1: 直接下载MySQL-python-1.2.5.win-amd64/32-py2.7.exe,点击安装 此处要注意自己安装的Python和MySQL版本是64位还是32位,否则在进行安装M ...

  9. Customize Web Sessions List

    To customize Fiddler's Web Sessions List, add rules using FiddlerScript to the OnBeforeRequest funct ...

  10. Markdown中实时显示数学公式的方法

    Markdown中实时显示数学公式的方法 Markdown非常好用,但是对于数学公式的实时显示有一些缺陷,如何解决这一问题呢? 一.在线LaTex编辑 点击在线LaTeX编辑方式 在对话框中输入数学公 ...