SpringMVC原理讲解

1、利用Servlet(tomcat)容器的spi发现思想进行方法调用,services包下会有一个以类名命名的文件

 2、内部只定义需要访问的类

 3、这个类的特点是实现ServletContainerInitializer 接口  并且使用  @HandlesTypes 注解

 4、注解会收集WebApplicationInitializer类型的实例 并封装到set容器中,实现这个类主要是会被tomcat掉用到onstartup方法,并且

  入参就是收集的set集合。

 5、具体内容调用

 6、可以通过集成 AbstractAnnotationConfigDispatcherServletInitializer 类来手动创建一个@HandlesTypes注解类型的类,然后重写

里面的方法,可以达到,灵活装配,其实就是钩子方法。当调用initialize.onStartup()  的时候,其实会调用到 

AbstractAnnotationConfigDispatcherServletInitializer   类的父类AbstractDispatcherServletInitializer  这个类中

 7、super方法,实现spring容器的创建

WebApplicationContext rootAppContext = createRootApplicationContext();
创建后加入监听,最终将监听加入tomcat容器
ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
listener.setContextInitializers(getRootApplicationContextInitializers());
servletContext.addListener(listener);

8、上一步只是创建上下文,并没有初始化,初始化操作是在 

ContextLoaderListener 类中,也就是监听中,被tomcat调用的

 9、Spring容器已经启动完成,剩下的就是servlet启动,具体来说就是 DispatcherServlet

 10、进入后也只是创建了 上下文,并没有初始化,初始化是在  servlet的 init  方法中   init方法是DispatcherServlet的父类

        HttpservletBean中,最后调用  initServletBean();

11、MVC初始化,也就是进行相关Bean的实例化。注意此时有个@EnableMVC注解的话,这个注解中的类也会被实例化

12、基础类,初始化,这个地方是进行的收集工作,由于在@EnableMVC中已经进行了实例化,所以此时是有值得。

 13、请求处理类、方法处理类、试图解析处理类

 

 14、剩下还有很多细节,下一步就是,一个请求过来进入  servlet 的service方法,然后根据URl找到方法,进行方法

  的反射调用,有一点就是URL和Method的映射工作是在@EnableMVC中做的。先介绍这么多吧,入门了,后面的都好说。

 

 
原文地址:https://www.cnblogs.com/zxg-blog/p/15127522.html