SpringBoot配置嵌入式服务器的实操演示

 更新时间:2025年11月19日 10:08:34   作者:春生野草  
文章介绍了Servlet、Filter和Listener在JavaWeb开发中的作用及生命周期,文章详细说明了如何在SpringBoot中注册Servlet、Filter和Listener,并通过实操演示验证了它们的功能,本文给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧

Servlet 三大组件是Java Web开发的核心基础,包括:ServletFilter 和 Listener

Servlet:

  • 用于处理客户端请求并生成动态响应的Java类
  • 运行在服务器端的Java程序

Filter(过滤器):

  • 用于对请求和响应进行预处理和后处理
  • 在请求到达Servlet之前和响应返回客户端之前执行

Listener(监听器):

  • 用于监听Web应用中的事件
  • 当特定事件发生时自动执行回调方法
组件作用生命周期应用场景
Servlet处理请求和生成响应请求-响应业务逻辑处理
Filter请求/响应预处理请求-响应安全检查、日志、编码转换
Listener监听应用事件应用/会话/请求生命周期资源管理、统计、初始化

为什么需要特殊方式注册 Servlet 三大组件?

传统 Java Web 应用(WAR 包部署)通过web.xml配置 Servlet、Filter、Listener:

<!-- 传统web.xml配置Servlet -->
<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

Spring Boot 默认以jar 包方式启动,使用嵌入式 Servlet 容器(如 Tomcat),没有web.xml文件。因此,Spring Boot 提供了通过Java 配置类 + @Bean注解的方式注册三大组件。

 注册方式详解

Spring Boot 通过三个 “注册器类” 包装三大组件,再通过@Bean将注册器注入 Spring 容器,完成组件注册:

组件类型注册器类作用
ServletServletRegistrationBean注册自定义 Servlet,指定访问路径
FilterFilterRegistrationBean注册自定义 Filter,指定过滤的路径
ListenerServletListenerRegistrationBean注册自定义 Listener,监听容器事件

DispatcherServlet 本身就是一个 Servlet,是 Spring MVC 的前端控制器,负责接收所有请求并分发。Spring Boot 在DispatcherServletAutoConfiguration中自动注册它,无需手动配置。

实操演示:注册自定义三大组件

步骤 1:创建自定义 Servlet、Filter、Listener

// 1. 自定义Servlet:处理请求
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.getWriter().write("Hello MyServlet!"); // 响应内容
        System.out.println("MyServlet处理了GET请求");
    }
}
// 2. 自定义Filter:过滤请求
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter执行前");
        chain.doFilter(request, response); // 放行请求
        System.out.println("MyFilter执行后");
    }
}
// 3. 自定义Listener:监听Servlet容器事件(如启动、关闭)
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("MyListener:Servlet容器初始化完成");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("MyListener:Servlet容器销毁");
    }
}

步骤 2:通过配置类注册组件(SpringBoot 1.x的版本去掉泛型)

@Configuration
public class ServletConfig {
    // 注册Servlet
    @Bean
    public ServletRegistrationBean<MyServlet> myServlet() {
        // 关联自定义Servlet,并指定访问路径为/myServlet
        ServletRegistrationBean<MyServlet> registrationBean = new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
        registrationBean.setLoadOnStartup(1); // 启动顺序(数字越小越先启动)
        return registrationBean;
    }
    // 注册Filter
    @Bean
    public FilterRegistrationBean<MyFilter> myFilter() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFilter()); // 关联自定义Filter
        // 指定过滤路径:拦截/hello和/myServlet的请求
        registrationBean.setUrlPatterns(Arrays.asList("/hello", "/myServlet"));
        return registrationBean;
    }
    // 注册Listener
    @Bean
    public ServletListenerRegistrationBean<MyListener> myListener() {
        // 关联自定义Listener
        ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        return registrationBean;
    }
}

步骤 3:创建测试控制器(辅助验证 Filter)

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    // 该路径会被MyFilter过滤(因为Filter配置了拦截/hello)
    @GetMapping("/hello")
    public String hello() {
        System.out.println("TestController的/hello方法执行");
        return "hello";
    }
}

步骤 4:启动应用并验证

1. 验证 Listener(容器启动时)

启动 Spring Boot 应用,控制台会输出 Listener 的初始化日志:

MyListener:Servlet容器初始化完成

2. 验证 Servlet 和 Filter

访问http://localhost:8080/myServlet

  • 浏览器显示响应:Hello MyServlet!
  • 控制台输出(Filter 先执行,再到 Servlet):
MyFilter执行前
MyServlet处理了GET请求
MyFilter执行后

3. 验证 Filter 对其他路径的拦截

访问http://localhost:8080/hello

  • 浏览器显示响应:hello
  • 控制台输出(Filter 拦截 /hello 请求):
MyFilter执行前
TestController的/hello方法执行
MyFilter执行后

4. 验证未被 Filter 拦截的路径

访问http://localhost:8080/other(假设存在该路径且未被 Filter 配置):

  • 控制台不会输出MyFilter的日志(仅控制器方法日志)。

步骤 5:验证DispatcherServlet的默认行为

DispatcherServlet默认拦截/,负责处理 Spring MVC 的所有请求(如/hello)。可以通过以下方式验证:

  • application.properties中修改其拦截路径:
server.servletPath=/app/*  # 修改为拦截/app/*路径
  • 重启应用后,原/hello需访问/app/hello才能被 Spring MVC 处理,否则返回 404(证明DispatcherServlet的拦截路径已生效)。

到此这篇关于SpringBoot配置嵌入式服务器的实操演示的文章就介绍到这了,更多相关SpringBoot配置嵌入式服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring中@Valid和@Validated注解用法

    详解Spring中@Valid和@Validated注解用法

    本文将以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 和 @Validated 注解用法详解,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07
  • 一文让你了解透彻Java中的IO模型

    一文让你了解透彻Java中的IO模型

    本文只是说明了IO模型,让你了解IO模型是什么,怎么区分IO模型,以及分析了Java中的三种IO模型,本文是纯理论知识,看完之后会让你对IO有更加深刻的理解,感兴趣的同学可以参考一下
    2023-05-05
  • Java分布式服务框架Dubbo介绍

    Java分布式服务框架Dubbo介绍

    这篇文章介绍了Java分布式服务框架Dubbo,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • JavaWeb之会话技术案例详解

    JavaWeb之会话技术案例详解

    这篇文章主要介绍了JavaWeb之会话技术案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 浅析Java中为什么要设计包装类

    浅析Java中为什么要设计包装类

    我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作
    2021-06-06
  • Java基于UDP协议的聊天室功能

    Java基于UDP协议的聊天室功能

    这篇文章主要为大家详细介绍了Java基于UDP协议的聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java实现快速排序算法的完整示例

    Java实现快速排序算法的完整示例

    这篇文章主要给大家介绍了关于Java实现快速排序算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot3 Web编程开发的工程搭建拦截器及测试工具示例

    SpringBoot3 Web编程开发的工程搭建拦截器及测试工具示例

    这篇文章主要介绍了SpringBoot3 Web编程开发的工程搭建拦截器及测试工具示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Mybatis的一级缓存和二级缓存原理分析与使用

    Mybatis的一级缓存和二级缓存原理分析与使用

    mybatis-plus 是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章带你了解Mybatis的一级和二级缓存
    2021-11-11
  • SpringBoot自动装配注解的实现示例

    SpringBoot自动装配注解的实现示例

    本文主要介绍了SpringBoot自动装配注解的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04

最新评论