Spring是什么?初接触的人会说Spring是个ioc容器。 这个答案只能获50分!!
Spring是一个从web mvc一直到数据访问的完整程序结构体系。而且对于不同的人有不同的使用方法。让我一一道来。
最为人熟知的,Spring是一个ioc容器。这个对应Spring的org.springframework.beans包,
而且这是大家用的最多的功能。我们称为BeanFacotry。其基本原理说穿了很简单,读取一堆配置,侦测出各个bean的依赖关系。然后有两部分工 作,一部分是通过PropertyEditor,把配置文件中写的一些非bean数据绑定到每个bean的属性属性上(比如int,boolean,甚至 map类型的属性),还有一部分是建立bean之间的相互关系。当然这两部分是同时进行,没有先后。当初作者选用的是PropertyEditor,如果放到现在可能会选用ognl。btw,这个绑定机制在spring web mvc中也有用到 .。
如果只是使用ioc,只要知道配置文件怎么写就可以了。如果想自己写一个ioc容器可以看看这个包里的代码,特别是BeanDefinition和BeanFactory的设计非常精彩
其次Spring是一个ApplicationContext。现在Context这个词用的越来越烂,Spring的这个Context说穿了就是在BeanFactory基础上多了一些高级功能,包括 :







这些是一个大型程序常用的功能。不过,一旦你使用了spring的application提供的功能,那你的代码就和Spring再也脱离不了关系了。
以上是Spring的核心功能,Spring剩余的部分以ioc为手段,或以ioc为目的,向前端,后端,深层和周边范围扩展。说以ioc为手段是 因为有部分功能理论上是可以脱离Spring核心功能而使用,只是用了ioc后会简化很多工作量。以ioc为目的是因为还有一部分代码就是为了把其他库拉 进spring而设计。我们不妨……看过来,看过来……哦!哦!!
先说前端。Spring自带一个web mvc框架。如果拿struts作比较的话,那么strust中的formbean,action和返回的formbean,依次对应着spring mvc中的command,controllor和ModelAndView中的model。其实说穿了,现在的web mvc的主要功能都很类似,提供一种机制把用户通过http提交的数据转换成比较容易使用的形式,顺便作一些校验。然后读取某个配置文件将这些数据传送到 一个控制器上。然后获取控制器返回的数据和视图名称,再找到对应的视图把这些数据和视图合并起来发回客户端。大家所比较的无非是哪个提供的附加功能多点 (比如谁的验证器又多又好),配置文件哪个写起来容易点,控制器尽量不要和业务功能过于耦合,作页面尽量好看点。基本功能不会有太大的差别。谁有能力和时 间的话,完全可以写个适配器,把其中的一套的某些功能适配到另一套上去。
spring的前端自有它的优势,能和ioc框架无缝整合,所有的配置统一被beanfactory读取。但是要用户spring mvc除了要学习spring之外,还要学习一到两种页面显示技术。因为spring mvc自己不带页面显示功能,默认情况下它使用的是jstl+jsp。至于spring的那套tag,我觉得纯粹是鸡肋,只是用来显示验证结果用的,并非 框架核心。用不用他的那套tag纯属个人爱好。
说句题外话,现在有不少web框架要和spring集成,大多数走的是配置ContextLoaderServlet,然后用 WebApplicationContextUtils.getWebApplicationContext的路子。其实说穿了也很简单。去看 org.springframework.web.context.ContextLoader的代码,会找到这两句


他就是把一个context放到了servletContext里去了。然后大家再从servletContext里拿。这样只能从web框架单向 引用到managed bean,而bean用不到web里的对象。除非这些web框架能够在运行时动态向sping的ioc容器里添加自己创建的对象或者直接让spring协 助创建。
转回话题
向后端是指spring同一些DAO框架进行集成。这方面spring更多的是在搭桥。比如hibernate的 LocalSessionFactoryBean。这些桥搭起来后,我们可以很方便的从spring中访问这些dao框架。而这些框架对spring可以 说是一无所知。此外由于dao代码的复杂性和重复性,spring还提供了一些template,来降低开发人员的工作量,简化代码。spring的这些 功能可以说是大部分的体力活和小部分的脑力劳动。不过我们还是要感谢这些牛人们,他们是虽然不是“加拿大gcd员”,但是为了帮助中国的程序开发事业,即 使未受“加拿大gcd和美国gcd的派遣”,还是把spring框架不远万里的带到中国。
向深层方向发展是指spring的aop和transaction功能。这些功能的基本原理就不说了。虽然未必是spring独有的,但这些实现都 是spring作者亲自设计的。可以说是他们的“自主知识产权”。我可不希望有xx人看到这些代码拿倒自己的公司然后打上copyright。我肯定会找 这种人拼命的 。这些功能其实和ioc一点关系都没有。而且spring的reference里也说可以"programmatically"的。比如




这些功能处于不用ioc也可以跑,不过用了ioc用起来更方便的位置。如果谁在这方面有兴趣也可以翻翻spring代码。比如要写一个简单的事务管 理器,就可以去看spring的各种TransactionManager的实现。当然真正的回滚递交机制的实现这些代码帮不上忙的。
最后说说周边扩散。这表现在两方面,一方面是spring内部所集成框架和类库的数量越来越多。spring最早的版本中就包含quartz的集 成,后来加上了jms,这些可以说是和spring中的其他部分完全不相干的东西。此外越来越多的项目在向spring靠拢或者使用spring作为项目 内核,比如开源的jms服务器active mq,web中用到的valuelist。
以下是回复 :
Spring的附属产品确实越来越多了,Spring虽然号称non-intrusive,也只是Spring core能做到。剩下的部件只要你越用越深入,到最后Spring完全就渗入到敌方组织内部了,真是高明啊
错了..如果你只是觉得每个MVC都这样就很好笑.如果再把他们连起来,就会知道MVC的发展史是怎么样的.这是一种思想上的进步.