Springboot通过创建RegistrationBean子类方式实现Filter、Servlet、Listener三大组件

本文讲解的知识点是基于Springboot 2.1.5.RELEASE版本。

一. 关键技术

之前我们介绍了Springboot如何通过注解方式实现Filter、Servlet、Listener组件的功能,除此之外还有另一种通过创建RegistrationBean相应子类,借助@Bean注解将自定义组件注册到容器中的方法,一起来看下。
Springboot提供了三个RegistrationBean的子类用于注册Filter、Servlet、Listener组件:

  • FilterRegistrationBean
  • ServletRegistrationBean
  • ServletListenerRegistrationBean

二. 准备工作

1. 配置POM依赖


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.sdsjgroupId>
    <artifactId>springbootartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>jarpackaging>

    <name>springbootname>
    <description>Demo project for Spring Bootdescription>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.5.RELEASEversion>
    parent>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <java.version>1.8java.version>
    properties>

    
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>
project>

2. 创建启动类和控制器

为了方便,我将启动类和控制器放在一起,如下:

package com.sdsj.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

    @RequestMapping("/")
    public String index() {
        System.out.println("This is index page");
        return "Welcome!";
    }

}

在启动类上添加了两个注解:@SpringBootApplication@RestController

三. 创建Filter、Servlet、Listener类

1. 创建Filter类

package com.sdsj.springboot.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 过滤器
 *
 * @author zjhuang
 * @create 2019/6/4 15:21
 **/
public class SecondFilter implements Filter {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("second filter init, filter name: " + filterConfig.getFilterName());
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("second filter uri: " + ((HttpServletRequest) servletRequest).getServletPath());
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("second filter destroy");
    }
}

2. 创建Servlet类

package com.sdsj.springboot.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 自定义Servlet
 *
 * @author zjhuang
 * @create 2019/6/4 17:13
 **/
public class SecondServlet extends HttpServlet {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        log.info("second servlet init, servlet name: " + servletConfig.getServletName());
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("second servlet uri: " + req.getServletPath());
        PrintWriter out = resp.getWriter();
        out.write("second servlet is running");
        out.flush();
    }

    @Override
    public void destroy() {
        log.info("second servlet destroy");
    }
}

3. 创建Listener类

package com.sdsj.springboot.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

/**
 * 监听器
 *
 * @author zjhuang
 * @create 2019/6/4 15:21
 **/
public class SecondListener implements ServletRequestListener {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        log.info("second listener has sent response, uri: " + request.getServletPath());
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        log.info("second listener has received request, uri: " + request.getServletPath());
    }

}

四. 注册Filter、Servlet、Listener

package com.sdsj.springboot.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import java.util.EventListener;

/**
 * 全局配置类
 *
 * @author zjhuang
 * @create 2019/6/5 17:39
 **/
@Configuration
public class Config {

    /**
     * 注册一个Filter
     *
     * @return FilterRegistrationBean
     */
    @Bean
    public FilterRegistrationBean registerFilter() {
        // 创建Filter注册Bean
        FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
        // 创建自定义的Filter对象
        SecondFilter filter = new SecondFilter();
        // 注册Filter
        registration.setFilter(filter);
        // 设置Filter名称
        registration.setName("second_filter");
        // 设置Fliter匹配规则
        registration.addUrlPatterns("/*");
        // 设置排序,在存在多个Filter实例的情况下确定Filter的执行顺序
        registration.setOrder(1);
        return registration;
    }


    /**
     * 注册一个Servlet
     *
     * @return ServletRegistrationBean
     */
    @Bean
    public ServletRegistrationBean registerServlet() {
        // 创建Servlet注册Bean
        ServletRegistrationBean<Servlet> registration = new ServletRegistrationBean<>();
        // 创建自定义的Servlet对象
        SecondServlet servlet = new SecondServlet();
        // 注册Servlet
        registration.setServlet(servlet);
        // 设置Servlet名称
        registration.setName("second_servlet");
        // 设置Servlet配置规则
        registration.addUrlMappings("/second_servlet");
        // 设置加载参数
        registration.setLoadOnStartup(1);
        return registration;
    }

    /**
     * 注册一个Listener
     *
     * @return ServletListenerRegistrationBean
     */
    @Bean
    public ServletListenerRegistrationBean registerListener() {
        // 创建Listener注册Bean
        ServletListenerRegistrationBean<EventListener> registration = new ServletListenerRegistrationBean<>();
        // 创建自定义的Listener对象
        SecondListener listener = new SecondListener();
        // 注册Listener
        registration.setListener(listener);
        // 设置排序,在存在多个Listener实例的情况下确定Listener的执行顺序
        registration.setOrder(1);
        return registration;
    }

}

你可能感兴趣的:(springboot)