🎓博主介绍:Java、Python、js全栈开发 “多面手”,精通多种编程语言和技术,痴迷于人工智能领域。秉持着对技术的热爱与执着,持续探索创新,愿在此分享交流和学习,与大家共进步。
📖DeepSeek-行业融合之万象视界(附实战案例详解100+)
📖全栈开发环境搭建运行攻略:多语言一站式指南(环境搭建+运行+调试+发布+保姆级详解)
👉感兴趣的可以先收藏起来,希望帮助更多的人
SpringBoot高频面试15题:自动配置原理与Starter机制深度剖析
一、Spring Boot 简介
1.1 Spring Boot 定义
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的配置方式,使得开发人员可以摆脱复杂的 XML 配置,快速上手开发 Spring 应用。
1.2 Spring Boot 优势
- 快速搭建项目:通过 Spring Initializr 可以快速生成项目骨架,集成各种常用依赖。
- 内嵌服务器:内置 Tomcat、Jetty 等服务器,无需额外部署。
- 自动配置:根据项目依赖自动配置 Spring 应用,减少开发人员的配置工作。
二、Spring Boot 自动配置原理
2.1 核心注解 @SpringBootApplication
@SpringBootApplication 是一个组合注解,包含了 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootConfiguration:本质上是@Configuration注解,用于标识当前类是一个配置类。@EnableAutoConfiguration:开启自动配置功能,它会根据项目中引入的依赖自动配置 Spring 应用。@ComponentScan:扫描指定包及其子包下的组件,如@Component、@Service、@Repository等。
2.2 @EnableAutoConfiguration 原理
@EnableAutoConfiguration 注解通过 @Import(AutoConfigurationImportSelector.class) 导入 AutoConfigurationImportSelector 类。AutoConfigurationImportSelector 类会从 META - INF/spring.factories 文件中读取所有的自动配置类,并根据条件进行筛选和加载。
2.3 条件注解
Spring Boot 提供了一系列条件注解,用于控制自动配置类的加载。例如:
@ConditionalOnClass:当类路径下存在指定的类时,配置类才会生效。
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
// 配置数据源的相关代码
}
@ConditionalOnMissingBean:当容器中不存在指定类型的 Bean 时,配置类才会生效。
三、Spring Boot Starter 机制
3.1 Starter 定义
Starter 是一种特殊的依赖,它将一组相关的依赖打包在一起,方便开发人员使用。例如,spring - boot - starter - web 包含了 Spring MVC、Tomcat 等相关依赖。
3.2 Starter 分类
- 官方 Starter:由 Spring 官方提供,命名格式为
spring - boot - starter - *,如spring - boot - starter - data - jpa。 - 自定义 Starter:开发人员可以根据自己的需求创建自定义 Starter,命名格式建议为
*-spring-boot-starter。
3.3 自定义 Starter 步骤
3.3.1 创建 Maven 项目
创建一个新的 Maven 项目,添加必要的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>
3.3.2 创建自动配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Autowired
private MyProperties properties;
@Bean
@ConditionalOnMissingBean
public MyService myService() {
return new MyService(properties.getMessage());
}
}
3.3.3 创建配置属性类
@ConfigurationProperties(prefix = "my.service")
public class MyProperties {
private String message = "Default Message";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3.3.4 创建 META - INF/spring.factories 文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration
四、Spring Boot 高频面试 15 题
4.1 什么是 Spring Boot 自动配置?
Spring Boot 自动配置是指 Spring Boot 根据项目中引入的依赖自动配置 Spring 应用的功能。它通过 @EnableAutoConfiguration 注解开启,从 META - INF/spring.factories 文件中读取自动配置类,并根据条件进行筛选和加载。
4.2 @SpringBootApplication 注解的作用是什么?
@SpringBootApplication 是一个组合注解,包含了 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。它的作用是开启 Spring Boot 的自动配置、将当前类标记为配置类并扫描指定包及其子包下的组件。
4.3 Spring Boot 自动配置的原理是什么?
Spring Boot 自动配置的核心是 @EnableAutoConfiguration 注解,它通过 @Import(AutoConfigurationImportSelector.class) 导入 AutoConfigurationImportSelector 类。AutoConfigurationImportSelector 类会从 META - INF/spring.factories 文件中读取所有的自动配置类,并根据条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean 等)进行筛选和加载。
4.4 什么是 Spring Boot Starter?
Spring Boot Starter 是一种特殊的依赖,它将一组相关的依赖打包在一起,方便开发人员使用。官方 Starter 命名格式为 spring - boot - starter - *,自定义 Starter 命名格式建议为 *-spring-boot-starter。
4.5 如何创建自定义 Spring Boot Starter?
创建自定义 Spring Boot Starter 的步骤如下:
- 创建 Maven 项目,添加必要的依赖。
- 创建自动配置类,使用条件注解控制配置类的加载。
- 创建配置属性类,使用
@ConfigurationProperties注解绑定配置属性。 - 创建
META - INF/spring.factories文件,指定自动配置类的全限定名。
4.6 Spring Boot 如何实现内嵌服务器?
Spring Boot 通过依赖管理和自动配置实现内嵌服务器。例如,当引入 spring - boot - starter - web 依赖时,默认会引入 Tomcat 服务器。在启动 Spring Boot 应用时,会自动启动内嵌的 Tomcat 服务器。
4.7 如何禁用 Spring Boot 的自动配置?
可以使用 @SpringBootApplication 注解的 exclude 属性来禁用指定的自动配置类。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4.8 Spring Boot 自动配置类的加载顺序是怎样的?
Spring Boot 自动配置类的加载顺序是由 @AutoConfigureOrder 和 @AutoConfigureBefore、@AutoConfigureAfter 注解控制的。@AutoConfigureOrder 可以指定自动配置类的加载顺序,@AutoConfigureBefore 和 @AutoConfigureAfter 可以指定某个自动配置类在其他自动配置类之前或之后加载。
4.9 什么是条件注解,Spring Boot 中有哪些常用的条件注解?
条件注解用于控制 Bean 的创建和配置类的加载。Spring Boot 中常用的条件注解有:
@ConditionalOnClass:当类路径下存在指定的类时,配置类才会生效。@ConditionalOnMissingClass:当类路径下不存在指定的类时,配置类才会生效。@ConditionalOnBean:当容器中存在指定类型的 Bean 时,配置类才会生效。@ConditionalOnMissingBean:当容器中不存在指定类型的 Bean 时,配置类才会生效。
4.10 Spring Boot Starter 与传统 Maven 依赖有什么区别?
Spring Boot Starter 是一种特殊的 Maven 依赖,它将一组相关的依赖打包在一起,方便开发人员使用。传统 Maven 依赖需要开发人员手动添加每个依赖,而使用 Starter 可以减少依赖管理的工作量。
4.11 Spring Boot 自动配置是如何处理配置属性的?
Spring Boot 自动配置通过 @ConfigurationProperties 注解来处理配置属性。开发人员可以创建一个配置属性类,使用 @ConfigurationProperties 注解绑定配置属性,然后在自动配置类中注入该配置属性类。
4.12 如何调试 Spring Boot 自动配置?
可以通过在启动时添加 --debug 参数来调试 Spring Boot 自动配置。启动应用后,会输出详细的自动配置报告,包括哪些自动配置类被加载,哪些被排除等信息。
4.13 Spring Boot 自动配置与 Spring 配置有什么关系?
Spring Boot 自动配置是基于 Spring 配置的扩展。Spring Boot 自动配置通过约定大于配置的原则,根据项目中引入的依赖自动配置 Spring 应用,减少了开发人员的配置工作。而传统的 Spring 配置需要开发人员手动编写 XML 或 Java 配置类。
4.14 Spring Boot Starter 可以包含多个自动配置类吗?
可以。一个 Spring Boot Starter 可以包含多个自动配置类,这些自动配置类可以根据不同的条件进行加载,以满足不同的应用场景。
4.15 如何在 Spring Boot 中使用自定义的 Starter?
在 Spring Boot 项目的 pom.xml 文件中添加自定义 Starter 的依赖,然后在配置文件中配置相关属性即可使用自定义 Starter 提供的功能。


396

被折叠的 条评论
为什么被折叠?



