SpringBoot-Web开发之Web原生组件注入

使用Servlet API

  • Web三大原生组件:Servlet、Filter、Listener
  • 启动类上使用注解@ServletComponentScan(basePackages = "com.my.admin")
    • 使用注解的方式注入,需要开启扫描
  • @WebServlet()
    • 执行后会发现直接响应,没有经过Spring的拦截器
java 复制代码
//处理/my请求
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
                throws ServletException, IOException {
        resp.getWriter().write("66666");
    }
}
  • @WebFilter
java 复制代码
@Slf4j
//拦截所有请求在servlet中是/*,spring中是/**
@WebFilter(urlPatterns={"/css/*","/images/*"}) 
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("MyFilter初始化完成");
    }

    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
        log.info("MyFilter工作");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        log.info("MyFilter销毁");
    }
}
  • @WebListener
java 复制代码
@Slf4j
@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.info("MySwervletContextListener监听到项目初始化完成");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        log.info("MySwervletContextListener监听到项目销毁");
    }
}

RegistrationBean

  • 不使用注解注入,使用配置类
  • ServletRegistrationBean
  • FilterRegistrationBean
  • ServletListenerRegistrationBean
java 复制代码
@Configuration(proxyBeanMethods = true)
public class MyRegistConfig {

    @Bean
    public ServletRegistrationBean myServlet(){

        MyServlet myServlet = new MyServlet();
        return new ServletRegistrationBean(myServlet,"/my","/my02");
    }

    @Bean
    public FilterRegistrationBean myFilter(){

        MyFilter myFilter = new MyFilter();
		//myServlet()可以将servlet处理的请求进行过滤
        //return new FilterRegistrationBean(myFilter,myServlet());

        FilterRegistrationBean filterRegistrationBean = 
									new FilterRegistrationBean(myFilter);
		//自定义过滤的路径
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","/css/*"));
        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean myListener(){

        MySwervletContextListener mySwervletContextListener = 
									new MySwervletContextListener();
        return new ServletListenerRegistrationBean(mySwervletContextListener);
    }
}

DispatcherServlet注入原理

  • 容器中自动配置了 DispatcherServlet, 属性绑定到 WebMvcProperties;对应的配置文件配置项是 spring.mvc
  • 通过ServletRegistrationBean把 DispatcherServlet 配置进来。默认映射的是以/开头的路径
  • 多个Servlet都能处理到同一层路径,精确路径优先原则,故解释了上述自定义servlet直接响应,不经过spring
相关推荐
小白说大模型16 分钟前
基于 Qwen3.8-Max 构建 AI 合同精审系统:文档解析、多轮条款分析 Pipeline 工程实战
数据库·人工智能·spring·机器学习·自然语言处理
坐吃山猪29 分钟前
IDEA调试中Evaluate常用操作
java·python·intellij-idea
吴长建先生1 小时前
ASP.NET Core WebAPI 服务在 IM 即时
java
MuMuMu12231 小时前
文旅户外场景智能回收终端工程难点解析:越华环保集团碳惠小屋耐候与供电系统实践
java·大数据·算法
小鹿的周先生1 小时前
第 3 篇:Spring AI System Prompt 实战——为 AI 助手设置角色和行为规则
人工智能·spring·prompt
偷偷写博客1 小时前
Gitee → GitHub 自动同步配置手册
java
西峰u1 小时前
Java IO 完整学习笔记|字节流、字符流、缓冲流、资源关闭全梳理
java·笔记·学习
L-岁月染过的梦1 小时前
把常用开发小工具收进 IDEA:Develop Helper 插件介绍
java·数据库·intellij-idea
雄哥0071 小时前
java代码反编译CFR
java·开发语言·反编译·cfr
lsylalalala1 小时前
多线程(2)
java·开发语言·多线程