注册方式
web.xml
传统 Web 需要通过 web.xml 进行 Servlet、Filter、Listener 注册。
Servlet 3.0
Servlet 3.0 规范推出了 @WebServlet、@WebFilter、@WenListener 进行注册。
@WebServlet、@WebFilter、@WenListener 可以配合 Spring 的 @ServletComponentScan 进行注入,但是 @WebFilter 无法配置 Order。
ServletContext
ServletContext 也可以通过调用 addServlet、addFilter、addListener 注册。
SPI
SPI(Service Provider Interface),因为 onStartup(Set<Class<?>> c, ServletContext ctx) 包含 ServletContext 参数,因此可以转换为 ServletContext 注入
ServletRegistrationBean
优点:可以指定 URL 拦截,灵活配置
以 Servlet 为例:
@Bean
public ServletRegistrationBean<HelloServlet> helloServlet() {
ServletRegistrationBean<HelloServlet> servletRegistrationBean = new ServletRegistrationBean<>();
servletRegistrationBean.setServlet(new HelloServlet());
servletRegistrationBean.setUrlMappings(Arrays.asList("/**"));
return servletRegistrationBean;
}
@Component
特点:通过加入注解 @Component 即可,如果要设置 Order,还可以使用注解 @Order,无法设置 UrlPatterns。
适用范围:Filter 针对全部 URL。
建议如果是 Web 项目可以继承 HttpFilter,实现 doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain),避免 Http 强转。
@Component
@Order(Integer.MIN_VALUE)
public class ExceptionFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
}
}