• 【springboot】17、使用/注入Servlet、Filter、Listener


    基本介绍

    考虑到实际开发业务非常复杂和需要兼容各种组件,SpringBoot 支持将 Servlet、Filter、Listener 注入
    Spring 容器, 成为 Spring bean。

    注解方式注入

    我们要想使用Servlet、Filter、Listener,只需要要javaWeb那样使用对应的注解即可,也就是@WebServlet,@WebListener,@WebFilter。示例代码如下

    @WebServlet(urlPatterns = "/myServlet")
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("MyServlet--被访问");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @WebListener
    public class MyListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("监听器--contextInitialized");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    @WebFilter(urlPatterns = "/*")
    public class MyFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("过滤器--doFilter");
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果使用这种方式,那么我们还需要在配置类上添加一个@ServletComponentScan注解,这个注解用于指定扫描原生Servlet组件的路径
    在这里插入图片描述

    我在启动类上指定了扫描路径
    在这里插入图片描述

    启动项目,监听器生效了

    在这里插入图片描述

    下面访问一下我们自己定义的servlet

    在这里插入图片描述

    在这里插入图片描述

    可以发现Servlet和Filter都生效了,这个就是第一种方式,这种方式注入的组件并不是由springboot来进行管理的,二是由tomcat进行管理,下面介绍第二种方式,这种方式会将原生Web组件注册成为一个bean,并交由springboot进行管理。

    使用RegistrationBean 方式注入

    我们先将@ServletComponentScan这个注解注释掉,然后使用RegistrationBean 方式注入。
    在这里插入图片描述
    我们顺便也把@WebServlet,@WebListener,@WebFilter这些注解给注释掉
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们使用RegistrationBean的方式如下

    @Configuration
    public class OriginalWebConfig {
        @Bean
        public ServletRegistrationBean<MyServlet> myServletServletRegistrationBean() {
            MyServlet myServlet = new MyServlet();
            return new ServletRegistrationBean<>(myServlet, "/myServlet");
        }
    
        @Bean
        public FilterRegistrationBean<MyFilter> myFilterFilterRegistrationBean() {
            MyFilter myFilter = new MyFilter();
            return new FilterRegistrationBean<>(myFilter);
        }
    
        @Bean
        public ServletListenerRegistrationBean<MyListener> myListenerServletListenerRegistrationBean() {
            MyListener myListener = new MyListener();
            return new ServletListenerRegistrationBean<>(myListener);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们只需要在配置类中返回对于的RegistrationBean即可,其中ServletRegistrationBean可以在构造函数中指定路径。下面来启动项目
    在这里插入图片描述
    监听器没有问题,下面来访问下/myServlet
    在这里插入图片描述
    在这里插入图片描述

    可以发现也没有问题,下面我们就来看一下在spring容器中是否有上面的几个组件,debug一下
    在这里插入图片描述
    在singletonObjects中,我们发现了我们自己写的Listener,有这个,其他的肯定也有,就不在找了,我们通过RegistrationBean就可以注入原生的Web组件,并且交由springboot进行管理

    总结

    没啥好说的,对于上面的两种注入原生Web组件的方式,建议使用RegistrationBean的方式进行注入

  • 相关阅读:
    Leetcode.714 买卖股票的最佳时机含手续费
    [转]x86_64的基本架构
    Java中的异常处理机制
    python 异常
    顺丰快递:请签收MySQL灵魂十连
    k8s集群的CA证书过期处理
    全自动调节灯光强度的实现(仿真+程序+文档)
    Spring Boot中Excel的导入导出的实现之Apache POI框架使用教程
    Qt鼠标点击事件处理:按Escape键退出程序
    新闻快报| 虹科与瑞士Dimetix已联手合作三周年, 致力于提供高效、精确的激光测距解决方案!
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/127849394