Spring在web项目中的ContextLoaderListener和RequestContextListener

本文介绍了Spring的ContextLoaderListener、RequestContextListener和ServletContextListener的定义与作用,阐述了Spring IOC容器实例化bean的多种作用域,如单例、多例、request、session等。还说明了在bean需要request、session或globalsession支持时,配置RequestContextListener的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContextLoaderListener

1.定义 继承于 ContextLoader 实现 ServletContextListener

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {
    public ContextLoaderListener() {
    }

    public ContextLoaderListener(WebApplicationContext context) {
        super(context);
    }

    public void contextInitialized(ServletContextEvent event) {
        this.initWebApplicationContext(event.getServletContext());
    }

    public void contextDestroyed(ServletContextEvent event) {
        this.closeWebApplicationContext(event.getServletContext());
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

2.作用: 将Web容器与spring容器整合

RequestContextListener

1.定义

public class RequestContextListener implements ServletRequestListener {
    private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";

    public RequestContextListener() {
    }

    public void requestInitialized(ServletRequestEvent requestEvent) {
        if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
            throw new IllegalArgumentException("Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
        } else {
            HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
            ServletRequestAttributes attributes = new ServletRequestAttributes(request);
            request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
            LocaleContextHolder.setLocale(request.getLocale());
            RequestContextHolder.setRequestAttributes(attributes);
        }
    }

    public void requestDestroyed(ServletRequestEvent requestEvent) {
        ServletRequestAttributes attributes = null;
        Object reqAttr = requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
        if (reqAttr instanceof ServletRequestAttributes) {
            attributes = (ServletRequestAttributes)reqAttr;
        }

        RequestAttributes threadAttributes = RequestContextHolder.getRequestAttributes();
        if (threadAttributes != null) {
            LocaleContextHolder.resetLocaleContext();
            RequestContextHolder.resetRequestAttributes();
            if (attributes == null && threadAttributes instanceof ServletRequestAttributes) {
                attributes = (ServletRequestAttributes)threadAttributes;
            }
        }

        if (attributes != null) {
            attributes.requestCompleted();
        }

    }
}

2.作用: 将Spring容器与Web容器结合的更加密切

3.在web.xml中需要配置

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

4.spring配置文件声明: 多个配置文件可以用 ","分隔

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
</context-param>

 

 

 

ServletContextListener 

1.定义 集成于 ExentListener 

public interface ServletContextListener extends EventListener {
    void contextInitialized(ServletContextEvent var1);

    void contextDestroyed(ServletContextEvent var1);
}

2..作用: 只负责监听web容器的启动和关闭的事件

 

Spring IOC容器实例化bean的作用域:

1.spring2.0后可以使用 sope="作用域类型"来指定作用域

2.作用域类型

  • singleton 单例: 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在.
  • prototype 多例: 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作.
  • request 每次http请求都会创建一个新的bean
    • 该作用域仅适用于webApplicationContext环境
  • session 同一个http session共享一个bean
    • 不同HTTP session使用不同的Bean,该作用域仅适用于webApplicationContext环境。
  • globalSession 同一个全局session共享一个bean
    • 一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境。

 

3.示例: 默认即是singleton

<bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>

4.设置lazy-init属性

  1. 作用: 在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中。虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题。其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率
  2. 示例:
<bean id="bean1" class="com.demo.scope.Student" lazy-init="true"></bean>

为何在bean中需要request,session或者globalsession的支持的时候需要配置RequestContextListener

1.说明

在整合spring容器时使用ContextLoaderListener,它实现了ServletContextListener监听器接口,

注意: ServletContextListener只负责监听web容器启动和关闭的事件

RequestContextListener实现ServletRequestListener监听器接口,

注意: 该监听器监听HTTP请求事件,web服务器接收的每一次请求都会通知该监听器

2.所以

spring容器启动和关闭操作由web容器的启动和关闭事件触发,但如果spring容器中的Bean需要request,session,globalsession作用域的支持,spring容器本身就必须获得web容器的HTTP请求事件,以HTTP请求的事件”驱动”Bean作用域的控制逻辑
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值