自定义 Starter 实现

候选人小林在面试蚂蚁 P7 时,面试官问道:

"你实现过自定义的 Spring Boot Starter 吗?"

小林说:"没有..."

面试官追问:"那你知道怎么实现吗?"

小林说:"需要创建自动配置类,然后注册..."

面试官:"具体怎么注册?spring.factories 和 .imports 文件有什么区别?"

小林答不上来。

【面试官心理】 这道题我用来测试候选人的 Spring Boot 深度应用能力。实现过自定义 Starter 的,说明对 Spring Boot 自动配置原理有实战理解。能说出 .imports 文件(Spring Boot 2.7+)和 spring.factories 的区别,是 P6+ 级别的候选人。


一、核心问题 🔴

1.1 问题拆解

第一层:结构

  • "自定义 Starter 需要哪些组件?"
  • "autoconfigure 模块和 starter 模块是什么关系?"

第二层:实现

  • "怎么创建自动配置类?"
  • "怎么注册自动配置?"
  • "@EnableConfigurationProperties 怎么用?"

第三层:条件

  • "@Conditional 系列注解怎么用?"
  • "怎么让配置只在满足条件时生效?"

1.2 标准回答

P5 回答:标准结构

my-starter/
├── my-autoconfigure/     # 自动配置模块
│   └── src/main/java/
│       └── MyAutoConfiguration.java
└── my-spring-boot-starter/  # 聚合依赖模块
    └── pom.xml

1.3 追问升级

追问 1:完整的自动配置类实现

// 1. 配置属性类
@ConfigurationProperties(prefix = "my.service")
public class MyServiceProperties {
    private String url = "http://localhost:8080";
    private int timeout = 5000;
    // getters and setters
}

// 2. 自动配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyServiceProperties properties) {
        return new MyService(properties.getUrl(), properties.getTimeout());
    }
}

// 3. Spring Boot 2.7+:注册到 .imports 文件
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.autoconfigure.MyServiceAutoConfiguration

// 4. Spring Boot 2.7 之前:注册到 spring.factories
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MyServiceAutoConfiguration

追问 2:使用方

<!-- 用户只需要添加 starter 依赖 -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>my-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>
# application.yml
my:
  service:
    url: http://api.example.com
    timeout: 3000

二、面试总结

自定义 Starter 是 Spring Boot 自动配置的最终形态,体现了"约定大于配置"的核心思想。