转自:http://darchen.iteye.com/blog/98129
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传入就可以了。
分享到:
相关推荐
这样,在下面的程序中,就可以直接引用MockHttpServletRequest、MockHttpServletResponse、ServletConfig、ServletConfig、servletContext、ApplicationContext等对象进行操作了。 在PMSTestCase的setUpBeforeClass...
这样的设计使得其他类可以方便地通过`MyApplicationContextUtil.getBean()`方法获取所需的Bean,无需直接与`ApplicationContext`交互。 5. 使用`ApplicationContext`的最佳实践: - 尽量减少在业务代码中直接使用...
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); ``` #### 四、总结 - `ApplicationContext`相比`BeanFactory`提供了更多的高级特性,因此通常推荐在实际开发...
值得注意的是,在Web应用中,通常推荐使用ServletContextListener来初始化ApplicationContext,并将其存储在ServletContext中供整个应用使用。这样可以更加高效和方便地管理ApplicationContext的生命周期,并且能够...
这种方式适合于采用 Spring 框架的 B/S 系统,通过 ServletContext 对象获取 ApplicationContext 对象,然后在通过它获取需要的类实例。需要注意的是,两者的区别是,前者在获取失败时抛出异常,后者返回 null。 在...
例如,`WebApplicationContextUtils.getWebApplicationContext(servletContext)`可以从当前的HTTP请求的Servlet上下文中获取`ApplicationContext`。 选择`ApplicationContext`还是`BeanFactory`主要取决于应用的...
例如,Tomcat的`org.apache.catalina.core.ApplicationContext`就是对ServletContext的实现。通过阅读这些源码,我们可以了解如何在底层实现上述功能,如数据存储、事件监听器的触发等。 ### 工具的使用: 在开发...
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); Object bean = applicationContext.getBean("beanId"); // 获取Bean对象 ``` 6. **SpringMVC...
- 需要在`web.xml`中正确配置`ContextLoaderListener`或`ContextLoaderServlet`来加载Spring配置文件,这样才能在ServletContext中加载ApplicationContext。 3. **避免过度使用**: - 尽管这种方式提供了便利性,...
本文将深入探讨几种常见的获取Spring容器的方法,包括使用`ApplicationContext`、通过`ServletContext`、利用`ApplicationObjectSupport`、`WebApplicationObjectSupport`以及实现`ApplicationContextAware`接口等。...
总结以上方法,从ServletContext获取ApplicationContext是最推荐的方式,因为它避免了重复加载配置文件,且能确保与Spring的依赖注入(Dependency Injection, DI)保持一致。这种方法使得我们的监听器可以利用Spring...
这种方式通常用于 Web 应用程序中,因为它可以从 ServletContext 中获取 ApplicationContext。 例如,我们可以在 web.xml 文件中定义一个 listener,如下所示: ```xml <listener-class>org.springframework.web...
5. **设置ServletContext属性**:创建完ApplicationContext后,`ContextLoaderListener`会将ApplicationContext设置为`ServletContext`的一个属性,以便其他组件通过`ServletContext`获取到ApplicationContext。...
Spring提供了`ContextLoader`和`WebApplicationContextUtils`等工具类,可以从当前线程或ServletContext中获取ApplicationContext。 ```java // 在非Web应用中 ApplicationContext ac = ContextLoader....
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); 6. SpringMVC简介 SpringMVC是一个基于Java的MVC框架,属于SpringFramework的后续产品。它是一...
ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); ``` 其中`servletContext`是`ServletContext`对象,通常可以从Servlet或Filter中获得...
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象...
3. WebApplicationContext:这是Web应用中的ApplicationContext,它与Servlet容器集成,可以访问ServletContext。 三、Bean的生命周期管理 ApplicationContext负责bean的创建、初始化、装配以及销毁。通过XML配置...
ServletContext也是容器,存储了Web应用的各种属性,包括Spring的WebApplicationContext,这样其他Servlet和Filter就能通过ServletContext获取到ApplicationContext,进而访问和操作Bean。 在Struts中,Spring的...
5. 将ApplicationContext绑定到ServletContext:通过`ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE`属性,使得其他Servlet或过滤器能够访问到Spring容器。 整个过程完成后,Spring的配置文件就被加载到了Web应用的环境...