SpringMVC-DispatcherServlet过程(注解形式)

这里整理一下博主自己学习Spring对于过程的理解,整理一下思路。

大致流程,以及对红字的介绍。

第一步:

Servlet容器启动时会扫描当前应用里面的每一个jar包,找到其中的META-INF/services/javax.servlet.ServletContainerInitializer文件,该只存放实现了ServletContainerInitializer的类的全类名,并加载这个文件的所写的类。

Servlet容器:一般指tomcat容器,其他容器博主尚且不知。

当前应用:我们创建的每一个工程。

META-INF/services/javax.servlet.ServletContainerInitializer

(1)在Spring的Spring-web-x.x.xx.RELEASE.jar包中存在这个文件。文件的内容是org.springframework.web.SpringSerlvetContainerInitializer【很明显继承自ServletContainerInitializer】的全类名。

(2)实现ServletContainerInitializer的类需要实现如下:

//注解写在类上,容器启动时,会将这个指定的子类以及子接口等传递给该函数的第一个参数webAppInitializerClasses
@HandlesTypes({})

//类需要实现的方法
//webAppInitializerClasses同上
//servletContext当前WEB应用的环境(上下文)
/*
 * ServletContext只在两个地方添加组件:
 * 1、在ServletContainerInitializer的onStartup的参数中
 * 2、在Listener的contextDestoryed或contextInitialized的参数Event.getServletContext。
 */
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) 

(3)SpringSerlvetContainerInitializer实现了什么功能?

             ①、HandlesTypes=(WebApplicationInitializer.class

             ②、判断webAppInitializerClasses(上面的第一个参数)中的元素是否为接口或抽象类

             ③、如果不是,就通过反射的方式,创建类

(4)WebApplicationInitializer是什么?

             ①、继承关系如下:

                      |--WebApplicationInitializer(接口,定义各种方法)

                      |--AbstractContextLoaderInitializer(抽象类,创建RootApplicationContext根容器)

                      |--AbstractDispatherServletInitializer(抽象类,创建DispatherServlet,他的映射通过getServletMappings()创建,而我  们可以实现该方法,覆盖该方法,写映射)

                      |--AbstractAnnotationConfigDispatherServletInitializer(抽象类,利用注解的方式创建DispatherServlet,重写了上面的两个抽象类的方法)

(5)WebApplicationContext 和 RootWebApplicationContext关系?

         其实就一样的东西,只是每一个存放的东西不太一样。

第二步:

继承AbstractAnnotationConfigDispatherServletInitializer,并实现相应的抽象方法,我们实现的方法, 会通过上一步的流程,自动的创建并生成DispatcherServlet容器。

需要实现的方法如下:

/*
	 * 这个方法暂时不知道详情。
	 */
	@Bean
	@RequestMapping("*.do")
	public DispatcherServlet dispatcherServlet() {
		DispatcherServlet servlet = new DispatcherServlet();
		return servlet;
	}

	/*
	 * 根据上面一个图,应该很好的展示了,这个方法,返回的是Services和Repositories这一层的类。
	 */
	@Override
	protected Class<?>[] getRootConfigClasses() {
		
		return null;
	}

	/*
	 * 返回的是用Controlers、viewResolver和HandlerMapping这一层的类。
	 */
	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return null;
	}

	/*
	 * 返回的是,当前这个DispatcherServlet的拦截配置
	 */
	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return null;
	}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值