Servlet3.0 容器中自动加载Filter和Listener的方式是什么

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)


猜你喜欢

转载自blog.csdn.net/weixin_51553816/article/details/119800157