你会配置SpringBoot的Filter、Servlet、Listener 吗?

前言

Spring Framework有一个核心控制器 - DispatcherServlet,其配置在web.xml文件中的。它将拦截匹配(自己定义拦截匹配规则)到的请求,依据相应的规则分发到目标Controller来处理。现在我们先回想下Filter、Servlet、Listener、Interceptor在Spring Framework是如何配置和先后的执行顺序?

一般情况下,用户通过浏览器发起Request请求进入服务器后处理顺序如下:

你会配置SpringBoot的Filter、Servlet、Listener 吗?

在讲解SpringBoot中如何配置Servelt、Filter、Listener之前,我们先来回顾下它们在Spring Framework如何配置的?这里不再讲解它们的用法。

一、Servlet 2.5配置Servlet、Filter、Listener

配置web.xml

你会配置SpringBoot的Filter、Servlet、Listener 吗?

二、Servlet 3.0配置Servlet、Filter、Listener

我们知道在Servlet3.0新特性中提供动态注册和注解@WebServlet 、@WebListener、@WebFilter,在不配置web.xml时仍可以注册Servlet、Filter、Listener。

1、通过动态注册配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

2、通过注解配置

Servlet配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

Filter配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

注:

Servlet3规范不支持注解Filter的配置执行顺序,这里指的配置执行顺序就像web.xml中定义的顺序。

其实可以采用非常不优雅的方式控制Filer的执行顺序,即通过控制filter的文件名来控制。如果不采用此种方式我们仍需在web.xml中定义,web.xml中定义的的顺序就是他们的执行顺序。

你会配置SpringBoot的Filter、Servlet、Listener 吗?

Listener配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

使用注解配置Servlet、Filter、Listener,是不是清爽了很多。@WebServlet 、@WebListener、@WebFilter可以完全代替web.xml中的配置。

三、SpringBoot配置Servlet、Filter、Listener

Spring Boot集成了servlet容器,当我们在pom文件中增加spring-boot-starter-web的maven依赖时,不做任何web相关的配置便能提供web服务,这还得归于Spring Boot自动配置的功能(因为加了EnableAutoConfiguration的注解),帮我们创建了一堆默认的配置,以前在web.xml中配置,现在都可以通过spring bean的方式和注解进行配置,由Spring来进行生命周期的管理,大多数情况下,我们需要重载这些配置,如:修改服务的启动端口,contextpath,filter,listener,

servlet,session超时时间等。

Spring Boot提供了ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean

和@WebServlet、@WebFilter、@WebListener三种类型分别配置应用的Servlet、Filter、Listener。

1、通过@Component让Spring扫描配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

2、通过@Configuration和@Bean来配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

3、通过@Configuration和@Bean和FilterRegistrationBean更灵活的配置

你会配置SpringBoot的Filter、Servlet、Listener 吗?

4、通过@ServletComponentScan自动扫描@WebServlet, @WebFilter, @WebListener

你会配置SpringBoot的Filter、Servlet、Listener 吗?

Spring Boot中,Filter、Listener、Interceptor执行顺序即时定义@Order(注解表示执行过滤顺序,值越小,越先执行),仍无效。执行顺序的规则和Servlet3.0是一致的。

四、扩展

SpringBoot在使用SpringMVC的时候不需要配置DispatcherServlet,因为SpringBoot已经自动配置了。如果我们想要加一些初始配置参数如何解决?方案如下:

你会配置SpringBoot的Filter、Servlet、Listener 吗?

可以通过注入DispatcherServlet,然后用ServletRegistrationBean包裹一层 动态的加上一些初始参数。

五、总结

SpringBoot集中注册方案效果都是一样,在内部SpringBoot的实现上是无差别的,即使使用的是Servlet3.0注解,也是通过扫描注解转换成这三种bean的FilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean。

Servlet、Filter或Listener注册成Spring Bean,由于这三者与容器有关,它们不会被延迟初始化!Servlet、Filter、Listener可以使用ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean来设置初始化参数和映射路径。


分享到:


相關文章: