1. 簡介
Spring Boot 是一個優秀的框架,可用於快速創建各種用例的全新 Java 應用程序。其中最受歡迎的應用是作為 Web 服務器,利用支持的眾多嵌入式 Servlet 容器和模板引擎。
然而,Spring Boot 還有許多用途不需要 Web 服務器:命令行應用程序、任務調度、批量或流處理、無服務器應用程序等等。
在本教程中,我們將探討在不使用 Web 服務器的情況下使用 Spring Boot 的各種方法。
2. 使用依賴項
要防止 Spring Boot 應用程序啓動嵌入式 Web 服務器,最簡單的方法是不要在依賴項中包含 Web 服務器啓動器。
這意味着不要在 Maven POM 文件或 Gradle 構建文件中包含 spring-boot-starter-web 依賴項。相反,我們應該使用更基本的 spring-boot-starter 依賴項。
請記住,Tomcat 依賴項可能作為傳遞依賴項包含在我們的應用程序中。在這種情況下,我們可能需要排除提供它的依賴項中的 Tomcat 庫。
3. 修改 Spring 應用
另一種禁用 Spring Boot 內嵌 Web 服務器的方法是使用代碼。我們可以使用 SpringApplicationBuilder:
new SpringApplicationBuilder(MainApplication.class)
.web(WebApplicationType.NONE)
.run(args);我們可以使用對 SpringApplication 的引用:
SpringApplication application = new SpringApplication(MainApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);無論採用哪種方式,我們能夠利用 servlet 和 container API 在 classpath 上可用,從而獲得優勢。這意味着我們仍然可以在不啓動 web 服務器的情況下使用 web 服務器庫。這在例如,我們希望使用它們編寫測試或在自己的代碼中使用其 API 時非常有用。
4. 使用應用程序屬性
使用代碼禁用 Web 服務器是一種靜態選項,無論我們將其部署到何處,都會影響我們的應用程序。但是,如果我們要根據特定情況創建 Web 服務器,該怎麼辦?
在這種情況下,我們可以使用 Spring 應用程序屬性:
spring.main.web-application-type=none或者使用等效的 YAML:
spring:
main:
web-application-type: none這種方法的優勢在於,我們可以條件啓用 Web 服務器。
通過使用 Spring 配置文件或條件表達式,我們可以控制 Web 服務器在不同部署環境中的行為。
例如,我們可以僅在開發環境中運行 Web 服務器,以暴露指標或其他 Spring 端點,同時在生產環境中禁用它以出於安全考慮。
請注意,較早版本的 Spring Boot 使用一個名為 web-environment 的 boolean 屬性來啓用和禁用 Web 服務器。隨着 Spring Boot 中傳統和反應式容器的採用,該屬性已被重命名,現在使用枚舉。
5. 結論
有許多原因可以促使我們創建 Spring Boot 應用程序而不使用 Web 服務器。在本教程中,我們已經看到了多種實現方法。每種方法都有其自身的優缺點,因此我們應該選擇最符合我們需求的方案。