Spring——窃听器ContextLoaderListener意义转载

原创
小哥 3年前 (2022-12-30) 阅读数 11 #大杂烩

在启动Web 容器时, 自动装配 Spring applicationContext.xml 的配置信息。
因为它实现了 ServletContextListener 此接口,在web.xml 配置这个 监听器 当容器启动时,默认情况下执行它实现的方法。在里面ContextLoaderListener 中 关联了ContextLoader 此类,因此执行整个加载配置过程ContextLoader 来完成

spring在web配置文件下的条目web.xml在听众中


        
           org.springframework.web.context.ContextLoaderListener
        


     contextConfigLocation
      classpath:conf/spring/applicationContext.xml

上述是在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 类里。

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()方法,因此缓存的更改保存在内部。将更改的缓存保存回文件或数据库以更新原始内容。

    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加载项节点

    MyServletContextListener
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除