Spring Boot的自动配置为我们提供了快捷方便的方式来运行Spring应用,但很多开发者对其内部启动原理还不是很明白。这篇博客旨在解开Spring Boot的神秘面纱,帮助大家理解它的启动原理。
入口类和注解
我们的Spring Boot应用通常从一个主类开始,这个类包含一个main方法,以及一些注解:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication注解和SpringApplication.run方法是启动应用的关键。下面我们来详细解读。
@SpringBootApplication背后的秘密
@SpringBootApplication是一个复合注解,包含了许多其他注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
public @interface SpringBootApplication {
...
}
其中,最重要的三个注解是@Configuration,@EnableAutoConfiguration和@ComponentScan。
@Configuration
@Configuration是JavaConfig的标志,表示这个类是一个配置类。与XML配置相比,JavaConfig提供了一种类型安全的配置方式。
例如,下面的XML配置:
<bean id="mockService" class="..MockServiceImpl">
...
</bean>
可以替换为如下的JavaConfig配置:
@Configuration
public class MockConfiguration{
@Bean
public MockService mockService(){
return new MockServiceImpl();
}
}
@ComponentScan
@ComponentScan注解告诉Spring在哪些地方寻找组件和配置。如果不设置basePackages属性,Spring将从声明@ComponentScan的类所在的包开始扫描。
@EnableAutoConfiguration
@EnableAutoConfiguration注解让Spring Boot根据应用所声明的依赖来对Spring框架进行自动配置。它是通过@Import注解实现的,导入了一个类EnableAutoConfigurationImportSelector,它会读取META-INF/spring.factories文件,获取所有的自动配置类,然后将符合条件的配置类加载到IoC容器中。
启动流程

-
调用
SpringApplication.run方法,创建SpringApplication对象。 -
调用
SpringApplication的run方法,开始执行真正的启动流程。 -
创建
ApplicationContext,这是Spring应用的上下文。 -
执行
ApplicationContext的refresh方法,完成Bean的创建和加载。 -
通过
@ComponentScan注解,Spring会扫描应用的基础包下以及子包下的所有类,并且在这个过程中识别出Spring的@Component,@Service,@Controller,@Repository等注解,然后将这些类作为Bean定义信息加载到IoC容器中。 -
接下来,通过
@EnableAutoConfiguration注解,Spring Boot会自动配置应用。这个过程实际上是通过加载spring.factories文件中定义的所有EnableAutoConfiguration类,并检查它们的条件。只有当条件满足时,这些类才会被加载到IoC容器中。 -
执行
run方法的后续逻辑,包括执行命令行Runner、初始化应用监听器等。 -
最后,如果Spring应用成功启动,
SpringApplication的run方法会返回一个ApplicationContext实例。
小结
Spring Boot的启动原理是基于Spring Framework的基础之上,通过提供自动配置和各种Starter的支持,使得Spring应用的构建更加快捷、便捷。尽管Spring Boot做了很多自动化的工作,但了解其启动原理对我们深入理解Spring Boot以及排查问题是非常有益的。希望通过这篇博客,你对Spring Boot的启动原理有了更深入的了解。
参考资料
- Spring Boot官方文档
- Spring Boot启动原理深入解析
- Spring Boot启动过程分析



















