`

Spring中ServletContextAware接口使用理解

阅读更多

spring中,凡是实现ServletContextAware接口的类,都可以取得ServletContext。实现如下: 

1
2
3
4
private ServletContext application;
public void setServletContext(ServletContext servletContext) {  
    this.application = servletContext;  
}

那么Spring是在什么时候把ServletContext放置进去的呢?通过对Spring的学习,终于明白了。 

在web项目中,Spring容器的加载是通过XmlWebApplicationContext进行的。 

它的父类AbstractRefreshableWebApplicationContext,在postProcessBeanFactory方法中进行了如下操作(postProcessBeanFactory方法被AbstractApplicationContext的refresh方法调用) 

1
2
3
4
5
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方法如下: 

1
2
3
4
5
6
7
8
9
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。

 

XML文件中通过bean标签初始化,可以初始化相应数据:

<bean id="initBean" class="com.*.init.initBean"/>

 

分享到:
评论

相关推荐

    spring-web-2.5.jar

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

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

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

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

    `WebMvcAutoConfiguration`类中包含一个内部静态类`WebMvcAutoConfigurationAdapter`,实现了`WebMvcConfigurer`接口,这是Spring MVC用于自定义MVC行为的接口。`WebMvcAutoConfigurationAdapter`还实现了`...

    spring-mvc jar包大全

    这个"spring-mvc jar包大全"包含了所有你需要在 Java EE 环境下进行 Web 开发时,使用 Spring MVC 所需的库文件。下面将详细解释这些 jar 包及其在 Spring MVC 开发中的作用。 1. **spring-webmvc.jar**:这是 ...

    spring配置扫描多个包问题解析

    Spring 配置扫描多个包问题解析 Spring 框架中,配置扫描多个包是非常常见的需求,特别是在大型项目中,为了方便管理和维护...通过本文,我们可以更好地理解 Spring 框架中的配置扫描机制,并更好地应用于实际项目中。

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

    SSH框架部分常见面试题.pdf 本文将对 SSH 框架部分常见面试题进行详细的解释...面向过程的编程是编程的基本方式,面向对象的编程是使用对象来编程,面向接口的编程是使用接口来编程,面向切面的编程是使用切面来编程。

    SPRING API 2.0.CHM

    All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....

    dwr推模式学习资料

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

    struts2之Action访问Servlet API

    这些方法可以在 Action 中使用,以访问 Servlet API。 Struts2 框架提供了多种方式来访问 Servlet API,包括使用 ActionContext 类、实现接口和使用 ServletActionContext 类等。开发人员可以根据实际情况选择合适...

    strurts2 上传

    然而,需要注意的是,随着技术的发展,Struts2现在可能已经过时,许多现代Web应用倾向于使用Spring Boot等更现代的框架来处理文件上传。尽管如此,理解Struts2的文件上传机制仍然对理解MVC框架的工作原理和文件上传...

    struts,ajax,json

    3. 在struts.xml文件中使用标签修改配置参数。 在比较Struts 1和Struts 2框架时,我们可以发现底层实现机制的不同:Struts 1采用JSP和Servlet实现,而Struts 2采用Interceptor实现。在业务逻辑Action方面,Struts 1...

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

    - 在result的配置中使用OGNL表达式 #### 案例描述 - **登录页面实现:** 成功登录后跳转到主页面,失败则留在登录页面并提示错误信息。 - **技术细节:** 实现该案例时需要注意Action的配置、Session的使用、参数...

    Struts2访问Servlet的三种方式

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

    struts2 笔记

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

    struts2单个和多个上传文件

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

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

    - 在Action类中实现`Preparable`接口。 - 重写`prepare()`方法,在该方法中进行数据准备或其他预处理操作。 - 示例代码: ```java public class XxxAction extends ActionSupport implements Preparable { @...

    servlet

    8. **Dispatcher Servlet**:在Spring MVC等框架中,`DispatcherServlet`作为前端控制器,负责分发请求到相应的处理器,实现了MVC模式。 9. **JSP(JavaServer Pages)与Servlet的关系**:JSP是动态网页技术,它的...

    Struts2访问servlet分享

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

Global site tag (gtag.js) - Google Analytics