01. Spring Boot 整合 Spring MVC 流程
2020-12-01 15:00:56 0 举报
Spring Boot 整合 Spring MVC 流程
作者其他创作
大纲/内容
listeners.contextPrepared(context)发布 ApplicationContextInitializedEvent 事件
TomcatStarter starter = new TomcatStarter(initializers)
调用 ApplicationRunner 和 CommandLineRunner
printBanner(environment)打印 Banner
RegistrationBean 实现了 ServletContextInitializer 接口使用 Servlet3.0+ 的方法向 ServletContext 注册Servlet、Listener 和 Filter
ServletWebServerApplicationContext.onRefresh()
合并 initializers 和两个固定的固定的ServletContextInitializer
1. 向 Environment 中设置 ConversionService2. 若是设置了命令行参数,将其封装成 PropertySource 设置到 Environment 中3. 向 Environment 中设置 ActiveProfile
ConfigFileApplicationListener 的 onApplicationEnvironmentPreparedEvent 方法的执行逻辑中,会对 resources 目录下的文件进行加载并绑定到 Environment 中
Tomcat tomcat = new Tomcat()
// 省略 refresh 后部分逻辑
getOrCreateEnvironment()得到 Environment
DynamicRegistrationBean<D extends Registration.Dynamic> 实现了 RegistrationBean 接口
prepareContext()准备上下文
factory.getWebServer(getSelfInitializer())通过工厂得到嵌入式容器
调用 TomcatWebServer 创建WebServer 类型实例
ServletRegistrationBean<T extends Servlet> 实现 DynamicRegistrationBean 接口
refreshContext(context)刷新上下文
TomcatEmbeddedContext context = new TomcatEmbeddedContext()
listeners.started(context)发布 ApplicationStartedEvent 事件
实现 ServletContainerInitializer 接口的onStartup 方法
设置 context 属性
embeddedContext.setStarter(starter)将 TomcatStarter 设置到 Tomcat context 中
getWebServerFactory()applicationContext 中获取ServletWebServer 工厂
执行 ApplicationContextInitializer.initialize()
结束
WebApplicationType.deduceFromClasspath()推断 Web 类型,设置到 webApplicationType
DispatcherServlet 来源
从 spring.factories 文件工厂中获取 SpringApplicationRunListener,默认只有 EventPublishingRunListener
listeners.contextLoaded(context)发布 ApplicationPreparedEvent 事件
若是 SpringApplication 中提前设置了,则直接返回;若是没有根据之前判断的 webApplicationType 应用类型,创建不同类型的 Environment
ServletContainerInitializer 的 onStartup() 方法调用构造函数传入 ServletContextInitializer 属性的onStartup() 方法
ServletWebServerFactoryAutoConfiguration导入了 ServletWebServerFactoryConfiguration
DispatcherServletRegistrationBean 继承 ServletRegistrationBean 接口
initPropertySources()使用 ServletContext 和 ServletConfig 代替 Environment 中的这两个属性源
applicationContext.refresh()刷新 IOC 容器
配置 Tomcat 的属性即 Connector、Engine
// 省略 refresh 前部分逻辑
构造器传入 DispatcherServlet
配置 WebServerFactoryCustomizer 接口的两个实现类:ServletWebServerFactoryCustomizer 和TomcatServletWebServerFactoryCustomizer
createApplicationContext()根据 webApplicationType 不同,创建不同的 ApplicationContext
String name = getServletName()获取 Servlet 名称
ServletWebServerFactoryConfiguration配置类配置了 WebServerFactory
构造器传入要向ServletContext 注册的 Servlet
setInitializers() spring.factories 文件工厂中获取 ApplicationContextInitializer 并设置到 initializers 属性
createWebServer()创建嵌入式容器
DispatcherServletAutoConfiguration 自动配置类配置了 DispatcherServletRegistrationBean
configure(registration) 配置 组件
initialize() 中会调用 this.tomcat.start()
new DefaultApplicationArguments(args) 将启动参数封装到 ApplicationArguments
listeners.starting() 发布 ApplicationStartingEvent 事件
SpringApplication 构造方法
TomcatContextCustomizer.customize(context)配置 context
bindToSpringApplication(environment)将 Environment 中,spring.main 开头的属性设置到 SpringApplication 实例中
Servlet 使用的是 AnnotationConfigServletWebServerApplicationContext
将 Starter.class 设置到主配置类 属性中 primarySources
listeners.running(context)发布 ApplicationReadyEvent 事件
1. 设置 Environment2. ConversionService
调用 run 方法
调用 RegistrationBean 的 onStartup()
getSelfInitializer()通过方法引用方式的创建 ServletContextInitializer
回调 ServletContainerInitializer 的 onStartup 方法
ServletContextInitializer[] initializersToUse = mergeInitializers(initializers)
WebServerFactoryCustomizerBeanPostProcessor 的postProcessBeforeInitialization() 方法调用WebServerFactoryCustomizer 接口 customize 方法
deduceMainApplicationClass()推断启动类 :mainApplicationClass,打印日志是用
listeners.environmentPrepared(environment)发布 ApplicationEnvironmentPreparedEvent 事件
setListeners()从 spring.factories 文件工厂中获取 ApplicationListener 并设置到 listeners 属性
getTomcatWebServer(tomcat)把 Tomcat 包装为 Spring 统一的 WebServer 类型
configureEnvironment() 配置 Environment
0 条评论
下一页