两种启动监听器

微信公众号:程序员的猫

此公众号中内容为本人学习笔记 。问题或建议,请公众号留言;

一般在项目初始化的时候总会有些初始化操作,比如读取配置文件、初始化线程池、初始化数据字典、功能点扫描注册等等。毫无疑问这些需要通过监听器来实现。什么是监听器?通俗来讲,就是你(监听器)的全部注意力都在女神(被监听对象)身上,一旦女神抬头或者其他动作,你就本能的做出相应反应。

下面介绍两种常用的项目启动监听器: ServletContextListener & ApplicationListener

首先我们先分析一下被监听者ServletContext和Application;

ServletContext都很清楚,他是 javaweb开发中Servlet三大域对象之一(request、session、ServletContext(application))。ServletContext在服务器启动时创建,在服务器关闭时销毁。保存着服务器中的全局信息。在这里也出现了一个application,这个application是一个jsp中的对象,其本质上就是ServletContext,并不是本文所讨论的Application。

Application是一个spring中的概念。准确的说应该称他ApplicationContext接口;你可以理解ApplicationContext就是spring的身躯,整个spring都是在ApplicationContext的框架下构建。

实现ServletContextListener需要实现以下两个方法,第一个是初始化时调用,第二个是销毁时调用。

实现ApplicationListener需要实现以下一个方法。

但是,每一个实现类都需要有一个监听的事件类型,事件类型有如下四种。启动监听一般会选择ContextRefreshedEvent,当spring容器初始化或刷新时,会触发此事件。

下面来介绍以下启动流程:

整个项目启动之初,web容器最先构建,接着就会创建ServletContext,ServletContext读取 节点数据,触发ServletContextEvent事件。ServletContextListener监听到了这个事件。调用contextInitialized()方法。spring中 ContextLoaderListener 继承ContextLoader并实现ServletContextListener,所以spring中也会监听到web容器启动了。

如下就是spring监听后的动作。其实就是将web容器中的servletContext传递到spring的容器中,生成了WebApplicationContext,所以Application也和servletContext类似,只不过Application是依赖于spring的。

根据上面的流程,不知道你们发现一个问题没有?ServletContext创建完成时spring容器并没有创建,所以无法直接注入bean。那么使用ServletContextListener做启动监听岂不是无法使用spring容器的内容。当然有解决办法啦比如:

通过context就可以得到spring容器中的bean了。

最后在说一下SpringBoot中如何创建这两类监听器

1、创建ServletContextListener

添加 @webListener 注解,同时在启动类上添加 @ServletComponentScan("Listener所在包")

2、创建ApplicationListener

添加 @component 注解

以上

欢迎关注,源于技术,不止技术

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181112G1HUJ000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券