百科知识

Spring框架原理及流程深度解析:SpringBoot启动机制图文详解

Spring框架原理及流程深度解析:SpringBoot启动机制图文详解

尽管Spring Boot目前已经成为Java开发领域的标配,但其内涵和细节仍然有很多值得探索的地方。Spring Boot本质上仍然是基于传统的Spring框架,其新颖之处在于通过一系列的starter简化了配置流程。许多关于Spring Boot的深层次问题,仍然需要回归到Spring本身去寻找答案。

今天,我们来探讨一个经典的问题:Spring Boot的启动原理是什么?

Spring Boot的启动过程始于标注了@SpringBootApplication注解的启动类。这个注解是Spring Boot的核心,它组合了多个常见注解的功能。

我们主要关注的是@EnableAutoConfiguration这个注解,它表示开启自动化配置。接下来,我们来看看这个注解是如何实现自动化配置的。在这个过程中,@EnableAutoConfiguration扮演着关键角色,它主要依赖于两个注解:@AutoConfigurationPackage和@Import。

@AutoConfigurationPackage用于自动扫描各种第三方的注解。而@Import则是导入AutoConfigurationImportSelector配置类,这个配置类负责加载各种自动化配置类。

AutoConfigurationImportSelector类是实现自动化配置的关键,其过程可以分为以下几个步骤:

1. 通过process方法开始处理,确认自动化配置是否已经开启。

2. 扫描并获取所有的候选自动化配置类。这些候选的自动化配置类主要来自两个地方:一是classpath下的META-INF/spring.factories文件中定义的,二是Spring Boot自带的自动化配置类。

3. 对候选的自动化配置类进行过滤,移除重复的以及被排除的配置类。

4. 检查被排除的自动化配置类是否有问题,如果有问题则抛出异常。

5. 确定最终的自动化配置类列表,并触发自动配置事件。

在这个过程中,涉及到的源码方法命名清晰,有助于我们快速理解其功能。例如,isEnabled方法用于判断自动化配置是否开启,getCandidateConfigurations方法用于获取所有的候选自动化配置类等。

在加载所有的自动化配置类之后,我们需要确定哪些配置类会生效。这取决于你的项目是否使用了特定的依赖。例如,如果项目中并未使用Redis,那么RedisAutoConfiguration这个用于自动配置Redis的类就不会生效。这一过程是通过getConfigurationClassFilter().filter(configurations)来完成的。

为了理解这个过程,我们需要了解一些背景知识。我们的项目中有很多自动化配置类,每一类都会依赖其他类才能生效。这些依赖关系存在于spring-boot-autoconfigure-3.0.6.jar中的META-INF/spring-autoconfigure-metadata.properties文件中。以RabbitAnnotationDrivenConfiguration类的生效条件为例,它依赖于项目中必须存在EnableRabbit类。

了解了这些背景知识后,我们更容易理解接下来的内容。来看getConfigurationClassFilter方法,这个方法用于获取过滤器,这些过滤器主要是AutoConfigurationImportFilter类型的,包括OnClassCondition、OnWebApplicationCondition和OnBeanCondition。这些过滤器的名字已经暗示了它们各自的作用:判断classpath下是否存在某个类、判断当前系统环境是否是一个Web环境以及判断当前系统下是否存在某个Bean。

接下来执行filter方法,这个过程会遍历这三个过滤器,并与144个自动化配置类进行匹配。如果某个自动化配置类所需要的条件得到满足,则保留这个配置类,否则就移除。这样就得到了需要进行自动化配置的类列表。通过fireAutoConfigurationImportEvents方法触发自动化配置类导入事件。


Spring框架原理及流程深度解析:SpringBoot启动机制图文详解

你可能也会喜欢...