拦截Spring的监听器ContextLoaderListener与DispatcherServlet,延迟加载spring组件

基本背景

我们在使用SpringMVC框架的时候,一般会配置一下spring的监听器与servlet,然后引用一下依赖,就可以在代码疯狂地去使用各种注解了。最后在启动的时候,spring自己就会去加载各种东西,请求转发之类的。

一般在工程中,我们都会使用各种中间件如数据库,redis等,这些配置我们一般都会提前写在配置文件里面,然后利用spring的功能进行读取和使用了。就拿数据库来说,最起码先得有表吧,表得执行sql呀,好多表的时候我们就得整理一下sql脚本,然后手动连接一下数据库,跑一下相关脚本。一般也只会跑一次,也不会太麻烦之类的。

但是对于一些专属化(客户买了标准产品,然后部署在客户自己的机器上)的产品来说,卖出去的产品中的配置文件里面的数据库配置肯定是错误,肯定需要修改,否则肯定起不来,而且还得客户拿着各种的sql脚本去执行,其实还是相当麻烦的。

那么问题来了,能不能做一个可视化的界面,用户输一下简单的数据库的ip,端口以及账号密码的,然后让产品自动地去执行一下sql,执行完毕以后,直接就可以用了?

答案肯定是有的。

基本方案

  1. 用swing写一个界面,然后跑一下去做这个事情。但是得兼容一下各个操作系统。
  2. 用springMVC写的web工程,如果数据库配置是错误的,根本就起不来。那么就用一个不依赖数据库(或者依赖,但是自带了数据库)的工程A,先跑起来,在A的界面里面去初始化产品的sql,然后同时修改一下配置文件,再启动B。这种情况下,需要依赖于别的工程。
  3. 我自己依赖数据库了,但是我还想自己初始化自己的sql,然后把自己的配置文件改了,重新加载一下,也不用重启,就直接用。这种也可以,本文就是讲解这种方案。

最大问题

springMVC,启动的时候会读取数据源配置,然后获取连接,但是数据库配置是错误,就会启动失败了,失败的情况下,所有的请求全都是404,根本做不了其它事情。

解决方案

那就别让spring加载呗,让它一边呆着去,等我干完事情了,它再去加载。

基本知识

开局提到了一个监听器与servlet,这是使用springMVC最基本的内容。核心类也是这两个。
首先看一下java web里面的一些知识点:
在这里插入图片描述
里面的其它内容不再多说,重点看一下:

  • ServletContextListener
    每一个应用创建或者销毁的时候触发这个监听器,监听的是一个ServletContext。
    这个应用就是tomcat目录下webapp目录下的一个目录。servletContext是和应用一一对应的。
    当web容器加载某个应用的时候触发。
  • servlet
    一个servlet对应了同一类(就看表达式怎么配置了)请求的处理。

spring做了什么

spring利用监听器和servlet做了什么呢?
在这里插入图片描述
监听器做了应用程序的上下文件的初始化。
servlet做了所有请求的一个处理。

spring拦截关键步骤

我们现在要做的就是对上述两个类进行拦截,然后延迟加载。如下图:
在这里插入图片描述
里面提到了4个类,前3个类比较简单,重点是一个过滤器那个类,里面的逻辑会比较复杂。

我们的过滤器做了什么

拦截器里面分为两部分,初始化和过滤。具体判断逻辑如下图,先是初始化的逻辑:
在这里插入图片描述
然后是过滤的逻辑:
在这里插入图片描述

关键几个点

  • spring拦截的目的是为了做一些初始化操作,因此对应也需要一个初始化的界面
  • 明确一下会做哪些事情,比如测试数据源连接,初始化等等,为每一个事情提供一个接口出来,这就是业务逻辑了。
  • 拦截并且延迟加载的关键在于,重写的两个类是为了拦截,而其余的两个类是为了延迟加载。

猜你喜欢

转载自blog.csdn.net/ywg_1994/article/details/100857295
今日推荐