码迷,mamicode.com
首页 > 编程语言 > 详细

Springboot如何集成SpringMVC

时间:2021-04-06 15:12:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:nic   conf   figure   tin   构造   aaaaa   frame   sni   ict   

在autoconfigure模块的spring.factories中,有自动配置类DispatcherServletAutoConfiguration:

技术图片

进入这个配置类,可以知道这个自动配置只有是Web Application并且发现有DispatcherServlet类的时候才会生效。

技术图片

那么是什么时候加载这个配置类的呢?

技术图片

上图的start会调用LifecycleBase#start方法,接着会调用LifecycleBase#init方法,然后会调用initInternal(),最后会调用StandardServer#startInternal,在这个方法里面,会调用StandardContext#startInternal这个方法,然后循环调用initializer的onStartup:

技术图片

技术图片

onStartUp方法会回调去执行ServletWebServerApplicationContext的selfInitialize方法,ServletContextInitializerBeans 从beanFactory中获取spring容器中所有的ServletContextInitializer实现(filter列表以及servlet都添加进去)

技术图片

其中留意getServletContextInitializerBeans回去創建type是ServletContextInitializer的bean

技术图片

技术图片

出乎我意料的是獲取到的bean names是dispatcherServletRegistration?然後T bean = beanFactory.getBean(name, type);根據name=dispatcherServletRegistration,type=org.springframework.boot.web.servlet.ServletContextInitializer去創建bean,原來根據dispatcherServletRegistration從缓存中获取到了下面的BeanDefinition:

技术图片

技术图片

这里找到了一个重要的自动配置类DispatcherServletAutoConfiguration

然后就是开始根据这个BeanDefinition开始创建Bean了吧,创建Bean的过程中,调用了一个Factory Method:

技术图片

技术图片

嗯,这里开始创建org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration,getBean又开始调用doGetBean:

技术图片

实例化bean的时候会调用构造方法,紧接着实例化DispatcherServlet:

技术图片

技术图片

 

以上大部分都是讲怎么获取到核心的配置类,怎么创建DispatcherServlet,创建完成后,ServletContextInitializer最终返回下面两个bean:

技术图片

技术图片

獲取到ServletContextInitializer的bean之後,會執行

beans.onStartup(servletContext),主要执行了RegistrationBean,EchoServer,dispatcherServletRegistration...逐个把这些bean注册到ServletContext中.

 

更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/

Springboot如何集成SpringMVC

标签:nic   conf   figure   tin   构造   aaaaa   frame   sni   ict   

原文地址:https://www.cnblogs.com/jovic/p/14617777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!