以前 Web 应用使用外置Tomcat 容器部署,可在 web.xml 文件中注册 Servlet 三大组件;
而由于 Spring Boot 默认是以 jar 包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件,Spring提供以下Bean来注册三大组件:
1、ServletRegistrationBean :注册自定义Servlet
2、FilterRegistrationBean :注册自定义Filter
3、ServletListenerRegistrationBean :注册自定义Listener
自定义Servlet组件
定义一个servlet
/**
* 自定义Servlet组件
* @author asong
*
*/
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("HelloServlet success...");
}
}
定义一个配置,将自定义的Servlet注入Spring容器
//自定义注册servlet相关组件
@Configuration
public class MyServletConfig {
@Bean
public ServletRegistrationBean helloServlet() {
//参数1:自定义的servlet,参数2:servlet的url映射
ServletRegistrationBean bean = new ServletRegistrationBean(new HelloServlet(), "/hello");
//平常在 web.xml 中给servlet标签配置的属性,在这里都可以设置
bean.setLoadOnStartup(1);
return bean;
}
}
自定义Filter
/**
* 自定义过滤器组件
* @author asong
*
*/
public class MyFilter implements Filter{
@Override
public void destroy() {
System.out.println("filter销毁");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("MyFilter过滤完成");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("filter初始化");
}
}
定义一个配置,将自定义的Filter组件注入容器
//自定义注册servlet相关组件
@Configuration
public class MyServletConfig {
/**
* 注册自定义过滤器组件
* @return
*/
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
//设置过滤器
bean.setFilter(new MyFilter());
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
自定义Listener组件
/**
* 自定义监听器,监听应用的启动和销毁
* @author asong
*
*/
public class MyListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("SpringBoot.Servlet应用销毁");
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("SpringBoot.Servlet应用启动");
}
}
定义一个配置,将自定义的Listener组件注入容器
/**
* 注册自定义监听组件
* @return
*/
@Bean
public ServletListenerRegistrationBean myListener() {
return new ServletListenerRegistrationBean(new MyListener());
}