`
darchen
  • 浏览: 9028 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

ApplicationContext 是Spring的核心

阅读更多
ApplicationContext 是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应 用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出,虽然我没有看过这一部分的源代码,但我想它应该是一 个类似Map的结构。 
在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继 承自ApplicationContext,先让我们看看在Web应用中,怎么初始化WebApplicationContext,在web.xml中定 义: 
xml 代码
 
  1. <context-param>   
  2. <param-name>contextConfigLocation</param-name>   
  3. <param-value>/WEB-INF/applicationContext.xml</param-value>   
  4. </context-param>   
  5.   
  6. <listener>   
  7. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
  8. </listener>   


xml 代码
 
  1. <servlet>   
  2. <servlet-name>context</servlet-name>   
  3. <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>   
  4. <load-on-startup>1</load-on-startup>   
  5. </servlet>   


可 以看出,有两种方法,一个是用ContextLoaderListener这个Listerner,另一个是ContextLoaderServlet这 个Servlet,这两个方法都是在web应用启动的时候来初始化WebApplicationContext,我个人认为Listerner要比 Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前 后顺序是有影响的。 

那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢? 
以ContextLoaderListener为例,我们可以看到 
public void contextInitialized(ServletContextEvent event) { 
this.contextLoader = createContextLoader(); 
this.contextLoader.initWebApplicationContext(event.getServletContext()); 

protected ContextLoader createContextLoader() { 
return new ContextLoader(); 

ContextLoader 是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我们继续追 踪initWebApplicationContext这个方法(具体代码我不贴出,大家可以看Spring中的源码),我们发现,原来 ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默认实现类)放在了 ServletContext中,ServletContext也是一个“容器”,也是一个类似Map的结构,而 WebApplicationContext在ServletContext中的KEY就是 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我们如果要使用 WebApplicationContext则需要从ServletContext取出,Spring提供了一个 WebApplicationContextUtils类,可以方便的取出WebApplicationContext,只要把 ServletContext传入就可以了。 

上面我们介绍了WebApplicationContext在Servlet容器中初始化 的原理,一般的Web应用就可以轻松的使用了,但是,随着Struts的广泛应用,把Struts和Spring整个起来,是一个需要面对的问题, Spring本身也提供了Struts的相关类,主要使用的有 org.springframework.web.struts.ActionSupport,我们只要把自己的Action继承自 ActionSupport,就是可以调用ActionSupport中getWebApplicationContext()的方法取出 WebApplicationContext,但这样一来在Action中,需要取得业务逻辑的地方都要getBean,看上去不够简洁,所以 Spring又提供了另一个方法,用org.springframework.web.struts.ContextLoaderPlugIn,这是一个 Struts的Plug,在Struts启动时加载,对于Action,可以像管理Bean一样来管理,在struts-config.xml中 Action的配置变成类似下面的样子 
xml 代码
 
  1. <action attribute="aForm" name="aForm" path="/aAction" scope="request" type="org.springframework.web.struts.DelegatingActionProxy">   
  2. <forward name="forward" path="forward.jsp" />   
  3. </action>   

注 意type变成了org.springframework.web.struts.DelegatingActionProxy,之后我们需要建立 action-servlet.xml这样的文件,action-servlet.xml符合Spring的spring-beans.dtd标准,在里 面定义类似下面的 
xml 代码
 
  1. <bean name="/aAction" class="com.web.action.Aaction" singleton="false">   
  2. <property name="businessService">   
  3. <ref bean="businessService"/>   
  4. </property>   
  5. </bean>   


com.web.action.Aaction 是Action的实现类,businessService是需要的业务逻辑,Spring会把businessService注入到Action中,在 Action中只要写businessService的get和set方法就可以了,还有一点,action的bean是singleton= "false",即每次新建一个实例,这也解决了Struts中Action的线程同步问题,具体过程是当用户做“/aAction”的HTTP请求(当 然应该是“/aAction.do”),Struts会找到这个Action的对应类 org.springframework.web.struts.DelegatingActionProxy, DelegatingActionProxy是个代理类,它会去找action-servlet.xml文件中“/aAction”对应的真正实现类,然 后把它实例化,同时把需要的业务对象注入,然后执行Action的execute方法。 

使用了ContextLoaderPlugIn,在struts-config.xml中变成类似这样配置 
xml 代码
 
  1. <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">   
  2. <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml" />   
  3. </plug-in>   

而在web.xml中不再需要ContextLoaderListener或是ContextLoaderServlet。 

说 到这里不知道大家会不会有这样的问题,如果使用ContextLoaderPlugIn,如果我们有些程序是脱离Struts的Action环境,我们怎 么处理,比如我们要自定义标记库,在标记库中,我们需要调用Spring管理的业务层逻辑对象,这时候我们就很麻烦,因为只有在action中动态注入业 务逻辑,其他我们似乎不能取得Spring的WebApplicationContext。 

别急,我们还是来看一下 ContextLoaderPlugIn的源码(源码不再贴出),我们可以发现,原来ContextLoaderPlugIn仍然是把 WebApplicationContext放在ServletContext中,只是这个KEY不太一样了,这个KEY值为 ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()(具体请查 看源代码),这下好了,我们知道了WebApplicationContext放在哪里,只要我们在Web应用中能够取到ServletContext也 就能取到WebApplicationContext了:) 

Spring是一个很强大的框架,希望大家在使用过程中不断的深入,了解其更多的特性,我在这里抛砖引玉,有什么不对的地方,请大家指出
分享到:
评论
3 楼 robineye 2008-09-05  
好东西。非常感谢!
2 楼 tomyang 2008-08-18  
好。不错  我看了有用让我明白不好东西
1 楼 darchen 2007-07-05  
本人学习,网上摘录

相关推荐

    三、Spring源码分析——ApplicationContext

    ApplicationContext是Spring框架中的核心组件之一,它是Bean工厂的高级形式,提供了更多企业级的功能。在这个主题中,我们将深入探讨ApplicationContext的内部机制和关键功能。 ApplicationContext的主要职责是加载...

    Spring中ApplicationContext加载机制

    ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供了多种方式来加载 ApplicationContext。...

    Spring获取ApplicationContext对象工具类的实现方法

    在Spring中,ApplicationContext(应用程序上下文)是容器的核心,负责配置和管理应用中对象的生命周期和依赖关系。在实际开发过程中,经常需要从各个角落获取到这个ApplicationContext对象,以便于能够使用Spring...

    Spring中ApplicationContext和beanfactory区别.rar

    然而,BeanFactory缺乏一些高级功能,如国际化支持(i18n)、事件传播、AOP代理以及对Spring的其他核心模块如MessageSource、ApplicationEvent等的集成。因此,对于大型复杂的应用,BeanFactory可能显得不够用。 ...

    Spring核心jar包

    "Spring核心jar包"是Spring框架的基础,包含了实现Spring核心功能的所有类和接口。本文将深入探讨Spring核心jar包中的关键概念和技术。 1. **IoC(控制反转)与DI(依赖注入)** Spring的核心特性之一是IoC...

    spring为ApplicationContext提供的3种实现分别为:ClassPathXmlApplicationContext

    总的来说,ApplicationContext 是 Spring 框架的核心组件,它通过不同的实现方式满足不同场景下的需求。理解并熟练掌握各种 ApplicationContext 的使用,能帮助开发者更有效地利用 Spring 框架构建和管理应用。在...

    spring 获得applicationcontext公用方法

    综上所述,`Spring 获得applicationcontext公用方法`涉及了Spring框架中的核心概念,包括`ApplicationContext`的创建、获取以及在实际项目中的使用方式。通过`MyApplicationContextUtil`这样的静态工具类,我们可以...

    Spring核心技术文档

    综上所述,"Spring核心技术文档"包含了Spring框架的关键概念和技术,是学习和掌握Spring的宝贵资源。通过深入阅读和实践,开发者可以有效地提升在企业级Java应用开发中的技能。"E书说明.txt"可能是关于如何使用或...

    spring3.0 + Quartz1.52 + applicationContext.xml

    首先,`applicationContext.xml`是Spring框架的核心配置文件,它定义了Bean的定义、依赖注入关系以及服务的配置。在这个特定的场景中,`applicationContext.xml`将包含与Quartz相关的配置,如Scheduler、Job、...

    Spring 5.2.9的IOC核心jar包

    `ApplicationContext`是Spring的IoC容器接口,它是访问Bean的主要入口点。`BeanFactory`是更基础的容器接口,提供更底层的控制。`BeanDefinition`则存储了Bean的配置信息。 **源码分析** 对于学习和理解Spring框架...

    day38 05-Spring的BeanFactory与ApplicationContext区别

    通过学习这些资料,你可以更深入地了解Spring框架的核心原理,从而更好地在项目中运用Spring进行开发。 总的来说,BeanFactory和ApplicationContext是Spring框架中两种不同级别的bean管理工具。BeanFactory是基础,...

    spring的核心思想

    #### 四、Spring的核心组件——BeanFactory与ApplicationContext 1. **BeanFactory**:它是Spring框架中最基本的容器接口,负责创建和管理Bean实例。BeanFactory通过工厂模式为应用程序提供服务,允许应用程序请求...

    达内it培训 java培训电子书 内部资料 系列12 SPRING核心 pdf

    《Spring核心》是Java开发领域中的重要学习资源,尤其对于参加达内IT培训的学员而言,这份内部资料具有极高的价值。Spring框架是Java企业级应用开发的基石,它的核心特性包括依赖注入(Dependency Injection,DI)、...

    Spring核心学习IOC部分

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...

    Spring 2.5-applicationContext.xml提示信息的配置

    在Spring框架中,`applicationContext.xml`是应用上下文的核心配置文件,用于定义bean的创建、依赖关系以及各种服务的配置。这篇博文“Spring 2.5 - applicationContext.xml提示信息的配置”主要探讨了如何在Spring ...

    spring 4.3.4核心开发包

    《Spring 4.3.4核心开发包详解》 Spring框架是Java开发中不可或缺的一部分,其4.3.4版本是2016年12月7日发布的最新GA(General Availability)版本,旨在提供稳定且高效的企业级应用支持。这个核心开发包包含了构建...

    Spring核心源码

    Spring Core是Spring框架的基础部分,它包含了Spring的核心组件和基本功能。在深入研究Spring Core的源码之前,我们需要理解一些基本概念和设计原则。 1. **依赖注入(Dependency Injection, DI)**:这是Spring...

Global site tag (gtag.js) - Google Analytics