Spring Boot的啓動機制是一個相對複雜但又高度自動化的過程,主要包括以下幾個階段:
-
加載啓動類(Main Class):Spring Boot應用程序的入口是一個Java類,通常稱爲啓動類或主類。該類使用
@SpringBootApplication
註解標記,其中包含了main()
方法,通過該方法啓動應用程序。 -
創建Spring應用程序上下文:在啓動類的
main()
方法中,會創建Spring應用程序上下文(ApplicationContext)。Spring Boot使用自動配置機制,根據類路徑、依賴和各種條件自動配置應用程序上下文,以便儘可能地簡化配置。 -
執行自動配置:Spring Boot根據應用程序的類路徑和依賴,自動配置各種組件,包括Web服務器、數據庫連接池、日誌系統等。這些自動配置是通過條件化的配置類和自動配置類實現的,使得開發人員不需要手動配置大部分常用的組件。
-
掃描組件:Spring Boot會掃描應用程序中的各種組件,包括控制器、服務、存儲庫等,並將它們註冊到應用程序上下文中,以便在運行時進行管理和使用。
-
啓動Web服務器:如果應用程序是一個Web應用程序,Spring Boot會自動啓動內嵌的Web服務器,如Tomcat、Jetty或Undertow,並將應用程序部署到該服務器中。
-
加載配置:Spring Boot會加載應用程序中的配置文件,包括
application.properties
、application.yml
等,並將配置項加載到應用程序上下文中。 -
執行初始化操作:Spring Boot會執行一些初始化操作,如註冊ServletContextListener、初始化數據庫連接池等。
-
啓動應用程序:最後,Spring Boot會啓動應用程序,並開始處理請求或執行其他業務邏輯
在加載配置後、初始化之前修改YAML的值可能會稍微複雜,因爲Spring Boot加載配置文件後,初始化過程是由Spring框架控制的,通常情況下不會直接暴露接口來修改已加載的配置。然而,您仍然可以通過一些技巧來實現這樣的需求。
一種常見的方法是使用EnvironmentPostProcessor
接口。EnvironmentPostProcessor
允許在Spring應用程序上下文創建之前對應用程序的環境進行修改。通過實現EnvironmentPostProcessor
接口,您可以在加載配置文件後修改配置值,然後將修改後的配置值應用到應用程序上下文中。
以下是一個簡單的示例,演示瞭如何使用EnvironmentPostProcessor
來修改YAML文件中的配置值:
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
// 獲取當前環境中的配置屬性
String propertyValue = environment.getProperty("my.property");
// 修改配置屬性的值
if (propertyValue != null) {
propertyValue = "new-value"; // 修改爲新的值
// 將修改後的值添加到環境中
Map<String, Object> newProperties = new HashMap<>();
newProperties.put("my.property", propertyValue);
environment.getPropertySources().addLast(new MapPropertySource("custom-config", newProperties));
}
}
}
在這個示例中,CustomEnvironmentPostProcessor
類實現了EnvironmentPostProcessor
接口,並在postProcessEnvironment()
方法中對環境進行了修改。具體地,它檢查了配置文件中是否存在名爲my.property
的屬性,並將其修改爲新值"new-value"。然後,使用MapPropertySource
將修改後的值添加到環境中。