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配置嵌入式服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java双冒号(::)运算符使用详解

    Java双冒号(::)运算符使用详解

    之前没用过::这个东西,今天看flink的时候发现官网有个例子用到了这个符号,本文就详细的来介绍一下Java双冒号(::)运算符使用详解,感兴趣的可以了解一下
    2021-09-09
  • Java中List.contains(Object object)方法使用

    Java中List.contains(Object object)方法使用

    本文主要介绍了Java中List.contains(Object object)方法,使用List.contains(Object object)方法判断ArrayList是否包含一个元素对象,感兴趣的可以了解一下
    2022-04-04
  • 解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    这篇文章主要介绍了idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • mybatis使用pageHelper插件进行查询分页

    mybatis使用pageHelper插件进行查询分页

    这篇文章主要介绍了mybatis使用pageHelper插件进行查询分页,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 解决Springboot配置excludePathPatterns不生效的问题

    解决Springboot配置excludePathPatterns不生效的问题

    这篇文章主要介绍了解决Springboot配置excludePathPatterns不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 详解java8中的Stream数据流

    详解java8中的Stream数据流

    Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。接下来通过本文给大家分享java8中的Stream数据流知识,感兴趣的朋友一起看看吧
    2017-10-10
  • ClassLoader类加载源码解析

    ClassLoader类加载源码解析

    这篇文章主要为大家详细解析了ClassLoader类加载源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 详解spring cloud hystrix 请求合并collapsing

    详解spring cloud hystrix 请求合并collapsing

    这篇文章主要介绍了详解spring cloud hystrix 请求合并collapsing,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java的Junit测试框架中的其他注解说明

    Java的Junit测试框架中的其他注解说明

    这篇文章主要介绍了Java的Junit测试框架中的其他注解说明,JUnit是一个开源的java单元测试框架,它是XUnit测试体系架架构的一种体现,
    是Java语言事实上的标准单元测试库,需要的朋友可以参考下
    2023-10-10
  • MyBatis中ResultSetHandler的具体使用

    MyBatis中ResultSetHandler的具体使用

    本文主要介绍了MyBatis中的ResultSetHandler及其核心功能和实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09

最新评论