SpringBoot | Tomcat啟動(dòng) SpringBoot項(xiàng)目

1. SpringBoot 項(xiàng)目調(diào)整

1.1 Pom修改

<!-- 將packaging 打包方式換成 war包-->
<packaging>war </packaging>


<!-- 將原來的內(nèi)置tomcat依賴scope改為provided-->
<!-- 內(nèi)置tomcat -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

1.2 修改 啟動(dòng)類

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    
    public static void main(String[] args) {
        SpringApplication.run(ZxblogApplication.class, args);
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}

2. 用外部tomcat啟動(dòng)服務(wù)注意事項(xiàng)

2.1 失效配置

// 端口失效
server.port=8000      
//文件上傳/請(qǐng)求內(nèi)容 大小失效 需要在tomcat中配置
spring.servlet.multipart.max-file-size=10MB   
spring.servlet.multipart.max-request-size=10MB

2.1 * Filter 需要調(diào)整

Filter 依賴屬性注入為null
如果項(xiàng)目中使用到Filter 并且有 依賴屬性 需要手動(dòng)注入屬性 如下圖

image.png

代碼

  if (redisService==null) {
            BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext());
            redisService =  factory.getBean(RedisService.class);
        }

Filter 需要實(shí)現(xiàn) init destroy 方法
在使用Filer 的時(shí)候還需要注意 實(shí)現(xiàn) init 與 destroy 方法 不然用tomcat 啟動(dòng)會(huì)報(bào)錯(cuò) 如下入圖

image.png

2.3 兩種方式啟動(dòng)流程區(qū)別 以及失效原因

兩種方式啟動(dòng)流程區(qū)別:

  • SpringBoot內(nèi)置Tomcat 啟動(dòng) jar 包: 執(zhí)行SpringBootApplication 的run() 方法, 然后啟動(dòng)IOC容器,然后創(chuàng)建嵌入式Servlet 容器。

  • 外部Tomcat 啟動(dòng) SpringBoot war 包: 先啟動(dòng)創(chuàng)建Servlet 容器,然后再啟動(dòng)SpringBoot應(yīng)用(SpringBootServletInitializer) ,然后再啟動(dòng)Spring IOC 容器(這里不會(huì)在創(chuàng)建Servlet容器)。

詳細(xì)啟動(dòng)流程區(qū)別
SpringBoot內(nèi)置Tomcat 啟動(dòng) jar 包: 我們在創(chuàng)建SpringBoot 工程的時(shí)候,會(huì)以來spring-boot-starter-web,從而可以使用SpringBoot 內(nèi)置Web容器(默認(rèn)tomcat),通過分析SpringBoot 啟動(dòng)流程,SpringApplication.run 會(huì)打印Banner 后, 通過 createApplicaionContext() 創(chuàng)建 ApplicationContext 容器(Spring IOC 容器),然后通過refreshContext(context) 方法刷新Spring容器,此時(shí)會(huì)獲取嵌入式的Servlet 容器,有容器工廠創(chuàng)建Servlet。也就是以上的 先啟動(dòng)Spring 在 創(chuàng)建Servlet 容器。

外部Tomcat 啟動(dòng) SpringBoot war 包: 當(dāng)我們將SpringBoot 項(xiàng)目改造為 Tomcat 啟動(dòng)項(xiàng)目的時(shí)候, 會(huì)在啟動(dòng)類上 繼承SpringBootServletInitializer ,在Tomcat 啟動(dòng)的時(shí)候 會(huì)執(zhí)行SpringBootServletInitializer 的 onStartup 方法,然后onStartup方法會(huì)通過 createRootApplication 方法來執(zhí)行 run 方法, 接下來或跟jar包 啟動(dòng) run 方法的過程一樣了, 創(chuàng)建IOC 容器并返回 ,只是 war包形式的應(yīng)用 在創(chuàng)建IOC 容器的過程中,不會(huì)在創(chuàng)建Servlet 容器了。 這也是servlet 配置失效,F(xiàn)ilter 屬性無法注入的原因。

3. 總結(jié)

在將SpringBoot 項(xiàng)目改造為可以通過外部Tomcat 啟動(dòng)的后, 我們需要注意 servlet 配置 與Filter 屬性注入的失效問題 應(yīng)該還有其他問題 暫時(shí)我還沒遇到大家可以多多評(píng)論

項(xiàng)目啟動(dòng)后 項(xiàng)目端口不在是你配置的端口 還是會(huì)變成8080 還需要加 項(xiàng)目名 才能訪問到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容