以前 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());
}