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启动过程分析