`

ServletContext与ApplicationContext

 
阅读更多
ServletContext,即Servlet环境对象或Servlet容器,包含从容器环境中获得的初始化信息,其内提供的属性和方法在同一web应用下的所有servelt中被使用。每一个web-app只能有一个ServeltContext,web-app可以是一个放置web application文件的文件夹,也可以是一个.war。

    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>   
<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传入就可以了。


查看另外两篇文章帮助理解:
Request、Session、servletContext区别
取WebApplicationContext方法集

分享到:
评论

相关推荐

    java单元测试 spring mock的使用

    这样,在下面的程序中,就可以直接引用MockHttpServletRequest、MockHttpServletResponse、ServletConfig、ServletConfig、servletContext、ApplicationContext等对象进行操作了。 在PMSTestCase的setUpBeforeClass...

    spring 获得applicationcontext公用方法

    这样的设计使得其他类可以方便地通过`MyApplicationContextUtil.getBean()`方法获取所需的Bean,无需直接与`ApplicationContext`交互。 5. 使用`ApplicationContext`的最佳实践: - 尽量减少在业务代码中直接使用...

    ApplicationContext及它的3种实现

    ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); ``` #### 四、总结 - `ApplicationContext`相比`BeanFactory`提供了更多的高级特性,因此通常推荐在实际开发...

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

    值得注意的是,在Web应用中,通常推荐使用ServletContextListener来初始化ApplicationContext,并将其存储在ServletContext中供整个应用使用。这样可以更加高效和方便地管理ApplicationContext的生命周期,并且能够...

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

    这种方式适合于采用 Spring 框架的 B/S 系统,通过 ServletContext 对象获取 ApplicationContext 对象,然后在通过它获取需要的类实例。需要注意的是,两者的区别是,前者在获取失败时抛出异常,后者返回 null。 在...

    ApplicationContext及它的3种实现.docx

    例如,`WebApplicationContextUtils.getWebApplicationContext(servletContext)`可以从当前的HTTP请求的Servlet上下文中获取`ApplicationContext`。 选择`ApplicationContext`还是`BeanFactory`主要取决于应用的...

    35、servlet--servletContext

    例如,Tomcat的`org.apache.catalina.core.ApplicationContext`就是对ServletContext的实现。通过阅读这些源码,我们可以了解如何在底层实现上述功能,如数据存储、事件监听器的触发等。 ### 工具的使用: 在开发...

    Spring与Web环境集成1

    ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); Object bean = applicationContext.getBean("beanId"); // 获取Bean对象 ``` 6. **SpringMVC...

    在action以外的地方获取dao

    - 需要在`web.xml`中正确配置`ContextLoaderListener`或`ContextLoaderServlet`来加载Spring配置文件,这样才能在ServletContext中加载ApplicationContext。 3. **避免过度使用**: - 尽管这种方式提供了便利性,...

    获取spring容器的方法

    本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...

    监听器获取Spring配置文件的方法

    总结以上方法,从ServletContext获取ApplicationContext是最推荐的方式,因为它避免了重复加载配置文件,且能确保与Spring的依赖注入(Dependency Injection, DI)保持一致。这种方法使得我们的监听器可以利用Spring...

    Spring如何获取Bean

    这种方式通常用于 Web 应用程序中,因为它可以从 ServletContext 中获取 ApplicationContext。 例如,我们可以在 web.xml 文件中定义一个 listener,如下所示: ```xml &lt;listener-class&gt;org.springframework.web...

    web.xml中ContextLoaderListener的运行过程解析

    5. **设置ServletContext属性**:创建完ApplicationContext后,`ContextLoaderListener`会将ApplicationContext设置为`ServletContext`的一个属性,以便其他组件通过`ServletContext`获取到ApplicationContext。...

    Java获取Bean的几种方式.pdf

    Spring提供了`ContextLoader`和`WebApplicationContextUtils`等工具类,可以从当前线程或ServletContext中获取ApplicationContext。 ```java // 在非Web应用中 ApplicationContext ac = ContextLoader....

    Spring与Web环境集成.pdf

    ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); 6. SpringMVC简介 SpringMVC是一个基于Java的MVC框架,属于SpringFramework的后续产品。它是一...

    在Eclipse 中创建Spring的 Web应用.doc

    ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); ``` 其中`servletContext`是`ServletContext`对象,通常可以从Servlet或Filter中获得...

    Request&Response编程

    WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象...

    org.springframework.context_3.0.5.release.jar.zip

    3. WebApplicationContext:这是Web应用中的ApplicationContext,它与Servlet容器集成,可以访问ServletContext。 三、Bean的生命周期管理 ApplicationContext负责bean的创建、初始化、装配以及销毁。通过XML配置...

    spring在web.xml中和在struts中的不同配置.[收集].pdf

    ServletContext也是容器,存储了Web应用的各种属性,包括Spring的WebApplicationContext,这样其他Servlet和Filter就能通过ServletContext获取到ApplicationContext,进而访问和操作Bean。 在Struts中,Spring的...

    Spring源码学习七:web应用自动装配Spring配置文件1

    5. 将ApplicationContext绑定到ServletContext:通过`ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE`属性,使得其他Servlet或过滤器能够访问到Spring容器。 整个过程完成后,Spring的配置文件就被加载到了Web应用的环境...

Global site tag (gtag.js) - Google Analytics