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
将修改后的值添加到环境中。