关于 SpringBootServletInitializer

1. 问题

今日查看 一个新项目,发现在SpringBoot的启动类下面有一个以前没见过的类 TCMServletInitializer 它继承自 SpringBootServletInitializer, 并且只重写了其中的configure方法。
关于 SpringBootServletInitializer_第1张图片
那么 SpringBootServletInitializer 类到底是干什么用的?

2. SpringBootServletInitializer

进入 SpringBootServletInitializer.class,我们查看其重写方法 onStartUp,其中主要逻辑就是创建根应用上下文(createRootApplicationContext)。
关于 SpringBootServletInitializer_第2张图片

3. createRootApplicationContext

继续进入方法 createRootApplicationContext :
关于 SpringBootServletInitializer_第3张图片
阅读源码可以发现,其实它就是在构建一个SpringBoot应用,其中的builder.main()设置了应用的main方法类,同时我们自己继承成自 SpringBootServletInitializer 类的 TCMServletInitializer 重写的configure方法也在这里进行了调用,作用我们可以进入方法看看注释:
关于 SpringBootServletInitializer_第4张图片
翻译过来就是“配置应用程序。通常情况下,您只需要添加源(例如配置类),因为其他设置具有合理的默认值。您可以选择(例如)添加默认的命令行参数,或者设置活动的Spring配置文件。”

4. 回调

最后,我们是从onStartUp方法开始分析的,那么该方法是在哪里被调用呢?查看本项目,另一方面它是通过重写 SpringBootServletInitializer 的configure方法,证明其是通过war包的形式放置与Tomcat中部署运行的。

我们看到tomcat源码中ServletContainerInitializer接口(这是servlet的接口)。确切的说,Spring boot是通过ServletContainerInitializer接口来完成的回调。
关于 SpringBootServletInitializer_第5张图片
查看其中的一个实现类TomcatStarter.class中实现的方法逻辑可以发现,在Tomcat中通过 ServletContainerInitializer 接口中的onStartUp方法回调了 SpringBootServletInitializer 的onStartUp方法。
关于 SpringBootServletInitializer_第6张图片

你可能感兴趣的:(java,spring,spring,boot)