Springboot启动流程
Spring Boot 启动流程概述
- 定义:
- Spring Boot 是一个快速开发框架,简化了 Spring 应用的配置和部署。其启动流程涉及从运行
main
方法到应用完全初始化,自动完成依赖注入、配置加载、容器初始化等步骤。 - 核心作用:
- 提供嵌入式服务器(如 Tomcat)、自动配置(Auto-Configuration)、依赖管理,快速启动 Spring 应用。
- 核心点:
- Spring Boot 启动基于
SpringApplication
类,通过初始化、环境配置、容器创建和自动配置等步骤完成应用启动。
1. Spring Boot 启动流程
Spring Boot 应用的启动流程可以分为以下关键步骤:
(1) 创建 SpringApplication 实例
- 触发点:
- 运行
main
方法,调用SpringApplication.run()
。 - 示例:
java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 过程:
- 初始化
SpringApplication
对象,设置:- 资源加载器(
ResourceLoader
):加载配置文件、类路径资源。 - 主配置类(
primarySources
):通常是@SpringBootApplication
标注的类。 - 应用类型:推断应用类型(Servlet、Reactive 或普通 Java 应用)。
- 初始化器(
ApplicationContextInitializer
):自定义上下文初始化。 - 监听器(
ApplicationListener
):监听启动事件。
- 资源加载器(
- 加载
META-INF/spring.factories
中的ApplicationContextInitializer
和ApplicationListener
。
(2) 准备环境(Environment)
- 作用:
- 配置运行时环境,加载属性和配置文件。
- 过程:
- 创建
ConfigurableEnvironment
(通常StandardEnvironment
或StandardServletEnvironment
)。 - 加载配置文件:
application.properties
或application.yml
(默认路径:classpath:/
,file:./
等)。- 命令行参数(
--key=value
)。 - 系统属性(
System.getProperties()
)。 - 环境变量。
- 激活 Profile(如
spring.profiles.active=dev
)。 - 发布
ApplicationEnvironmentPreparedEvent
事件,通知监听器。
(3) 创建应用上下文(ApplicationContext)
- 作用:
- 初始化 Spring 容器,管理 Bean 和依赖。
- 过程:
- 根据应用类型创建上下文:
- Servlet 应用:
AnnotationConfigServletWebServerApplicationContext
。 - Reactive 应用:
AnnotationConfigReactiveWebServerApplicationContext
。 - 非 Web 应用:
AnnotationConfigApplicationContext
。
- Servlet 应用:
- 配置上下文:
- 设置环境(
Environment
)。 - 应用初始化器(
ApplicationContextInitializer
)。 - 加载主配置类(
@SpringBootApplication
)。
- 设置环境(
- 发布
ApplicationContextInitializedEvent
。
(4) 自动配置(Auto-Configuration)
- 作用:
- 根据类路径中的依赖自动配置 Spring Bean(如数据源、Web 服务器)。
- 过程:
- 扫描
META-INF/spring.factories
中的EnableAutoConfiguration
条目。 - 加载
@AutoConfiguration
类(如DataSourceAutoConfiguration
)。 - 根据条件注解(
@ConditionalOnClass
、@ConditionalOnMissingBean
等)决定是否应用配置。 - 示例:
- 依赖
spring-boot-starter-web
→ 自动配置嵌入式 Tomcat 和DispatcherServlet
。 - 依赖
spring-boot-starter-data-jpa
→ 自动配置DataSource
和EntityManager
。
- 依赖
- 发布
ApplicationPreparedEvent
。
(5) 刷新上下文(Refresh Context)
- 作用:
- 初始化 Spring 容器,加载和注册所有 Bean。
- 过程:
- 调用
AbstractApplicationContext.refresh()
,执行:- BeanFactory 准备:创建
DefaultListableBeanFactory
,配置 Bean 定义。 - Bean 定义加载:扫描
@Component
、@Service
、@Controller
等注解,注册 Bean 定义。 - Bean 实例化:创建 Bean 实例,执行依赖注入(
@Autowired
)。 - 后处理器:执行
BeanPostProcessor
(如 AOP、事务)。 - 初始化嵌入式服务器:
- 创建并启动嵌入式 Web 服务器(如 Tomcat、Jetty)。
- 配置
DispatcherServlet
(Web 应用)。 - 事件发布:发布
ContextRefreshedEvent
。
- BeanFactory 准备:创建
- 处理
@PostConstruct
方法和InitializingBean
初始化逻辑。
(6) 启动完成
- 作用:
- 应用完全启动,接受请求或执行逻辑。
- 过程:
- 发布
ApplicationStartedEvent
和ApplicationReadyEvent
。 - 执行
CommandLineRunner
和ApplicationRunner
(自定义启动后逻辑)。 - 示例:
java @Component public class MyRunner implements CommandLineRunner { @Override public void run(String... args) { System.out.println("Application started!"); } }
- Web 应用开始监听端口(如
8080
)。
2. 启动流程图
main() -> SpringApplication.run()
|
v
1. 创建 SpringApplication
- 设置主配置类、加载 spring.factories
|
v
2. 准备 Environment
- 加载 application.properties/yml、Profile
|
v
3. 创建 ApplicationContext
- 根据类型创建 Servlet/Reactive 上下文
|
v
4. 自动配置
- 加载 spring.factories 的 AutoConfiguration
|
v
5. 刷新上下文
- 加载 Bean、初始化服务器、依赖注入
|
v
6. 启动完成
- 发布事件、执行 Runner、监听端口
3. 关键组件与机制
- @SpringBootApplication:
- 组合注解,包含:
@SpringBootConfiguration
:标记配置类。@EnableAutoConfiguration
:启用自动配置。@ComponentScan
:扫描@Component
等注解。
- SpringApplication:
- 启动入口,管理初始化、事件发布。
- Auto-Configuration:
- 基于条件(
@Conditional
)动态配置 Bean,简化开发。 - Embedded Server:
- 默认 Tomcat,支持 Jetty、Undertow,自动启动。
- Event Listener:
- 通过
ApplicationListener
监听启动事件(如ApplicationStartedEvent
)。 - Spring Factories:
META-INF/spring.factories
定义自动配置、初始化器、监听器。
4. 代码示例
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
class MyRunner implements CommandLineRunner {
@Override
public void run(String... args) {
System.out.println("Application is running!");
}
}
配置文件(application.yml
):
server:
port: 8080
spring:
profiles:
active: dev
运行流程:
1. main
调用 SpringApplication.run()
。
2. 加载 Application
类,初始化 SpringApplication
。
3. 读取 application.yml
,激活 dev
环境。
4. 创建 AnnotationConfigServletWebServerApplicationContext
。
5. 自动配置 Tomcat、DispatcherServlet
等。
6. 刷新上下文,注册 MyRunner
Bean。
7. 启动 Tomcat(端口 8080),执行 MyRunner.run()
。
5. 注意事项
- 自动配置冲突:
- 自定义配置可能覆盖自动配置,需检查
@Conditional
条件。 - 示例:自定义
DataSource
可能禁用DataSourceAutoConfiguration
。 - 启动性能:
- 扫描过多 Bean 或复杂配置可能导致启动慢。
- 优化:缩小
@ComponentScan
范围、延迟加载(@Lazy
)。 - 资源泄漏:
- 确保关闭上下文(
SpringApplication
会自动处理)。 - Profile 使用:
- 通过
spring.profiles.active
切换环境(如dev
、prod
)。 - 异常处理:
- 启动失败(如端口占用)抛
ApplicationFailedEvent
,需捕获。 - 依赖管理:
- 使用
spring-boot-starter-*
确保版本兼容。
6. 面试角度
- 问“Spring Boot 启动流程”:
- 提
SpringApplication.run()
、环境准备、上下文创建、自动配置、刷新上下文、启动完成,说明每步作用。 - 问“@SpringBootApplication 作用”:
- 提组合注解(
@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
)。 - 问“自动配置原理”:
- 提
spring.factories
、@Conditional
条件、加载AutoConfiguration
。 - 问“嵌入式服务器如何启动”:
- 提自动配置
ServletWebServerFactory
,刷新上下文时启动 Tomcat。 - 问“如何优化启动”:
- 提减少扫描、延迟加载、精简依赖。
- 问“事件监听”:
- 提
ApplicationListener
监听ApplicationStartedEvent
等,举CommandLineRunner
示例。
7. 总结
- 启动流程:
- 创建
SpringApplication
→ 准备环境(application.yml
)→ 创建上下文 → 自动配置(spring.factories
)→ 刷新上下文(Bean 加载、服务器启动)→ 启动完成(事件、Runner)。 - 关键组件:
@SpringBootApplication
(配置/扫描)、自动配置(条件加载)、嵌入式服务器(Tomcat)、事件监听(ApplicationListener
)。- 机制:
- 基于 Spring 容器,结合自动配置和嵌入式服务器,简化开发。
- 面试建议:
- 提流程步骤、核心注解(
@SpringBootApplication
)、自动配置原理、代码示例(main
+Runner
)、优化(扫描/延迟),清晰展示理解。
If you want to dive deeper into any part (e.g., auto-configuration source code, embedded server initialization, or event listener mechanisms), let me know, and I can further refine the answer!