web原生组件注入(Servlet、Filter、Listener)
1.使用 ServletApi
默认存在两个Servlet
- DispatcherServlet -> /
- MyServlet -> /my
// 直接响应,没有经过拦截器
@WebServlet(urlPatterns="/my")
public class MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException{
resp.getWrite().write("11");
}
}
// 指定原生 servlet 组件都放在哪里
@ServletComponentScan(basePackages="com.test")
@SpringBootApplication
public class BootWebApplication{
public static void main(String[] args){
SpringApplication.run(BootWebApplication.class,args);
}
}
2. 使用 Filter
@WebFilter(urlPatterns={"/css/*","/images/*"})
public class MyFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException{
// 初始化
}
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws Exception{
// 过滤方法
chain.doFilter(request,response);
}
@Override
public void destroy(){
// 销毁
}
}
3. 使用 Listener
@WebListener
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce){
// 监听项目初始化
}
@Override
public void contextDestroyed(ServletContextEvent sce){
// 监听项目销毁
}
}
4. 使用 RegistrationBean,springboot 底层自定义组件
// (proxyBeanMethods = false) 会导致每次访问都会产生很多对象
@Configuration(proxyBeanMethods = true) // 保证我们依赖的组件始终是单实例
public class MyRegistConfig{
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
return new ServletRegistrationBean(myServlet,"/my","/my02");
}
@Bean
public FilterRegistrationBean myFilter(){
MyFilter myFilter = new MyFilter();
//return new FilterRegistrationBean(myFilter,myServlet());
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","my02"));
return new FilterRegistrationBean
}
@Bean
public ServletListenerRegistrationBean myListener(){
MyServletContextListener myServletContextListener=new MyServletContextListener();
return new ServletListenerRegistrationBean(myServletContextListener);
}
}
ServletRegistrationBean
,FilterRegistrationBean
,ServletListenerRegistrationBean
5.扩展
DispatchServlet 如何注册进来
- 容器中自动配置了 DispatchServlet ,属性绑定到 WebMVCProperties;对应的配置项是 spring.mvc
- 通过 ServletRegistrationBean< DispatcherServlet> 把 DispatcherServlet 配置进来。
- 默认映射的是 / 路径
tomcat.Servlet
多个Servlet都能处理到同一层路径,精确优先原则