`
Action-人生
  • 浏览: 105790 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring MVC framework深入分析二--ApplicationContext之谜

阅读更多
http://blog.itpub.net/3247/viewspace-803152/
Spring MVC framework深入分析二--ApplicationContext之谜
假如我们在写一个基于Spring的普通应用程序,不管我们用了多么精妙的设计模式,进行了如何巧妙的设计,我们必须在某个地方执行这样的代码:[@more@]
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml", "applicationContext-part2.xml"});
appContext.getBean("…");

也许这样的代码算不上丑陋,但是它无疑破坏了程序的纯洁性和透明性。我们的应用程序开始显式地依赖SpringFramework,我们必须清楚地知道Spring的配置文件有哪几个,每个配置文件的加入或修改源代码,我们必须在某些代码模块里调用丑陋的getBean方法来创造对象。

但是所有的这些丑陋的事情似乎在我们的Web应用程序里消失啦,所有的代码都是那么干净,只有简单的get与set及接口之间的调用,我们不需要知道ApplicationContext,我们甚至不需要知道Spring。但是我们所有的对象却又是通过Spring的ApplicationContext来创造的!

看上去似乎很神奇,但是假如我们稍微思考一下,就会发现这是一件合情合理又如此简单的事情,呵呵,只有第一个想到这个方法的人才是伟大的。让我们仔细想一下普通应用程序和Web应用程序的最大区别在哪里?

其实真正的区别只有一个,普通应用程序是一个主动执行的程序,而Web应用程序却是被动的组件。这意味着Web应用程序无法自己主动去生成自己的线程去执行某项任务,而必须借用Web容器中的一个线程。想象一下一个简单的任务:我们想每隔一段时间执行一个任务,比如说在Console里打印出一行文字。在我们的Web应用程序里应该怎么完成?在我不知道Servlet Listener或Spring里提供的Schedule之前(其实Spring就是利用Servlet Listner初始化Application Context时启动schedule的),这么简单的任务在一个Web应用程序里竟然是不可想象。还记得我当时采用的是最傻的做法:写了一个单独的应用程序,在这应用程序的main函数里启动了timetask。

但是如果换一种角度来看,整个Web应用程序生活在容器里也给我们带来了额外的好处,当我们让出了对应用程序的控制权之后,我们可以让容器帮我们完成很多本来很难处理的事情。其实IOC容器的真正作用也在于此,当我们把我们的对象创建工作移交给IOC容器之后,我们发现整个程序变得如此清晰,如此透明,对象之间的关联、哪些类需要事务处理或AOP功能、哪些类要远程访问,所有这些复杂的事情在我们的程序里都不见了,我们只看到了简单的get和set。

也许废话太多,但我觉得经过这样分析,其实ApplicationContext之谜已经不再是谜了。真正的关键在于当我们的Web应用程序是被动的组件时,它除了可以错用容器的线程之外还可以错用其它一些东西。我们可以让容器来帮我们创建ApplicationContext,然后把它放在某个地方,然后在需要使用时让容器从这个地方把ApplicationContext读出来,并执行相应的Controller就可以了。
这个"某个地方"就是ServletContext,而这个创建ApplicationContext的地方就是Servlet Listner,而取到ApplicationContext的地方是我们的DispatcherServlet。

仔细想一下,其实Web服务器并没有什么了不起的地方,它只是一个Java程序,它只是会在启动的时候去ClassLoad某些指定文件夹下的lib或classes,它会读某个在WEB-INF下面一个叫做web.xml的配置文件,再做一些初始化工作。Servlet Listener就是这个初始化工作的重要一步,服务器会读出web.xml里配置好的所有listner,然后调用每个Listner的contextInitialized方法(它还会去调每个Servlet的init方法,不过把初始化方法写在Listner里才是天经地义的)。哈哈,这也正是Spring MVC创建ApplicationContext的最好时机,当我们在web.xml里配置好ContextLoaderListener的时候,Spring就完成了ApplicationContext的创建过程,如果有人想研究源代码的话可以去看一下,不过这个创建过程并不象想象中的那么有趣,只是通过Class.forName和BeanUtils.instantiateClass创建出一个WebApplicationContext,然后再读了一下IOC容器的配置文件。
接下来的一个问题是我们要把创建的ApplicationContext放在哪里?答案是ServletContext,其实没必须对ServletContext进行深究,它只是可以一个可以全局存放Web应用程序的场所,我们只要想象成一个全局的HashMap就可以了,我们可以要把它put进去,就可以在Servlet或其它地方把它get出来。

Web服务器还要干的一件事件当然是在某个request到来时,它会启动一个单独的线程(这也是为何Webwork可以把Context放到ThreadLocal里的原因),根据web.xml里的配置和request的URI匹配去执行相应的Servlet。由于Servlet可以很轻松地读到ServletContext,当然也可以很轻松地读到ApplicationContext啦。接下来的事情就比想象中要简单啦,经过一些准备工作之后ApplicationContext中的URLMapping里配置好的某个Controller,执行一下再rend某个view就可以了。其实struts或webwork2的执行过程也是如此,所以MVC framwork分析透了其实真没什么了不起,远比O/R Mapping或其它的framework简单。虽然MVC的执行过程如此简单,但是我们还需要了解一些细节上的事件,所以让我们下次来讨论一下Spring MVC framework的执行过程吧。
分享到:
评论

相关推荐

    spring-framework-1.0-with-dependencies.zip

    通过深入研究这个压缩包,开发者不仅可以了解Spring Framework的基础原理,还可以对比不同版本的演变,进一步理解软件开发的进化历程。同时,对于那些正在维护旧系统或者希望了解软件历史的开发者来说,这是一份宝贵...

    spring-framework-5.0.2.RELEASE-dist.zip

    在核心容器方面,Spring Beans和ApplicationContext仍然是核心组件。它们负责管理对象的生命周期和依赖注入,使得开发者可以轻松地创建和配置Bean。5.0版本增强了配置元数据支持,包括XML、Java注解以及基于Java的...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    Spring框架是中国最流行的Java应用开发框架之一,以其模块化、松耦合的特性深受开发者喜爱。5.2.6.RELEASE是Spring框架的一个稳定版本,它包含了一系列的jar包,这些jar包是构建和运行基于Spring的应用程序所必需的...

    spring-framework-master

    通过阅读和分析"spring-framework-master",开发者可以深入理解Spring的工作机制,提升自己的编程技巧,同时也可以根据需求自定义扩展,使Spring更好地服务于项目需求。这不仅对于Java开发者,对于所有希望深入学习...

    spring-framework-reference-4.3.19.pdf

    #### 二、Spring Framework 4.x的新特性与增强 **3. Spring Framework 4.0的新特性和增强** - **改进的入门体验**:Spring 4.0版本提供了更加友好的入门教程,帮助开发者更快地上手。 - **移除过时的包和方法**:...

    spring mvc jar包

    3. `org.springframework.web.servlet-3.0.2.RELEASE.jar`:这是 Spring MVC 的核心模块,提供了控制器(Controller)、模型视图(ModelAndView)以及调度器Servlet(DispatcherServlet)等关键组件。...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    首先,源码分析从`spring-framework-5.1.4.RELEASE-dist.zip`开始,这是Spring框架的基础组件包,包含了所有核心模块的类库和配置文件。主要模块有Core Container(核心容器)、Data Access/Integration(数据访问与...

    spring-framework-1.2.7-with-dependencies.zip

    本次我们将深入探讨Spring Framework 1.2.7 版本,并结合JBuilder这款强大的Java集成开发环境,阐述如何将两者完美融合,提升开发效率。 首先,Spring Framework 1.2.7 是Spring早期的一个稳定版本,它包含了对Java...

    最新版spring-framework-4.3.12.RELEASE-dist 完整包

    Spring Framework 是一个开源的应用程序框架,主要针对Java平台,它为构建企业级应用程序提供了全面的基础设施。Spring 的核心是依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming...

    org.springframework.web.struts-sources-3.0.4.RELEASE.jar

    《Spring与Struts整合:深入理解org.springframework.web.struts-sources-3.0.4.RELEASE.jar》 在Java Web开发领域,Spring框架以其强大的依赖注入和面向切面编程能力,而Struts则以其优秀的MVC架构模式,共同构建...

    spring-framework-4.2.3.RELEASE-dist

    Core Container包括Bean Factory和ApplicationContext,它们是Spring的基础,负责管理对象的生命周期和依赖注入。 2. **依赖注入(Dependency Injection, DI)**: Spring 4.2.3.RELEASE中的DI允许开发者通过配置...

    spring-framework-2.5.6-with-dependencies

    总结,Spring Framework 2.5.6是学习和理解Spring框架的重要版本,它的源码和实例为我们提供了深入学习的宝贵资源。通过深入学习和实践,开发者能够熟练掌握Spring的精髓,提高开发效率,为构建高质量的企业级应用...

    spring-framework-5.3.20

    Spring Framework,作为Java领域最广泛应用的轻量级框架之一,自诞生以来就以其卓越的灵活性、强大的功能和良好的社区支持,深受广大开发者的喜爱。本次我们将深入探讨Spring Framework的最新版本5.3.20,揭示其在...

    spring-framework-5.3.8

    5. **Web 模块**:Spring MVC 是 Spring 框架中的 Web 开发组件,提供了一个优雅的方式来构建 RESTful 风格的 Web 应用。5.3.8 版本可能包含了对 HTTP/2 和 WebSocket 的更全面支持,同时在处理请求和响应上进行了...

    spring-framework-2.0.6-with-dependencies.zip

    3. **Spring MVC**:Spring 2.0.6包含了一个强大的MVC框架,用于构建Web应用程序。它提供了模型、视图、控制器的分离,简化了Web开发流程。 4. **数据访问支持**:Spring对各种数据库访问技术提供了支持,包括JDBC...

    spring-framework-5.0.2.RELEASE-中文注释版-终极完美版.rar

    `org.springframework.context.ApplicationContext`扩展了BeanFactory,提供了更多的企业级服务,如消息传递、事件发布等。在AOP部分,`org.springframework.aop.framework.ProxyFactoryBean`用于创建代理对象,实现...

    spring-framework-4.3.13.RELEASE-dist

    《Spring Framework 4.3.13.RELEASE:构建高效的企业级应用基石》 Spring Framework是Java开发领域中不可或缺的一部分,它为构建高质量、可维护的企业级应用提供了强大的支持。4.3.13.RELEASE版本是Spring ...

    spring-framework-4.3.6.RELEASE.rar

    本文将深入探讨Spring Framework 4.3.6的关键特性和使用技巧。 一、Spring Framework概述 Spring Framework以其模块化设计著称,主要分为Core Container(核心容器)、Data Access/Integration(数据访问/集成)、...

    spring-framework-2.0-m1-with-dependencies.rar

    本篇将深入探讨Spring Framework 2.0-M1版本及其依赖,帮助开发者更好地理解和运用这个强大的工具。 一、Spring框架简介 Spring Framework以其模块化设计而著称,它主要由以下几个核心模块组成: 1. **Core ...

    官方原版完整包 spring-framework-5.0.19.RELEASE.zip

    Spring Framework,作为Java开发领域中最为广泛使用的应用框架之一,是构建高效、灵活且可测试的Java应用的重要工具。5.0.19.RELEASE是Spring Framework的一个稳定版本,它在之前的版本基础上进行了多项改进和优化,...

Global site tag (gtag.js) - Google Analytics