Springboot项目war包模式启动流程
对于项目部署的需要,当前项目需要通过war包进行部署,这就带来了一个问题,就是原来***in方法中的一些逻辑会失效,这样就会出现一些不可预知的错误#1。这里加载了一个类路径下的json文件,它被加载到系统属性中,但是在随后的运行中出现了NullPointException。我很疑惑。我的本地操作没问题,但是发布到环境就有问题了。看了一下源代码,我意识到我们的本地操作是在java -jar模式下,虚拟机此时正在运行项目的***in方法。但是,在发布到环境中之后,它将作为war包运行。此时,这个项目的***in方法不会被执行,而是由tomcat的***in方法启动。这时候,问题来了。数据不会加载到全局系统变量中。
1#
咨询完spring-web的依赖关系,META-INF下有一个服务的文件夹,
javax . servlet . servlet container Initializer。这东西到底是做什么的?实际上,tomcat启动后,文件中的类是通过JDK的SPI调用实现的。这里spring用的是org . spring framework . web . springservletcontainerinitializer,打开这个类,你会发现类上有HandlesTypes的注释。那么这个装饰课的目的是什么呢?主要用作onStartup方法的参数——web appinitializerclass
会收集所有实现了这个接口的类,循环调用它们的onStartup方法。
#2
#3
然后我们的启动类
org . spring framework . boot . web . servlet . support . springbootservletinitializer恰好又是它的子类,所以会被调用。这里采用了模板设计模式。
org . spring framework . boot . web . servlet . support . spring boot servletinitializer #此配置方法作为org . spring framework . boot . web . servlet . support . spring boot servletinitializer # createrootapplicationContext的一部分,影响主进程。构建一个SpringApplication对象并执行其run方法。在这里,最常规的跳羚项目开始了。
#4
最终的解决方案是通过订阅spring的容器刷新事件#5来完成静态数据的加载,因为jar包启动和war包启动都需要调用spring的核心方法——refresh。刷新完成后,将抛出ContextRefreshedEvent,订阅该事件的所有bean都将收到该事件。这里,将执行一些操作来完成一些数据加载
#
本文来自不茫然未来投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/642182.html