面试题答案
一键面试Spring Boot自动配置基本原理
- 核心机制 - 条件化配置:Spring Boot自动配置基于条件化配置(Conditional Configuration)机制。通过
@Conditional
注解及其众多衍生注解(如@ConditionalOnClass
、@ConditionalOnBean
等),Spring Boot能够根据运行时的条件来决定是否应用某个配置。例如,@ConditionalOnClass
用于判断类路径下是否存在某个特定的类,如果存在,则相应的配置生效;否则,配置被忽略。 - 配置类加载流程:
- 启动Spring Boot应用时,
SpringApplication
会引导应用启动过程。它首先会扫描所有META-INF/spring.factories
文件。 - 在这些文件中,定义了各种自动配置类的全限定名。Spring Boot会将这些自动配置类加载到Spring容器中。
- 然后,自动配置类中的配置方法会根据其条件化注解的判断结果,决定是否向Spring容器中注册Bean。
- 启动Spring Boot应用时,
确定哪些配置类应该被加载
- 基于类路径的判断:
- @ConditionalOnClass:当类路径下存在指定的类时,该配置类才会被考虑加载。比如,Spring Boot的
DataSourceAutoConfiguration
配置类使用了@ConditionalOnClass(HikariDataSource.class)
,这意味着只有当HikariCP(HikariDataSource
类所在的库)在类路径下时,DataSourceAutoConfiguration
才可能被加载来配置数据源相关的Bean。
- @ConditionalOnClass:当类路径下存在指定的类时,该配置类才会被考虑加载。比如,Spring Boot的
- 基于Bean的判断:
- @ConditionalOnBean:当Spring容器中已经存在指定类型的Bean时,该配置类才会被加载。例如,如果某个配置类依赖于一个自定义的
UserService
Bean,那么可以使用@ConditionalOnBean(UserService.class)
,只有当UserService
Bean存在于容器中,该配置类才会生效。 - @ConditionalOnMissingBean:与
@ConditionalOnBean
相反,当Spring容器中不存在指定类型的Bean时,该配置类才会被加载。这在自定义Bean覆盖默认自动配置的Bean时很有用,例如可以自定义一个MyDataSource
Bean,当容器中不存在MyDataSource
Bean时,相关的默认数据源配置类才会加载。
- @ConditionalOnBean:当Spring容器中已经存在指定类型的Bean时,该配置类才会被加载。例如,如果某个配置类依赖于一个自定义的
- 基于属性的判断:
- @ConditionalOnProperty:根据配置文件(如
application.properties
或application.yml
)中的属性值来决定是否加载配置类。例如,@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
表示只有当配置文件中有myapp.feature.enabled=true
时,对应的配置类才会被加载。
- @ConditionalOnProperty:根据配置文件(如
- 基于环境的判断:
- @ConditionalOnWebApplication:用于判断当前应用是否是Web应用。如果是Web应用,相关的Web配置类(如
WebMvcAutoConfiguration
)会被加载,以配置Spring MVC相关的功能。有不同的取值(Servlet
、Reactive
等),可以更细粒度地判断Web应用类型。
- @ConditionalOnWebApplication:用于判断当前应用是否是Web应用。如果是Web应用,相关的Web配置类(如