文章目录先说结论Starter的内部结构1. 配置属性类2. 自动配置类3. spring.factories注册4. pom.xml依赖管理官方常用Starter一览Starter与自动装配的关系自定义Starter的注意事项回答技巧与点评加分回答面试官点评个人网站Starter 是 Spring Boot 自动装配的交付单元——你引入一个依赖相关功能就自动配好了。面试官问 Starter他不只想听它是一个依赖包他想听的是Starter 的内部结构是什么自动配置类怎么和 Starter 关联的怎么写一个自定义 Starter先说结论维度说明本质一组依赖 自动配置类的打包单元命名约定官方spring-boot-starter-第三方-spring-boot-starter核心组成自动配置类 条件注解 spring.factories 默认配置工作原理引入 Starter → classpath 有新类 → 条件满足 → 自动配置生效一句话记住Starter 就是套餐——你点一个套餐主菜配菜饮料全齐了不用一个个单点Starter的内部结构一个标准的 Starter 包含my-spring-boot-starter/ ├── pom.xml ← 依赖管理 ├── src/main/java/ │ └── com/example/autoconfigure/ │ ├── MyAutoConfiguration.java ← 自动配置类 │ ├── MyProperties.java ← 配置属性类 │ └── MyService.java ← 核心服务 └── src/main/resources/ └── META-INF/ └── spring.factories ← 注册自动配置类1. 配置属性类ConfigurationProperties(prefixmy.service)publicclassMyProperties{privateStringurlhttp://localhost:8080;// 默认值privateinttimeout3000;// getter/setter}2. 自动配置类AutoConfigurationConditionalOnClass(MyService.class)// classpath 有 MyService 才生效EnableConfigurationProperties(MyProperties.class)// 启用配置属性publicclassMyAutoConfiguration{BeanConditionalOnMissingBean(MyService.class)// 没自定义才注册publicMyServicemyService(MyPropertiesprops){returnnewMyService(props.getUrl(),props.getTimeout());}}3. spring.factories注册org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.example.autoconfigure.MyAutoConfigurationSpring Boot 3.x 使用新文件# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports com.example.autoconfigure.MyAutoConfiguration4. pom.xml依赖管理dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-autoconfigure/artifactId/dependency!-- 可选配置属性元数据提示 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependency官方常用Starter一览Starter功能关键自动配置类spring-boot-starter-webWeb 开发WebMvcAutoConfigurationspring-boot-starter-data-jpaJPAHibernateJpaAutoConfigurationspring-boot-starter-data-redisRedisRedisAutoConfigurationspring-boot-starter-security安全SecurityAutoConfigurationspring-boot-starter-amqpRabbitMQRabbitAutoConfiguration每个 Starter 的套路都一样引入依赖 → classpath 变化 → 条件满足 → 自动配置生效。Starter与自动装配的关系Starter交付单元 ├── 依赖包jar—— 引入必要的类到 classpath ├── 自动配置类 —— ConditionalOnClass 感知 classpath 变化 ├── 条件注解 —— 决定是否生效 └── spring.factories —— 让 Spring Boot 发现配置类 自动装配核心机制 └── EnableAutoConfiguration → 读 factories → 条件过滤 → 注册 BeanStarter 是皮自动装配是里。Starter 解决的是交付问题把依赖和配置打包在一起自动装配解决的是配置问题按条件注册 Bean。自定义Starter的注意事项1. 命名规范官方spring-boot-starter-xxx第三方xxx-spring-boot-starter不要用官方前缀否则容易混淆。2. 配置提示引入spring-boot-configuration-processor在 application.yml 中输入my.service.时会有自动补全提示。3. 可选依赖Starter 的核心依赖应该是 optional 的避免引入 Starter 时强制带入不想要的包dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdoptionaltrue/optional!-- 可选依赖 --/dependency4. 排除不需要的自动配置使用者可以排除SpringBootApplication(exclude{MyAutoConfiguration.class})或者在 application.yml 中spring:autoconfigure:exclude:com.example.autoconfigure.MyAutoConfigurationStarter 全景 Starter 组成 ├── 自动配置类AutoConfiguration Conditional* ├── 配置属性类ConfigurationProperties ├── 核心服务类 ├── spring.factories / AutoConfiguration.imports └── pom.xml依赖管理 工作流程 ├── 引入 Starter → classpath 新增类 ├── ConditionalOnClass 检测到变化 ├── 自动配置类生效 └── 注册默认 Bean 命名约定 ├── 官方spring-boot-starter-* └── 第三方*-spring-boot-starter 口诀Starter就是小套餐依赖配置打包端 factories来注册条件注解来判断 命名规范要遵守官方前缀别乱用 自定义时三步走配置类加注册文件回答技巧与点评标准回答Starter 是 Spring Boot 自动装配的交付单元包含一组依赖和自动配置类。其核心组成包括自动配置类AutoConfiguration Conditional*、配置属性类ConfigurationProperties、spring.factories 注册文件。引入 Starter 后classpath 变化触发条件注解自动配置类生效并注册默认 Bean。自定义 Starter 需要编写自动配置类、注册到 spring.factories并遵循命名约定。加分回答Starter 的模块化设计官方推荐将 Starter 拆分为两个模块——xxx-spring-boot-autoconfigure自动配置逻辑和xxx-spring-boot-starter依赖聚合这样使用者的项目可以只引用 Starter而其他框架可以只引用 autoconfigure 模块ConfigurationProperties 的验证可以在属性类上使用 Validated JSR-303 注解NotNull、Min 等对配置值做校验启动时如果配置不合法直接报错避免运行时出错spring.factories 的淘汰Spring Boot 3.x 开始spring.factories 中 EnableAutoConfiguration 的注册方式已被废弃改用 AutoConfiguration.imports 文件。但 spring.factories 仍用于其他 SPI 机制面试官点评这道题考的是你对Spring Boot 生态的理解。能说出 Starter 的组成和工作原理是及格线面试官的重点在自定义 Starter 的步骤和注意事项——这直接反映了你有没有实际造过轮子。能把命名约定、可选依赖、模块化设计这些细节讲出来说明你有工程化思维。原文阅读内容有帮助点赞、收藏、关注三连评论区等你