Servlet3.0 容器中自动加载Filter和Listener的方式是什么?(基于注解形式)
前言:
要使用SpringMVC就要加载springmvc相关的组件,其中最核心的就要用到它的核心控制器DispatcherServlet,要用他,就要先得到他,怎么得到他呢?就有一种配置机制的手段,来把他得到:当有请求时,加载spring容器,容器默认是去到web.xml里去找是否有核心控制器,但用到注解形式的话,就得有注解这一套的规则,用注解要去找接口WebApplicationInitializer的实现类。流程:Tomcat(Servlet3.0规范的web容器)启动时查找ServletContainerInitializer接口的实现类=>找到SpringServletContainerInitializer类,由该类去发现WebApplicationInitializer的实现类=>最终找到AbstractAnnotationConfigDispatcherServletInitializer类(该类的父类的父类实现了WebApplicationInitializer接口)
正文:
过滤器:
自定义一个实现类DispatcherServletConfig,继承该类用于配置核心控制器。
AbstractAnnotationConfigDispatcherServletInitializer的父类AbstractDispatcherServletInitializer的onStartup()方法实现了过滤器,(可看源码详解附图片如下)
public class DispatcherServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//添加过滤器
//1,创建过滤器
CharacterEncodingFilter filter = new CharacterEncodingFilter();
//2.设置字符编码集
filter.setEncoding("utf-8");
//3.添加至ServletContext
//添加过滤器
servletContext.addFilter("CharacterEncodingFilter", filter)
.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),
false, "*.do"); //设置Mapping映射
//必须调用父类的onStartup()方法
super.onStartup(servletContext);
}
}
```图一![在这里插入图片描述](https://img-blog.csdnimg.cn/4435d59eaad745e886fb7299bbf352ec.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTU1MzgxNg==,size_16,color_FFFFFF,t_70)
### 监听器
AbstractAnnotationConfigDispatcherServletInitializer父类的父类AbstractContextLoaderInitializer的onStartup()方法实现了监听器,(可看源码详解附图片如下)
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c79ca147f164da18b7735dab6998424.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MTU1MzgxNg==,size_16,color_FFFFFF,t_70)