也许见笑的问题:为什么要用spring?

struts+POJO与struts+spring的区别在哪里呢?

如果说单元测试,前者也是可以的。
martin fowler的文章中更倾向于service locator模式,他认为IOC模式不利于理解。

使用spring究竟带来了多少效益,负面作用有哪些呢?

jdon的板桥先生似乎也对spring有所质疑。

我想不应该陷入一边倒的"人云亦云"的赞歌中,该一分为二看待。
不再造神!

首先我提一个问题,你知道什么是IOC了吗?如果没有,可以先补上这一课,然后再来讨论IOC的利弊。
人云亦云固然是不大好,但连人家说什么都不懂就敢开口似乎更加不好。

>>martin fowler的文章中更倾向于service locator模式,他认为IOC模式不利于理解

Martin Fowler的文章《IoC容器和Dependency Injection模式》(IoC Container and Dependency Injection Pattern)的唯一中文版本是由我翻译的,但我――不论是翻译时还是现在――从来没有看出他“更倾向于service locator模式”,更没有看出他“认为IOC模式不利于理解”。所以你这话让我有点如芒在背:如果真有这层意思而我没有看出来,我的翻译岂不是有滥竽充数之嫌了?所以还请不吝赐教,请问究竟从哪里看出Martin Fowler的这些观点?我在这里先行谢过了。

正好我是读你的译作:2004.3 程序员文章。其中有大段的IOC和service locator的比较(做出一个选择)。我想fowler名气固然大,我等也不必迷信其说法。

spring 包含了很多模块,我澄清一下我的提法“struts+POJO与struts+spring IOC 的区别在哪里呢?”

究竟好在哪里?不能说因为是IOC,所以好!

我看到的一些理由是:

1.易于测试(针对ejb、jndi的难于测试)
2.可以动态配置,替换部件。
3.不用写singleton

但我感觉这几条都不足以说明非IOC不可,理由如下:

1 易于测试很好,但采用service locator也是可以测试的,据板桥说ejb也能测试(我不熟悉ejb)。
2 只要是对接口编程,就可以做到部件替换。
3 减少singleton很好,但效益有限。

引入框架的副作用是有几点:

1 学习成本,你必须学习配置文件的写法,相当于学习一个小的语言。(pico container不需要写配置文件)
2 依赖性
3 复杂性

市场上总是充满了吆喝,小品叫呼悠,英语叫hype,有意的无意的。Rod Jonson是一个优秀的设计者,但他也是要谋生的人,不是神,中国人有造神这个爱好。
每当有人向你推销万能药的时候,一定要打起精神多一些独立的批判性思考。

最后,我写这些只是为了学习探讨,如果你觉得很肤浅可以不予理睬,但不要开口就教训人,不管你名气多大,请用事实说话!

>>1 易于测试很好,但采用service locator也是可以测试的,据板桥说ejb也能测试(我不熟悉ejb)。

正确。但是要测试EJB必须将其部署到application server,这将使每个“测试-编程”的循环被严重拉长,实际上破坏测试先行的开发方法。

>>2 只要是对接口编程,就可以做到部件替换。

正确。

>>3 减少singleton很好,但效益有限。

不正确。Singleton之类创建型模式是一种实现细节,不应该在接口上暴露。最典型的例子,如果用经典方式(GoF书中介绍的方式)实现Singleton,你无法在不修改代码的前提下把它改为prototype。对象的创建应该由容器统一管理。

IoC与Service Locator真正的本质区别在于:如果使用Service Locator,那么组件的使用者必须与“组件的创建”(也就是Service Locator)耦合;如果使用IoC,组件的使用者不需要与组件的创建耦合,因此组件更具可移植性。这才是选择这两个模式的标准:你是否允许组件的使用者与组件的创建耦合。如果允许,Service Locator会很好;如果不允许,你需要IoC。其他的,从Martin Fowler这篇文章就可以看到,基本上是设计细节。

>>Rod Jonson是一个优秀的设计者,但他也是要谋生的人,不是神,中国人有造神这个爱好。每当有人向你推销万能药的时候,一定要打起精神多一些独立的批判性思考。

很好,我欣赏这样的态度。我――向Rod Johnson学来的――经常说:你不要相信任何人的建议,同样不要相信我的建议。你应该相信你自己的vertical slice,用template application去检验一项技术是否适合你的应用。我最反感的就是“要是不懂EJB,你就没资格谈论企业级应用”这样的态度,相信你也会与我有同感。

struts+pojo说的也太简单了。struts本身在业务逻辑层不提供什么框架,action只是一些空的东西,用来调用具体的也逻辑(是不是你说的pojo)。spring的主要思想大家也都比较熟悉,无非是面向接口,aop的概念。在他出现以前大家也都用各种方式实现过。难得的是作者提供了一个通用的一致的实现框架(还有很多实用的工具类),这些都大大方面了我们进行框架的设计。所以从某方面说可以说spring是一种设计框架的框架。我们当然也可以根据具体需求自己从头设计,但既然有这么一种方便的框架,为什么不用呢

dabb回答比较专业,理性,我比较赞同。

正如我在http://www.jdon.com/jive/article.jsp?forum=91&thread=16846跟贴一样,这个项目只是原始的Jsp/JavaBeans结构,没有用任何所谓框架,其实这才是最难能可贵的,因为他们重视了设计思想。

Struts /Spring /EJB所有的都是表面,抓住本质才是最重要的,我想这才是chenge 发本贴的主要意思。

为什么要用spring?被勾引过去的,当你在开发中遇到很多琐碎的事情,你碰到spring了,发现真是好用,极其好用,于是就被吸引过去了。

我接触spring是冲着他的hibernate template去的,看着看着发现都是宝,提供了很多工具帮助你开发,即使不使用spring的整个架构,里面的很多工具也是很好的。

所以你碰到质疑不应该去问别人,自己把spring文档掏出来看看,去动手做做才是正道,你问别人的话不就是自己在"人云亦云"了?