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

【Spring】Spring中WebApplicationContext的研究

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

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</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的配置变成类似下面的样子
<action attribute="aForm" name="aForm" path="/aAction" scope="request" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="forward" path="forward.jsp" />
</action>
注意type变成了org.springframework.web.struts.DelegatingActionProxy,之后我们需要建立action-servlet.xml这样的文件,action-servlet.xml符合Spring的spring-beans.dtd标准,在里面定义类似下面的
<bean name="/aAction" class="com.web.action.Aaction" singleton="false">
<property name="businessService">
<ref bean="businessService"/>
</property>
</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中变成类似这样配置
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml" />
</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是一个很强大的框架,希望大家在使用过程中不断的深入,了解其更多的特性,我在这里抛砖引玉,有什么不对的地方,请大家指出。
分享到:
评论

相关推荐

    在web容器(WebApplicationContext)中获取spring中的bean

    Spring把Bean放在这个容器中,普通的类在需要的时候,直接用getBean()方法取出

    Spring获取webapplicationcontext,applicationcontext几种方法详解

    在 Spring 框架中,获取 WebApplicationContext 和 ApplicationContext 对象是非常重要的,因为它们提供了访问 Spring 容器中的 Bean 对象的入口。下面将详细介绍五种获取 WebApplicationContext 和 ...

    Spring2.5-中文参考手册chm.zip

    6. **Web应用上下文**:Spring 2.5引入了WebApplicationContext,它是ApplicationContext的子类,专门为Web应用设计。它与Servlet容器紧密集成,提供了一种管理Web应用特定Bean的机制。 7. **国际化**:Spring 2.5...

    spring jar 包详解

    - **功能简介**:包含了 Web 应用开发时使用 Spring 框架时所需的核心类,包括自动载入 WebApplicationContext 特性的类、Struts 与 JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。 - **应用场景**:...

    SpringTest_springtest_spring_java_Framework_

    Spring Boot Test则为Spring Boot应用提供了更便捷的测试工具,包括对MockMVC、WebApplicationContext和嵌入式Servlet容器的支持。 "spring"和"java Framework"明确了讨论的焦点是基于Java的Spring框架。Spring框架...

    spring-web-2.5.jar

    org.springframework.web.context.WebApplicationContext.class org.springframework.web.context.request.AbstractRequestAttributes.class org.springframework.web.context.request....

    在自定义spring aop中使用el获取拦截方法的变量值。

    EL的使用需要`WebApplicationContext`,因为EL解析器在Spring MVC环境中是默认启用的。如果在非Web环境下,如简单的Spring Boot应用,我们需要添加`spring-expression`依赖并配置Spring的EL支持。 以下是一个简单的...

    Spring MVC 4.2.4.RELEASE 中文文档

    WebApplicationContext 中特殊的 Bean 类型包括 HandlerMapping、HandlerAdapter、Controller 等,它们是框架用来处理请求的重要组件。 默认的 DispatcherServlet 配置涉及了 Spring 配置文件的设置,说明了如何...

    Spring2.5中文手册

    - Spring WebApplicationContext扩展了普通的ApplicationContext,为Web应用提供了特定的功能,如处理请求参数、session和ServletContext访问等。 这个`Spring2.5中文手册`包含了上述所有概念的详细解释和示例,...

    spring-framework 5 中文 参考手册 中文文档

    而ApplicationContext接口是BeanFactory的子接口,它进一步集成了Spring AOP功能,支持消息资源处理、事件发布以及Web应用程序的特定上下文,例如WebApplicationContext。因此,ApplicationContext在企业级应用程序...

    spring2.0和spring2.5 及以上版本的jar包区别 spring jar 包详解

    11. **spring-web.jar**:为基于Web的应用提供了支持,包括对WebApplicationContext的支持、各种视图技术(如JSP、Freemarker等)的集成。 12. **spring-webmvc.jar**:提供了模型-视图-控制器(Model-View-...

    Spring Web MVC外文翻译

    正式名称“Spring Web MVC”来源于其源模块 `spring-webmvc`,但在实际使用中更常见地被称为“Spring MVC”。 与 Spring Web MVC 并行地,Spring Framework 5.0 引入了响应式栈——一个名为 Spring WebFlux 的 Web ...

    spring-web-5.3.6 jar包.rar

    这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类, 包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 spring的核心类,提供了核心HTTP...

    Spring整合Struts

    ContextLoaderPlugin是Spring为Struts设计的一个插件,它能够加载一个Spring配置文件,该文件指向由ContextLoaderListener加载的根WebApplicationContext作为其父上下文。默认情况下,配置文件的名称是映射的servlet...

    Spring4JAR包、Spring4API,Spring4源码

    Spring框架是Java开发中广泛应用的一个开源框架,它简化了企业级应用的开发工作。Spring4是Spring框架的一个重要版本,对之前的版本进行了诸多改进和优化,尤其在支持Java 8特性和性能提升方面有着显著的变化。本文...

    spring mvc jar包

    在提供的压缩包文件中,包含了 Spring MVC 开发所需的一些核心库,这些库是 Spring MVC 功能实现的基础。 1. `org.springframework.context-3.0.2.RELEASE.jar`:这个库提供了上下文支持,包括应用上下文...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

     这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 (12) spring-webmvc.jar  这个...

    spring源码spring-framework-4.2.5.RELEASE

    10. **Web应用程序上下文**:`org.springframework.web.context`包提供了WebApplicationContext,它是ApplicationContext的子类,专为Web应用设计。 六、源码学习方法 深入理解Spring源码需要对Java反射、动态代理...

    Spring中ApplicationContext加载机制

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

    Spring面试专题及答案.pdf

    Spring框架是一个为Java应用程序提供全面支持的平台,它帮助开发者解决开发过程中遇到的基础性问题,让开发人员能够专注于应用程序的核心逻辑开发。Spring框架的设计非常注重灵活性和可扩展性,采用了许多设计模式,...

Global site tag (gtag.js) - Google Analytics