spring项目中监听器作用-ContextLoaderListener(转)

spring框架的启动入口 ContextLoaderListener

2 作用:在启动Web 容器时,自动装配Spring applicationContext.xml 的配置信息。

因为它实现了ServletContextListener这个接口,在web.xml 配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener 中关联了ContextLoader 这个类,所以整个加载配置过程由ContextLoader 来完成

pring 在 web 下的入口在配置文件 web.xml 的监听器中

< listener >

< listener-class >

org.springframework.web.context.ContextLoaderListener

</ listener-class >

</ listener >

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:conf/spring/applicationContext.xml</param-value>

</context-param>

上述是在web.xml 中的配置信息。

// 实现了接口 ServletContextListener, 也就是说他必须实现 contextDestroyed, contextInitialized 这两个方法

public class ContextLoaderListener implements ServletContextListener {

private ContextLoader contextLoader;

/**

* Initialize the root web application context.

*/

//Spring 框架由此启动 , contextInitialized 也就是监听器类的 main 入口函数

public void contextInitialized (ServletContextEvent event) {

this.contextLoader = createContextLoader();

this.contextLoader.initWebApplicationContext(event.getServletContext());

}

/**

* Create the ContextLoader to use. Can be overridden in subclasses.

* @return the new ContextLoader

*/

protected ContextLoader createContextLoader() {

return new ContextLoader();

}

/**

* Return the ContextLoader used by this listener.

* @return the current ContextLoader

*/

public ContextLoader getContextLoader() {

return this.contextLoader;

}

/**

* Close the root web application context.

*/

public void contextDestroyed (ServletContextEvent event) {

if (this.contextLoader != null) {

this.contextLoader.closeWebApplicationContext(event.getServletContext());

}

}

}

总的来说这个入口非常简单 , 所有实现都隐藏在 ContextLoader 类里 , 我们在下一篇的内容中讨论ContextLoader, 如果你不知道为什么这里是程序的入口 , 那么复习一下 ServletContextListener 接口和监听器的相关知识吧

ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context ,被Web 应用内的各个程序共享。因为Context 可以用来保存资源并且共享,所以我所知道的ServletContext 的最大应用是Web 缓存---- 把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O 了。

ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

在JSP 文件中,application 是 ServletContext 的实例,由JSP 容器默认创建。Servlet 中调用getServletContext() 方法得到 ServletContext 的实例。

我们使用缓存的思路大概是:

1. 服务器启动时,ServletContextListener 的 contextInitialized() 方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute() 方法将缓存类保存在ServletContext 的实例中。

2. 程序使用 ServletContext.getAttribute() 读取缓存。如果是 JSP ,使用a pplication.getAttribute() 。如果是Servlet ,使用 getServletContext().getAttribute() 。如果缓存发生变化( 如访问计数) ,你可以同时更改缓存和文件/ 数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。

3. 服务器将要关闭时,ServletContextListener 的 contextDestroyed() 方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。

Java 代码

  1. import User; //my own
  2. classimport DatabaseManager; // my own class
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletContextListener;
  5. public class MyContextListener  implements ServletContextListener {
  6. private ServletContext context = null;
  7. public void contextInitialized(ServletContextEvent event) {
  8. context = event.getServletContext();
  9. User user = DatabaseManager.getUserById(1);
  10. context.setAttribute("user1", user);
  11. }
  12. public void contextDestroyed(ServletContextEvent event) {
  13. User user = (User)context.getAttribute("user1");
  14. DatabaseManager.updateUserData(user);
  15. this.context = null;
  16. }
  17. }

import User; //my own

classimport DatabaseManager; // my own class

import javax.servlet.ServletContext;

import javax.servlet.ServletContextListener;

public class MyContextListener  implements ServletContextListener {

private ServletContext context = null;

public void contextInitialized(ServletContextEvent event) {

context = event.getServletContext();

User user = DatabaseManager.getUserById(1);

context.setAttribute("user1", user);

}

public void contextDestroyed(ServletContextEvent event) {

User user = (User)context.getAttribute("user1");

DatabaseManager.updateUserData(user);

this.context = null;

}

}

布署 ServletContextListener

你实现(implements) 了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes 目录下,更改WEB-INF 目录下的 web.xml 文件,在web-app 节点里添加

<listener>

<listener-class>MyServletContextListener</listener-class>

</listener>

如果想更加深入了解,请阅读这篇文章  http://blog.csdn.net/ysughw/article/details/8992322

不让转载,发个链接

时间: 2024-10-05 03:23:30

spring项目中监听器作用-ContextLoaderListener(转)的相关文章

spring项目中监听器作用-ContextLoaderListener(项目启动时,加载一些东西到缓存中)

作用:在启动Web容器时,自动装配Spring applicationContext.xml的配置信息. 因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法.在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成 pring在web下的入口在配置文件web.xml的监听器中 <listener> <listener-cl

java web项目(spring项目)中集成webservice ,实现对外开放接口

什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring兼容性较好的cxf来实现 cxf 的  jar下载地址: http://cxf.apache.org/download.html 选择zip格式下载,解压后的lib目录下的jar 需要最少的jar如下: cxf-2.3.3.jargeronimo-annotation_1.0_spec-1.1.1.

使用junit4测试spring项目中service方法

使用junit4测试项目中service方法 1 import java.util.HashMap; 2 import java.util.List; 3 import java.util.Map; 4 5 import javax.annotation.Resource; 6 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.springframework.test.context.ContextC

SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用

摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人"miiboo"中的大部分程序也采用ROS进行开发,所以本文就重点对ROS基础知识进行详细的讲解,给不熟悉ROS的朋友起到一个抛砖引玉的作用.本章节主要内容: 1.ROS是什么 2.ROS系统整体架构 3.在ubuntu16.04中安装ROS kinetic 4.如何编写ROS的第一个程序hello_world 5.编写简单的消息发布器和订阅器 6.编写简单的s

在spring项目中,普通类注入获取Bean,实现ApplicationContextAware接口

在平时spring项目中,某个不能注入Bean的项目中要获取Bean. @Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; public SpringUtil() { } public void setApplicationContext(ApplicationContext arg0

在Spring项目中使用@Scheduled注解定义简单定时任务

如题所示,有时候我们需要在Web项目中配置简单的定时任务,而且因为任务并不复杂不想使用定时调度框架(PS:Quartz.ActiveMQ .Kafka等),这时就可以考虑使用@Scheduled注解来定义简单的定时任务.其全部配置如下: (1)在Spring的配置文件中添加定时任务相关配置: xml配置的头文件中添加: xmlns:task="http://www.springframework.org/schema/task" 以及在xsi:schemaLocation中添加: ht

Spring项目中Properties不能加载多个的问题

A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: A模块 A模块的Spring配置文件如下: Xml代码   <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSch

Androidmanifest.xml在Android项目中的作用

以下是一个项目中的AndroidManifest.xml文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tw.suggest"                                //指定项目中的程序文件的包

服务器在我们项目中的作用以及我对服务器的看法。。。

随着项目的一步步进行,在开始阶段觉得把各个部分单独实现,然后在综合实现就能够完成,但是随着不断的进行改动,我发现将会出现更多的困难,我们团队已经将框架,信息显示,数据库等部分差不多都弄得差不多的时候, 我们团队开始在考虑如何利用网络来进行信息传递,这应该是我们这个项目中最为重要的一部分了,但是由于本阶段我们的知识还不足以能够将信息传送出去和接收,这里是一个麻烦点,现在我们再考虑是否进行服务器的搭建,若是 能够构建一个服务器,那么我们的这个难题应该能够解决掉.在信息传递的过程中,我们需要一个数据库