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

作用:在启动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这两个方法

publicclass ContextLoaderListener implements ServletContextListener{

privateContextLoader contextLoader;

/**

*Initialize the root web application context.

*/

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

publicvoid contextInitialized(ServletContextEvent event) {

this.contextLoader = createContextLoader();

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

}

/**

* Createthe ContextLoader to use. Can be overridden in subclasses.

* @returnthe new ContextLoader

*/

protectedContextLoader createContextLoader() {

return new ContextLoader();

}

/**

* Returnthe ContextLoader used by this listener.

* @returnthe current ContextLoader

*/

publicContextLoader getContextLoader() {

return this.contextLoader;

}

/**

* Closethe root web application context.

*/

publicvoid 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

importjavax.servlet.ServletContext;

importjavax.servlet.ServletContextListener;

public classMyContextListener  implementsServletContextListener {

private ServletContext context = null;

public voidcontextInitialized(ServletContextEvent event) {

context =event.getServletContext();

User user =DatabaseManager.getUserById(1);

context.setAttribute("user1", user);

}

public voidcontextDestroyed(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>

----------------------------------------在不同的情况下获取数据-----------------------------------------

spring  task定时器类中:

   实现ApplicationContextAware接口
   public class  a implements ServletContextAware {
           private ServletContext servletContext;

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

    public void b() {
servletContext.getAttribute("uid")
     }}

controller 类中:
   ServletContext servletContext=request.getSession().getServletContext();
  servletContext.getAttribute("uid");

java普通类中:

只能从controller 传 servletContext或者仿照task类的方式

时间: 2024-10-26 13:18:04

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

如何在tomcat启动时加载一个类

Tomcat启动时classloader加载顺序 Tomcat的class加载的优先顺序一览   1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件.   2.环境变量CLASSPATH中的jar和class文件.   3.$CATALINA_HOME/common/classes下的class文件.   4.$CATALINA_HOME/commons/endorsed下的jar文件.   5.$CATALINA_HOME/commons/i18n下的jar文件.   6.

Servlet在启动时加载的tomcat源码(原创)

tomcat 8.0.36 知识点: 通过配置loadOnStartup可以设置Servlet是否在Tomcat启动时加载,以及按值大小进行有序加载,其最小有效值为0,最大有效值为Integer.MAX_VALUE. Jsp Servlet的类是org.apache.jasper.servlet.JspServlet. Jsp Servlet是强制性启动时加载,其loadOnStartup的默认值,或其值是失效值时,将使用最大有效值. 通过配置Context或Host的failCtxIfServ

ElasticSearch 启动时加载 Analyzer 源码分析

ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档介绍.ElasticSearch6.3.2源码中相关类:AnalysisModule.AnalysisPlugin.AnalyzerProvider.各种Tokenizer类和它们对应的TokenizerFactory.另外还参考了一个具体的基于ElasticSearch采用HanLP进行中文分词的

设置程序启动时加载的storyboard

这个设置表明:程序启动时会加载Main.storyboard

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

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

bash启动时加载配置文件过程

本文目录: 1.1 判断是否交互式.是否登录式 1.2 几种常见的bash启动方式 1.3 加载bash环境配置文件 当用户登录系统时,会加载各种bash配置文件,还会设置或清空一系列变量,有时还会执行一些自定义的命令.这些行为都算是启动bash时的过程. 另外,有些时候登录系统是可以交互的(如正常登录系统),有些时候是无交互的(如执行一个脚本),因此总的来说bash启动类型可分为交互式shell和非交互式shell.更细分一层,交互式shell还分为交互式的登录shell和交互式非登录shel

Tomcat(一):Tomcat启动时加载web.xml

server.xml配置文件样例: <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional inf

VS2010调试程序启动时加载程序非常慢的

在win7上使用VS2010编译某程序无误后,然后以release态并可输出调试信息时调试程序.console窗口也出现了,但是加载相关信息是特别慢.并出现如下信息: win32.exe': Loaded 'C:\Windows\System32\msvcr100d.dll', Symbols loaded. 'win32.exe': Loaded 'C:\Windows\System32\imm32.dll', Cannot find or open the PDB file 'win32.e

应用程序程序启动时加载广告 ---ios

app 在启动的时候会加载启动图片,我们怎么样去做一个广告页面呢? 思路:在启动完毕后,创建一个加载广告的控制器,然后等广告结束后,我们在去加载主框架内容 如图: 首先我们先创建一个AD的控制器 @interface ABADViewController () @property (weak, nonatomic) IBOutlet UIButton *ADJumpBtn; //跳过 按钮 @property (weak, nonatomic) IBOutlet UIImageView *ADI