标签: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/
标签:nic conf figure tin 构造 aaaaa frame sni ict
原文地址:https://www.cnblogs.com/jovic/p/14617777.html