`

ServletContextAware接口

阅读更多
在Spring中,凡是实现ServletContextAware接口的类,都可以取得ServletContext.
实现如下:

    private ServletContext application;

    public void setServletContext(ServletContext servletContext) {
        this.application = servletContext;
    }


那么Spring是在什么时候把ServletContext放置进去的呢。

通过对Spring的学习,终于明白了。

在web项目中,Spring容器的加载是通过XmlWebApplicationContext进行的。
它的父类AbstractRefreshableWebApplicationContext,在postProcessBeanFactory方法中进行了如下操作(postProcessBeanFactory方法被AbstractApplicationContext的refresh方法调用)

		beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext, this.servletConfig));
		beanFactory.ignoreDependencyInterface(ServletContextAware.class);
		beanFactory.ignoreDependencyInterface(ServletConfigAware.class);

		WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
		WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);


代码的第一句就是添加了一个ServletContextAwareProcessor。
该类的postProcessBeforeInitialization方法如下:
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (this.servletContext != null && bean instanceof ServletContextAware) {
			((ServletContextAware) bean).setServletContext(this.servletContext);
		}
		if (this.servletConfig != null && bean instanceof ServletConfigAware) {
			((ServletConfigAware) bean).setServletConfig(this.servletConfig);
		}
		return bean;
	}


而所有的BeanPostProcessor都将在AbstractAutowireCapableBeanFactory类的initializeBean方法中,通过调用applyBeanPostProcessorsBeforeInitialization方法完成所有实现BeanPostProcessor接口的postProcessBeforeInitialization的调用。

XmlWebApplicationContext使用的BeanFactory是DefaultListableBeanFactory。
DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory,因此可以完成上述操作。

如此完成了只要实现了ServletContextAware接口的,都可以获取ServletContext
分享到:
评论

相关推荐

    SSH框架部分常见面试题.pdf

    实现 ServletRequestAware、ServletContextAware 接口。 Result 类型 Struts2 的 Result 类型有四种:Dispatcher、Redirect、Chain、RedirectAction。Dispatcher 跳转到 URL,通常是 JSP 服务器端;Redirect ...

    特殊情况(ActionForm,Servlet, Filter, Listener)下Spring如何注入对象

    2. **Filter**: 同样,可以在Filter的init()方法中获取ApplicationContext,或者通过ServletContextAware接口,将Spring上下文注册到ServletContext,然后在doFilter()方法中使用。 3. **Listener**: 在监听器的...

    struts,ajax,json

    关于Struts 2的Action如何与Servlet API进行交互,业务逻辑Action可以通过实现ServletRequestAware、ServletResponseAware和ServletContextAware接口来实现。通过这些接口中的setter方法,可以将容器中的request、...

    Struts2访问Servlet的三种方式

    例如,在下面的代码中,ActionTest7 类实现了 ServletRequestAware、ServletResponseAware 和 ServletContextAware 接口,通过这些接口,可以访问 request、response 和 application 对象。 ```java public class ...

    struts2之Action访问Servlet API

    * ServletContextAware : 访问 Web 应用的 ServletContext 实例 * ServletRequestAware : 访问 HttpServletRequest 实例 * ServletResponseAware : 访问 HttpServletResponse 实例 将 Action 实现这些接口,可以...

    Spring静态资源配置原理 2.6.0(csdn)————程序.pdf

    `WebMvcAutoConfigurationAdapter`还实现了`ServletContextAware`接口,以便于访问Servlet上下文,这在处理静态资源时非常有用。 在`WebMvcAutoConfiguration`中,`WebMvcProperties`和`WebProperties`被`@...

    dwr推模式学习资料

    例如,在Spring中配置DWR时,可以创建一个实现了`ServletContextAware`接口的类,并在该类中注入DWR相关的bean。这样,DWR就能够通过Spring管理其bean,并且在需要时能够访问到Spring上下文中的其他bean。 #### 五...

    strurts2 上传

    这个类继承自`ActionSupport`,并实现了`ServletContextAware`接口。`ActionSupport`提供了异常处理和结果返回的基本结构,而`ServletContextAware`允许访问Servlet上下文,以便获取文件存储路径。 3. **字段与方法...

    struts2单个和多个上传文件

    后端Action类通常会定义为`ActionSupport`的子类,并实现`ServletContextAware`接口以便获取`ServletContext`对象,用于获取文件的存储路径。Action类的主要代码如下: ```java public class SingleUploadAction ...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_表单校验失败跳input视图问题共13页.pptx

    implements ServletRequestAware, ServletContextAware, ServletResponseAware, ValidationWorkflowAware { private static final long serialVersionUID = -1040212988363452551L; protected final Logger ...

    达内培训机密资料_struts2_day03(1)

    类似地,还可以实现`ServletRequestAware`、`ServletResponseAware`和`ServletContextAware`等接口来获取更多的请求信息。 #### 配置Action - **使用通配符配置Action:** 通过通配符可以更加灵活地配置Action的...

    struts2 笔记

    此外,Action还可以实现ServletContextAware、ServletRequestAware和ServletResponseAware接口来直接获得Servlet容器中的对象。 Action的高级特性包括动态方法调用,这是Struts2的一个强大功能,允许一个Action处理...

    Struts2访问servlet分享

    可以让Action类实现`ServletRequestAware`、`ServletResponseAware`和`ServletContextAware`接口,Struts框架会在运行时自动注入对应的对象: ```java public class HelloWorldAction implements ...

    servlet

    10. **Servlet 3.0及以上版本的新特性**:包括注解配置、异步处理、微容器(ServletContextAware)等,大大简化了Servlet的开发和部署。 通过这些知识点的学习,开发者可以有效地利用Servlet来构建功能丰富的、可...

    spring-mvc jar包大全

    2. **spring-web.jar**:此 jar 包提供了与 HTTP 请求处理相关的类,如 ServletContextAware、HttpSessionBindingListener 等。它还包含一些基础的 Web 功能,如上传文件的支持。 3. **spring-context.jar**:提供...

    详解Struts2中Action访问Servlet API的几种方法

    1. `ServletContextAware`: 实现此接口的Action可以在初始化时获取到ServletContext实例。 2. `ServletRequestAware`: 实现这个接口的Action可以获取到HttpServletRequest实例,以便直接操作请求数据。 3. `...

Global site tag (gtag.js) - Google Analytics