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中做的。先介绍这么多吧,入门了,后面的都好说。