Spring boot与Servlet组件



Servlet组件注册

Servlet的组件包括Filter, Listener, Servlet, 具体详情可参考Servlet详解.
普通的web项目都是从web.xml中配置, Spring boot中为我们提供了很多注册的方式. 我们先以Filter举例, 然后再介绍ListenerServlet的注册, 他们的注册方式基本一致.


注册Filter

方式一

直接作为一个Bean注册.
自定义Filter通常可以实现Filter接口, 或者可以继承Spring提供的GenericFilterBean.
Spring Boot监测到有javax.servlet.Filterbean时就会自动加入过滤器调用链.

  • 优点: 简单
  • 缺点: 不可控(比如无法配置要过滤的URL等), 所以这种方式基本不用

代码如下:

@Component
public class MyFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //  some code
    }
}

方式二

通过FilterRegistrationBean注册, 这个类实现了ServletContextInitializer接口

  • 优点: 简单, 可控

比如还是注册上面写的那个MyFilter, 注册及配置的代码如下:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public FilterRegistrationBean registMyFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.setName("myFilter");
        registrationBean.setUrlPatterns(Sets.newHashSet("/*"));
        registrationBean.setOrder(1);
        return registrationBean;
    }
}

方式三

使用@ServletComponentScan扫描@WebFilter注解自动注册

这种方式需要在 主配置类 上加@ServletComponentScan注解, 在我们的MyFilter类上加@WebFilter注解. 代码如下:

// 主配置类
@SpringBootApplication
@ServletComponentScan
public class Application {
    // ...
}
// 自定义的过滤器类
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //  some code
    }
}

注册Listener

Listener的注册方式跟Filter一样, 只是继承或实现的接口, 添加的注解不一样.

  • 比如实现ServletContextListener接口
  • 通过ServletListenerRegistrationBean注册
  • 通过@WebServlet注解注册.

注册Servlet

Spring项目中, 都是通过DispatcherServlet分发, 基本不需要自定义Servlet. 下面仅介绍使用方式

  • 注意不要使用方式一, 一定要指定相应的URL
  • 通过ServletRegistrationBean注册
  • 通过@WebServlet(name = "myServlet", urlPatterns = "/abc/*")注解注册.