技术开发 频道

Spring的一些整理

【IT168技术文档】pring是什么?

     初接触的人会说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 reference 写道
MessageSource, providing access to messages in, i18n-style
Access to resources, such as URLs and files
Event propagation to beans implementing the ApplicationListener interface
Loading of multiple (hierarchical) contexts, allowing each to be focused on one particular layer, for example the web layer of an application

     这些是一个大型程序常用的功能。不过,一旦你使用了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的代码,会找到这两句
代码

1. WebApplicationContext wac = createWebApplicationContext(servletContext, parent);
2. servletContext.setAttribute(
3. WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);


    他就是把一个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"的。比如
代码

1. ProxyFactory factory = new ProxyFactory(myBusinessInterfaceImpl);
2. factory.addInterceptor(myMethodInterceptor);
3. factory.addAdvisor(myAdvisor);
4. MyBusinessInterface tb = (MyBusinessInterface) factory.getProxy


     这些功能处于不用ioc也可以跑,不过用了ioc用起来更方便的位置。如果谁在这方面有兴趣也可以翻翻spring代码。比如要写一个简单的事务管理器,就可以去看spring的各种TransactionManager的实现。当然真正的回滚递交机制的实现这些代码帮不上忙的。

     最后说说周边扩散。这表现在两方面,一方面是spring内部所集成框架和类库的数量越来越多。spring最早的版本中就包含quartz的集成,后来加上了jms,这些可以说是和spring中的其他部分完全不相干的东西。此外越来越多的项目在向spring靠拢或者使用spring作为项目内核,比如开源的jms服务器active mq,web中用到的valuelist。

原文地址

0
相关文章