自定义starter
SpringBoot 自定义 Starter
一、什么是 Spring Boot Starter
1.1 Starter 的本质
Starter 本质上就是一个依赖描述符,它把某个功能所需要的所有依赖都打包在一起,让使用者只需要引入一个 Starter,就能获得完整的功能。
打个比方:你去餐厅点餐,可以一个菜一个菜地点,也可以直接点一个套餐。Starter 就是那个套餐,把主食、配菜、饮料都配好了,拿来就用。
1.2 Starter 的核心价值
价值一:简化依赖管理
不需要考虑这个功能需要哪些依赖、版本是否兼容等问题,一个 Starter 搞定。
价值二:自动配置
引入 Starter 后,Spring Boot 会自动配置好需要的 Bean,开箱即用。
价值三:统一的配置方式
通过 application.properties/yml 就可以配置,不需要写大量的 XML 或 Java 配置类。
二、为什么要自定义 Starter
2.1 企业内部技术组件复用
公司内部开发了一些通用的技术组件,比如:
- 统一的日志收集
- 统一的监控上报
- 统一的认证鉴权
- 统一的异常处理
- 统一的 Redis 客户端封装
如果每个项目都要手动配置一遍,既麻烦又容易出错。封装成 Starter 后,各个业务团队只需要引入依赖,就能自动使用这些功能。
2.2 最佳实践的沉淀
把团队积累的最佳实践固化到 Starter 中,比如:
- 线程池的合理配置
- 数据库连接池的优化参数
- 缓存的合理使用
- 限流降级的统一方案
2.3 降低技术使用门槛
有些技术组件的使用比较复杂,封装成 Starter 后,使用者不需要了解内部细节,只需要简单配置就能使用。
三、自定义 Starter 的核心步骤
3.1 整体流程概览
1. 创建 Starter 工程
↓
2. 定义配置属性类(@ConfigurationProperties)
↓
3. 编写自动配置类(@Configuration + @ConditionalOnXxx)
↓
4. 创建 META-INF/spring.factories 或 spring-boot-autoconfigure.AutoConfiguration.imports
↓
5. 打包发布
↓
6. 其他项目引入使用
3.2 第一步:创建 Starter 工程
命名规范非常重要:
- 官方 Starter:spring-boot-starter-
- 第三方 Starter:{name}-spring-boot-starter
比如你要做一个短信发送的 Starter,应该命名为:sms-spring-boot-starter
项目结构:
通常会创建两个模块:
- xxx-spring-boot-starter:只负责依赖管理,pom 文件里引入 autoconfigure 模块
- xxx-spring-boot-autoconfigure:真正的自动配置逻辑
这样拆分的好处是:使用者可以单独引入 autoconfigure 模块,自己控制配置;也可以引入 starter,享受完全自动配置。
pom.xml 示例:
<!-- starter 模块的 pom.xml -->
<dependencies>
<!-- 引入自动配置模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>sms-spring-boot-autoconfigure</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 引入需要的第三方依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
3.3 第二步:定义配置属性类
使用 @ConfigurationProperties 注解定义配置属性,这样用户就可以在 application.yml 中配置参数。
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/**
* 是否启用短信功能
*/
private boolean enabled = true;
/**
* AccessKey ID
*/
private String accessKeyId;
/**
* AccessKey Secret
*/
private String accessKeySecret;
/**
* 短信签名
*/
private String signName;
/**
* 连接超时时间(毫秒)
*/
private int connectTimeout = 5000;
/**
* 读取超时时间(毫秒)
*/
private int readTimeout = 10000;
// getter 和 setter 省略
}
关键点:
- prefix 定义了配置的前缀
- 提供默认值,让用户可以不配置也能使用
- 添加注释,方便 IDE 提示
3.4 第三步:编写自动配置类
这是 Starter 的核心,负责创建需要的 Bean。
@Configuration
@EnableConfigurationProperties(SmsProperties.class) // 启用配置属性
@ConditionalOnProperty(prefix = "sms", name = "enabled", havingValue = "true", matchIfMissing = true) // 条件生效
public class SmsAutoConfiguration {
@Autowired
private SmsProperties smsProperties;
/**
* 创建短信客户端 Bean
*/
@Bean
@ConditionalOnMissingBean // 如果用户没有自定义,才创建这个 Bean
public SmsClient smsClient() {
SmsClient client = new SmsClient();
client.setAccessKeyId(smsProperties.getAccessKeyId());
client.setAccessKeySecret(smsProperties.getAccessKeySecret());
client.setSignName(smsProperties.getSignName());
client.setConnectTimeout(smsProperties.getConnectTimeout());
client.setReadTimeout(smsProperties.getReadTimeout());
return client;
}
/**
* 创建短信服务 Bean
*/
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(SmsClient.class) // 依赖 SmsClient
public SmsService smsService(SmsClient smsClient) {
return new SmsServiceImpl(smsClient);
}
}
关键注解说明:
@Configuration:声明这是一个配置类@EnableConfigurationProperties:启用配置属性类,并注入到容器@ConditionalOnProperty:根据配置属性决定是否生效@ConditionalOnMissingBean:如果用户没有自定义 Bean,才创建默认的@ConditionalOnBean:依赖某个 Bean 存在时才创建@ConditionalOnClass:类路径中存在某个类时才创建
3.5 第四步:注册自动配置类
方式一:spring.factories(传统方式,Spring Boot 2.x)
在 src/main/resources/META-INF/spring.factories 文件中注册:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.sms.autoconfigure.SmsAutoConfiguration
方式二:AutoConfiguration.imports(新方式,Spring Boot 2.7+)
在 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中注册:
com.example.sms.autoconfigure.SmsAutoConfiguration
注意: Spring Boot 3.x 推荐使用方式二,方式一虽然还支持,但已经不推荐了。
3.6 第五步:提供 IDE 配置提示
为了让用户在编写配置文件时有智能提示,需要生成配置元数据。
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
编译后会自动生成 META-INF/spring-configuration-metadata.json 文件,IDE 就能识别并提供提示了。
3.7 第六步:打包发布
mvn clean install
然后发布到 Maven 仓库(私服或中央仓库)。
3.8 第七步:使用 Starter
1. 引入依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>sms-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2. 配置参数:
sms:
enabled: true
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
sign-name: 你的签名
connect-timeout: 5000
read-timeout: 10000
3. 直接使用:
@Service
public class UserService {
@Autowired
private SmsService smsService;
public void sendVerifyCode(String phone, String code) {
smsService.send(phone, "SMS_123456", Map.of("code", code));
}
}
就这么简单!不需要任何额外配置,Spring Boot 会自动注入 SmsService。
四、自动配置的工作原理
4.1 Spring Boot 如何发现自动配置类
Spring Boot 启动时会执行以下流程:
1. @SpringBootApplication 包含 @EnableAutoConfiguration
↓
2. @EnableAutoConfiguration 通过 @Import 导入 AutoConfigurationImportSelector
↓
3. AutoConfigurationImportSelector 读取 META-INF/spring.factories 或 AutoConfiguration.imports
↓
4. 加载所有的自动配置类
↓
5. 根据 @ConditionalOnXxx 注解判断是否生效
↓
6. 生效的配置类会创建相应的 Bean
4.2 条件注解的执行时机
条件注解在 Spring 容器启动时评估,决定配置类或 Bean 是否生效。
Spring Boot 提供了丰富的条件注解:
| 注解 | 说明 | 使用场景 |
|---|---|---|
| @ConditionalOnClass | 类路径中存在指定的类 | 依赖某个第三方库 |
| @ConditionalOnMissingClass | 类路径中不存在指定的类 | 避免冲突 |
| @ConditionalOnBean | 容器中存在指定的Bean | Bean 之间有依赖关系 |
| @ConditionalOnMissingBean | 容器中不存在指定的Bean | 允许用户自定义覆盖 |
| @ConditionalOnProperty | 配置属性满足条件 | 通过配置开关功能 |
| @ConditionalOnResource | 类路径中存在指定的资源 | 依赖配置文件 |
| @ConditionalOnWebApplication | 当前是 Web 应用 | Web 相关功能 |
| @ConditionalOnNotWebApplication | 当前不是 Web 应用 | 非 Web 功能 |
4.3 配置的优先级
Spring Boot 配置的优先级从高到低:
1. 命令行参数
↓
2. Java 系统属性(System.getProperties())
↓
3. 操作系统环境变量
↓
4. application-{profile}.properties/yml
↓
5. application.properties/yml
↓
6. @PropertySource 指定的配置
↓
7. 默认值(@ConfigurationProperties 中定义的默认值)
用户的配置会覆盖 Starter 中的默认配置。
五、自定义 Starter 的最佳实践
5.1 命名规范
- 不要使用
spring-boot-starter-前缀,这是官方保留的 - 使用
{name}-spring-boot-starter格式 - 名称要清晰,能让人一眼看出功能
5.2 提供合理的默认值
好的 Starter 应该是"零配置"的,用户不配置也能使用。
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
// 提供合理的默认值
private int maxConnections = 100;
private int timeout = 30000;
private boolean enabled = true;
// getter 和 setter
}
5.3 使用 @ConditionalOnMissingBean 允许覆盖
始终使用 @ConditionalOnMissingBean,让用户可以自定义 Bean 覆盖默认实现。
@Bean
@ConditionalOnMissingBean // 关键:允许用户自定义
public SmsService smsService() {
return new DefaultSmsService();
}
用户可以这样覆盖:
@Configuration
public class MyConfig {
@Bean
public SmsService smsService() {
return new MySmsService(); // 自定义实现
}
}
5.4 配置属性要有清晰的文档
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/**
* 是否启用短信功能
* 默认值:true
*/
private boolean enabled = true;
/**
* AccessKey ID,必填
* 从阿里云控制台获取
*/
private String accessKeyId;
// 注释要写清楚:功能、默认值、注意事项
}
5.5 合理使用条件注解
@Configuration
@EnableConfigurationProperties(SmsProperties.class)
// 条件1:类路径中有短信SDK的类
@ConditionalOnClass(SmsClient.class)
// 条件2:配置中启用了短信功能
@ConditionalOnProperty(prefix = "sms", name = "enabled", havingValue = "true", matchIfMissing = true)
public class SmsAutoConfiguration {
// 配置逻辑
}
5.6 提供配置验证
@ConfigurationProperties(prefix = "sms")
@Validated // 启用验证
public class SmsProperties {
@NotBlank(message = "AccessKey ID 不能为空")
private String accessKeyId;
@NotBlank(message = "AccessKey Secret 不能为空")
private String accessKeySecret;
@Min(value = 1000, message = "超时时间不能小于1000毫秒")
private int timeout = 5000;
// getter 和 setter
}
启动时如果配置不合法,会立即报错,避免运行时才发现问题。
5.7 考虑多环境配置
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/**
* 环境配置:dev, test, prod
*/
private String env = "dev";
/**
* 不同环境的配置
*/
private Map<String, EnvConfig> envs = new HashMap<>();
public static class EnvConfig {
private String accessKeyId;
private String accessKeySecret;
// ...
}
}
用户可以这样配置:
sms:
env: ${spring.profiles.active}
envs:
dev:
access-key-id: dev-key
access-key-secret: dev-secret
prod:
access-key-id: prod-key
access-key-secret: prod-secret
5.8 依赖版本管理
在 Starter 的 pom.xml 中明确依赖版本,避免版本冲突。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.10</version>
</dependency>
</dependencies>
</dependencyManagement>
5.9 提供示例项目
创建一个 samples 模块,展示如何使用 Starter,降低学习成本。
5.10 编写单元测试
@SpringBootTest
@TestPropertySource(properties = {
"sms.enabled=true",
"sms.access-key-id=test-key",
"sms.access-key-secret=test-secret"
})
class SmsAutoConfigurationTest {
@Autowired
private SmsService smsService;
@Test
void testSmsServiceAutoConfigured() {
assertNotNull(smsService);
}
@Test
void testSendSms() {
boolean result = smsService.send("13800138000", "SMS_123456", Map.of("code", "1234"));
assertTrue(result);
}
}
六、常见的 Starter 设计模式
6.1 简单类型 Starter
只提供一个核心功能,比如 Redis Starter、短信 Starter。
特点:
- 单一职责
- 配置简单
- 易于理解和使用
6.2 聚合类型 Starter
整合多个功能,比如一个 Web Starter 可能包含 MVC、JSON、Validation 等。
特点:
- 一站式解决方案
- 减少依赖数量
- 适合标准化场景
6.3 扩展类型 Starter
在官方 Starter 基础上增强,比如增强版 Redis Starter(增加限流、分布式锁等功能)。
特点:
- 兼容官方配置
- 提供额外功能
- 可以与官方 Starter 共存
6.4 适配器类型 Starter
为第三方库提供 Spring Boot 适配,比如为 Elasticsearch、MongoDB 等提供 Starter。
特点:
- 封装第三方库的使用
- 提供统一的配置方式
- 降低使用门槛
七、进阶话题
7.1 自动配置的顺序控制
有时候配置类之间有依赖关系,需要控制执行顺序。
@Configuration
@AutoConfigureBefore(DataSourceAutoConfiguration.class) // 在数据源配置之前
public class MyAutoConfiguration {
// ...
}
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class) // 在 Redis 配置之后
public class MyAutoConfiguration2 {
// ...
}
7.2 条件注解的组合使用
@Configuration
@Conditional({
OnClassCondition.class,
OnBeanCondition.class,
OnPropertyCondition.class
})
public class ComplexAutoConfiguration {
// 多个条件同时满足才生效
}
7.3 FailureAnalyzer - 友好的错误提示
当自动配置失败时,提供友好的错误提示。
public class SmsFailureAnalyzer extends AbstractFailureAnalyzer<SmsConfigurationException> {
@Override
protected FailureAnalysis analyze(Throwable rootFailure, SmsConfigurationException cause) {
return new FailureAnalysis(
"短信配置错误:" + cause.getMessage(),
"请在 application.yml 中配置:\n" +
"sms:\n" +
" access-key-id: your-key\n" +
" access-key-secret: your-secret",
cause
);
}
}
在 META-INF/spring.factories 中注册:
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.sms.SmsFailureAnalyzer
7.4 健康检查集成
@Component
@ConditionalOnBean(SmsClient.class)
public class SmsHealthIndicator implements HealthIndicator {
@Autowired
private SmsClient smsClient;
@Override
public Health health() {
try {
if (smsClient.ping()) {
return Health.up()
.withDetail("service", "available")
.build();
}
} catch (Exception e) {
return Health.down()
.withDetail("error", e.getMessage())
.build();
}
return Health.down().build();
}
}
7.5 指标监控集成
@Component
@ConditionalOnBean(MeterRegistry.class)
public class SmsMetrics {
private final Counter successCounter;
private final Counter failureCounter;
private final Timer sendTimer;
public SmsMetrics(MeterRegistry registry) {
this.successCounter = Counter.builder("sms.send.success")
.tag("type", "verification")
.register(registry);
this.failureCounter = Counter.builder("sms.send.failure")
.tag("type", "verification")
.register(registry);
this.sendTimer = Timer.builder("sms.send.duration")
.register(registry);
}
public void recordSuccess() {
successCounter.increment();
}
public void recordFailure() {
failureCounter.increment();
}
public <T> T recordTime(Supplier<T> supplier) {
return sendTimer.record(supplier);
}
}
八、常见面试题解析
8.1 说说自定义 Starter 的核心流程?
回答要点:
- 创建项目:通常是两个模块,starter 负责依赖管理,autoconfigure 负责配置逻辑
- 定义配置属性类:使用 @ConfigurationProperties,让用户可以在配置文件中设置参数
- 编写自动配置类:使用 @Configuration 和各种条件注解,创建需要的 Bean
- 注册自动配置类:在 META-INF/spring.factories 或 AutoConfiguration.imports 中注册
- 打包发布:发布到 Maven 仓库供其他项目使用
8.2 @ConditionalOnMissingBean 的作用是什么?
回答要点:
这个注解的作用是:只有当容器中不存在指定的 Bean 时,才创建这个 Bean。
这是实现"约定优于配置"的关键机制:
- Starter 提供默认实现
- 如果用户自定义了 Bean,就用用户的
- 如果用户没有自定义,就用 Starter 的默认实现
示例:
@Bean
@ConditionalOnMissingBean
public SmsService smsService() {
return new DefaultSmsService(); // 默认实现
}
8.3 Spring Boot 2.7+ 为什么推荐使用 AutoConfiguration.imports 而不是 spring.factories?
回答要点:
主要有以下原因:
- 性能更好:spring.factories 需要解析所有的 key-value 对,而 AutoConfiguration.imports 只需要读取自动配置类列表
- 职责更清晰:spring.factories 承载了太多功能(自动配置、监听器、初始化器等),AutoConfiguration.imports 只负责自动配置
- 更好的模块化:每种功能有自己的文件,不会混在一起
- IDE 支持更好:文件名明确,IDE 可以提供更好的提示和跳转
8.4 如何保证自动配置类的执行顺序?
回答要点:
Spring Boot 提供了以下注解来控制顺序:
- @AutoConfigureBefore:在指定的配置类之前执行
- @AutoConfigureAfter:在指定的配置类之后执行
- @AutoConfigureOrder:通过数字指定顺序(数字越小越先执行)
示例:
@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MyAutoConfiguration {
// 这个配置类会在 DataSourceAutoConfiguration 之后执行
}
8.5 自定义 Starter 和直接写一个配置类有什么区别?
回答要点:
| 对比维度 | 普通配置类 | 自定义 Starter |
|---|---|---|
| 依赖管理 | 需要手动引入所有依赖 | Starter 自动管理依赖 |
| 配置方式 | 需要在每个项目中写配置类 | 引入 Starter 自动配置 |
| 复用性 | 代码复制粘贴,难以维护 | 发布到仓库,统一维护 |
| 灵活性 | 可以随意修改 | 提供配置开关,用户可以覆盖 |
| 适用场景 | 单个项目的特定配置 | 多个项目的通用功能 |
8.6 如何测试自定义的 Starter?
回答要点:
- 单元测试:使用 @SpringBootTest 和 @TestPropertySource 测试自动配置
- 条件测试:测试各种条件注解是否正确生效
- 覆盖测试:测试用户自定义 Bean 是否能正确覆盖默认实现
- 集成测试:创建一个示例项目,真实引入 Starter 测试
示例:
@SpringBootTest
@TestPropertySource(properties = {
"sms.enabled=true",
"sms.access-key-id=test"
})
class SmsAutoConfigurationTest {
@Autowired
private ApplicationContext context;
@Test
void testAutoConfiguration() {
// 验证 Bean 是否被创建
assertNotNull(context.getBean(SmsService.class));
}
}
8.7 starter 和 autoconfigure 模块为什么要分开?
回答要点:
这是官方推荐的最佳实践,原因是:
-
职责分离:
- starter:只负责依赖管理,pom 很简洁
- autoconfigure:只负责配置逻辑,没有额外依赖
-
灵活性:
- 用户可以只引入 autoconfigure,自己管理依赖版本
- 用户可以引入 starter,享受完全自动配置
-
可测试性:
- autoconfigure 模块不依赖具体实现,更容易测试
- 可以单独测试配置逻辑
8.8 如何处理 Starter 中的版本冲突?
回答要点:
-
使用 optional 依赖:非核心依赖标记为 optional,让用户自己选择
<dependency> <groupId>com.example</groupId> <artifactId>some-lib</artifactId> <optional>true</optional> </dependency> -
使用 @ConditionalOnClass:根据类路径中是否存在某个类来决定是否配置
@Configuration @ConditionalOnClass(SomeClass.class) public class SomeAutoConfiguration { // 只有类路径中有 SomeClass 才配置 } -
明确依赖版本:在 Starter 中通过 dependencyManagement 明确依赖版本
-
排除冲突依赖:使用 exclusions 排除冲突的传递依赖
九、真实案例分析
9.1 案例一:Redis Starter 的设计
Spring Boot 官方的 Redis Starter 是一个典型案例:
模块划分:
- spring-boot-starter-data-redis:依赖管理
- spring-boot-autoconfigure:自动配置逻辑
配置属性:
spring:
redis:
host: localhost
port: 6379
password:
database: 0
timeout: 5000
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
自动配置:
- 根据 Lettuce 或 Jedis 客户端的存在自动选择
- 提供 RedisTemplate 和 StringRedisTemplate
- 支持连接池配置
- 集成健康检查
学习要点:
- 合理的默认值
- 支持多种客户端
- 完善的配置选项
- 良好的扩展性
9.2 案例二:MyBatis Starter 的设计
MyBatis 官方的 Starter 是第三方 Starter 的优秀案例:
命名: mybatis-spring-boot-starter(符合第三方命名规范)
核心功能:
- 自动扫描 Mapper 接口
- 自动配置 SqlSessionFactory
- 集成事务管理
- 支持多数据源
配置属性:
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.entity
configuration:
map-underscore-to-camel-case: true
学习要点:
- 深度集成 Spring Boot
- 简化复杂配置
- 保留原有功能
9.3 案例三:企业内部监控 Starter
某公司的内部监控 Starter 设计:
功能:
- 自动上报应用信息
- 自动收集性能指标
- 自动上报异常
- 自动收集业务埋点
设计亮点:
@ConfigurationProperties(prefix = "monitor")
public class MonitorProperties {
// 开关控制
private boolean enabled = true;
// 环境配置
private String env;
private String appName;
// 上报配置
private String serverUrl;
private int batchSize = 100;
private int flushInterval = 5000;
// 功能开关
private MetricsConfig metrics = new MetricsConfig();
private ExceptionConfig exception = new ExceptionConfig();
public static class MetricsConfig {
private boolean enabled = true;
private Set<String> includes = new HashSet<>();
private Set<String> excludes = new HashSet<>();
}
public static class ExceptionConfig {
private boolean enabled = true;
private Set<Class<? extends Throwable>> ignores = new HashSet<>();
}
}
学习要点:
- 细粒度的开关控制
- 考虑性能影响(批量上报、异步处理)
- 提供丰富的配置选项
- 环境感知
十、总结
10.1 核心要点回顾
自定义 Spring Boot Starter 是一项重要的工程能力,核心要点:
- 理解 Spring Boot 自动配置机制:基于条件注解的自动装配
- 掌握核心步骤:配置属性类 → 自动配置类 → 注册配置 → 打包发布
- 遵循最佳实践:合理命名、提供默认值、允许覆盖、文档完善
- 关注用户体验:零配置、智能提示、友好错误信息
- 考虑扩展性:支持多种配置方式、预留扩展点
10.2 面试回答模板
当面试官问"如何自定义 Spring Boot Starter"时,可以这样回答:
第一层:说清楚 Starter 是什么
- Starter 是 Spring Boot 的依赖描述符和自动配置的载体
- 它简化了依赖管理和配置,体现了"约定优于配置"的理念
第二层:说清楚为什么要自定义
- 企业内部技术组件的复用
- 最佳实践的沉淀
- 降低技术使用门槛
第三层:说清楚怎么做
- 创建工程(starter + autoconfigure 两个模块)
- 定义配置属性类(@ConfigurationProperties)
- 编写自动配置类(@Configuration + @ConditionalOnXxx)
- 注册自动配置(spring.factories 或 AutoConfiguration.imports)
- 打包发布使用
第四层:说清楚关键技术点
- 条件注解的使用(@ConditionalOnMissingBean 等)
- 配置的优先级和覆盖机制
- 自动配置的执行顺序控制
第五层:说清楚最佳实践
- 提供合理的默认值
- 允许用户覆盖配置
- 提供配置提示和文档
- 考虑性能和异常处理
如果还有时间,可以补充:
- 举一个实际案例(官方的或自己做过的)
- 说说遇到过的坑和解决方案
- 提到一些进阶话题(健康检查、指标监控等)
10.3 深入学习建议
- 阅读官方 Starter 源码:spring-boot-starter-web、spring-boot-starter-data-redis 等
- 阅读优秀第三方 Starter:mybatis-spring-boot-starter、pagehelper-spring-boot-starter 等
- 实践项目:尝试把自己项目中的通用功能封装成 Starter
- 关注 Spring Boot 新特性:每个版本都可能有自动配置相关的改进
10.4 扩展知识
与 Starter 相关的其他知识点:
- Spring SPI 机制(FactoryBean、BeanPostProcessor 等)
- Spring 条件装配原理
- Spring Boot 启动流程
- Maven 依赖管理和传递
- 微服务架构下的技术组件治理
掌握自定义 Starter 不仅能让你在面试中脱颖而出,更能提升你的工程能力和架构思维。它体现了组件化思想、开闭原则、约定优于配置等重要理念,是 Java 开发者进阶的必经之路。

浙公网安备 33010602011771号