微信公众号:程序员的猫
此公众号中内容为本人学习笔记 。问题或建议,请公众号留言;
一般在项目初始化的时候总会有些初始化操作,比如读取配置文件、初始化线程池、初始化数据字典、功能点扫描注册等等。毫无疑问这些需要通过监听器来实现。什么是监听器?通俗来讲,就是你(监听器)的全部注意力都在女神(被监听对象)身上,一旦女神抬头或者其他动作,你就本能的做出相应反应。
下面介绍两种常用的项目启动监听器: 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 注解
以上
欢迎关注,源于技术,不止技术
领取专属 10元无门槛券
私享最新 技术干货