自定义starter

news/2026/1/26 22:09:57/文章来源:https://www.cnblogs.com/guoyafenghome/p/19535735

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 {@Autowiredprivate SmsProperties smsProperties;/*** 创建短信客户端 Bean*/@Bean@ConditionalOnMissingBean  // 如果用户没有自定义,才创建这个 Beanpublic 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)  // 依赖 SmsClientpublic 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: trueaccess-key-id: your-access-key-idaccess-key-secret: your-access-key-secretsign-name: 你的签名connect-timeout: 5000read-timeout: 10000

3. 直接使用:

@Service
public class UserService {@Autowiredprivate 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 {@Beanpublic 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-keyaccess-key-secret: dev-secretprod:access-key-id: prod-keyaccess-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 {@Autowiredprivate SmsService smsService;@Testvoid testSmsServiceAutoConfigured() {assertNotNull(smsService);}@Testvoid 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> {@Overrideprotected 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 {@Autowiredprivate SmsClient smsClient;@Overridepublic 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 的核心流程?

回答要点:

  1. 创建项目:通常是两个模块,starter 负责依赖管理,autoconfigure 负责配置逻辑
  2. 定义配置属性类:使用 @ConfigurationProperties,让用户可以在配置文件中设置参数
  3. 编写自动配置类:使用 @Configuration 和各种条件注解,创建需要的 Bean
  4. 注册自动配置类:在 META-INF/spring.factories 或 AutoConfiguration.imports 中注册
  5. 打包发布:发布到 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?

回答要点:

主要有以下原因:

  1. 性能更好:spring.factories 需要解析所有的 key-value 对,而 AutoConfiguration.imports 只需要读取自动配置类列表
  2. 职责更清晰:spring.factories 承载了太多功能(自动配置、监听器、初始化器等),AutoConfiguration.imports 只负责自动配置
  3. 更好的模块化:每种功能有自己的文件,不会混在一起
  4. IDE 支持更好:文件名明确,IDE 可以提供更好的提示和跳转

8.4 如何保证自动配置类的执行顺序?

回答要点:

Spring Boot 提供了以下注解来控制顺序:

  1. @AutoConfigureBefore:在指定的配置类之前执行
  2. @AutoConfigureAfter:在指定的配置类之后执行
  3. @AutoConfigureOrder:通过数字指定顺序(数字越小越先执行)

示例:

@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MyAutoConfiguration {// 这个配置类会在 DataSourceAutoConfiguration 之后执行
}

8.5 自定义 Starter 和直接写一个配置类有什么区别?

回答要点:

对比维度 普通配置类 自定义 Starter
依赖管理 需要手动引入所有依赖 Starter 自动管理依赖
配置方式 需要在每个项目中写配置类 引入 Starter 自动配置
复用性 代码复制粘贴,难以维护 发布到仓库,统一维护
灵活性 可以随意修改 提供配置开关,用户可以覆盖
适用场景 单个项目的特定配置 多个项目的通用功能

8.6 如何测试自定义的 Starter?

回答要点:

  1. 单元测试:使用 @SpringBootTest 和 @TestPropertySource 测试自动配置
  2. 条件测试:测试各种条件注解是否正确生效
  3. 覆盖测试:测试用户自定义 Bean 是否能正确覆盖默认实现
  4. 集成测试:创建一个示例项目,真实引入 Starter 测试

示例:

@SpringBootTest
@TestPropertySource(properties = {"sms.enabled=true","sms.access-key-id=test"
})
class SmsAutoConfigurationTest {@Autowiredprivate ApplicationContext context;@Testvoid testAutoConfiguration() {// 验证 Bean 是否被创建assertNotNull(context.getBean(SmsService.class));}
}

8.7 starter 和 autoconfigure 模块为什么要分开?

回答要点:

这是官方推荐的最佳实践,原因是:

  1. 职责分离

    • starter:只负责依赖管理,pom 很简洁
    • autoconfigure:只负责配置逻辑,没有额外依赖
  2. 灵活性

    • 用户可以只引入 autoconfigure,自己管理依赖版本
    • 用户可以引入 starter,享受完全自动配置
  3. 可测试性

    • autoconfigure 模块不依赖具体实现,更容易测试
    • 可以单独测试配置逻辑

8.8 如何处理 Starter 中的版本冲突?

回答要点:

  1. 使用 optional 依赖:非核心依赖标记为 optional,让用户自己选择

    <dependency><groupId>com.example</groupId><artifactId>some-lib</artifactId><optional>true</optional>
    </dependency>
    
  2. 使用 @ConditionalOnClass:根据类路径中是否存在某个类来决定是否配置

    @Configuration
    @ConditionalOnClass(SomeClass.class)
    public class SomeAutoConfiguration {// 只有类路径中有 SomeClass 才配置
    }
    
  3. 明确依赖版本:在 Starter 中通过 dependencyManagement 明确依赖版本

  4. 排除冲突依赖:使用 exclusions 排除冲突的传递依赖

九、真实案例分析

9.1 案例一:Redis Starter 的设计

Spring Boot 官方的 Redis Starter 是一个典型案例:

模块划分:

  • spring-boot-starter-data-redis:依赖管理
  • spring-boot-autoconfigure:自动配置逻辑

配置属性:

spring:redis:host: localhostport: 6379password: database: 0timeout: 5000lettuce:pool:max-active: 8max-idle: 8min-idle: 0

自动配置:

  • 根据 Lettuce 或 Jedis 客户端的存在自动选择
  • 提供 RedisTemplate 和 StringRedisTemplate
  • 支持连接池配置
  • 集成健康检查

学习要点:

  • 合理的默认值
  • 支持多种客户端
  • 完善的配置选项
  • 良好的扩展性

9.2 案例二:MyBatis Starter 的设计

MyBatis 官方的 Starter 是第三方 Starter 的优秀案例:

命名: mybatis-spring-boot-starter(符合第三方命名规范)

核心功能:

  • 自动扫描 Mapper 接口
  • 自动配置 SqlSessionFactory
  • 集成事务管理
  • 支持多数据源

配置属性:

mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.entityconfiguration: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 是一项重要的工程能力,核心要点:

  1. 理解 Spring Boot 自动配置机制:基于条件注解的自动装配
  2. 掌握核心步骤:配置属性类 → 自动配置类 → 注册配置 → 打包发布
  3. 遵循最佳实践:合理命名、提供默认值、允许覆盖、文档完善
  4. 关注用户体验:零配置、智能提示、友好错误信息
  5. 考虑扩展性:支持多种配置方式、预留扩展点

10.2 面试回答模板

当面试官问"如何自定义 Spring Boot Starter"时,可以这样回答:

第一层:说清楚 Starter 是什么

  • Starter 是 Spring Boot 的依赖描述符和自动配置的载体
  • 它简化了依赖管理和配置,体现了"约定优于配置"的理念

第二层:说清楚为什么要自定义

  • 企业内部技术组件的复用
  • 最佳实践的沉淀
  • 降低技术使用门槛

第三层:说清楚怎么做

  • 创建工程(starter + autoconfigure 两个模块)
  • 定义配置属性类(@ConfigurationProperties)
  • 编写自动配置类(@Configuration + @ConditionalOnXxx)
  • 注册自动配置(spring.factories 或 AutoConfiguration.imports)
  • 打包发布使用

第四层:说清楚关键技术点

  • 条件注解的使用(@ConditionalOnMissingBean 等)
  • 配置的优先级和覆盖机制
  • 自动配置的执行顺序控制

第五层:说清楚最佳实践

  • 提供合理的默认值
  • 允许用户覆盖配置
  • 提供配置提示和文档
  • 考虑性能和异常处理

如果还有时间,可以补充:

  • 举一个实际案例(官方的或自己做过的)
  • 说说遇到过的坑和解决方案
  • 提到一些进阶话题(健康检查、指标监控等)

10.3 深入学习建议

  1. 阅读官方 Starter 源码:spring-boot-starter-web、spring-boot-starter-data-redis 等
  2. 阅读优秀第三方 Starter:mybatis-spring-boot-starter、pagehelper-spring-boot-starter 等
  3. 实践项目:尝试把自己项目中的通用功能封装成 Starter
  4. 关注 Spring Boot 新特性:每个版本都可能有自动配置相关的改进

10.4 扩展知识

与 Starter 相关的其他知识点:

  • Spring SPI 机制(FactoryBean、BeanPostProcessor 等)
  • Spring 条件装配原理
  • Spring Boot 启动流程
  • Maven 依赖管理和传递
  • 微服务架构下的技术组件治理

掌握自定义 Starter 不仅能让你在面试中脱颖而出,更能提升你的工程能力和架构思维。它体现了组件化思想、开闭原则、约定优于配置等重要理念,是 Java 开发者进阶的必经之路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1221037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty 架构师面试题集锦

Netty 架构师面试题集锦 目录基础概念 核心组件 线程模型 内存管理 编解码器 高性能原理 实战问题 架构设计基础概念 1. 什么是 Netty?为什么要使用 Netty? 答案: Netty 是一个异步事件驱动的网络应用框架,用于快速…

2026年想给TikTok广告账户充值,为了资金安全和投放效果到底该找谁?

随着时间进入2026年1月,TikTok For Business的投放环境与几年前相比已发生显著变化。对于跨境电商卖家、游戏厂商以及品牌出海企业而言,账户充值已不再仅仅是“支付资金”这一单一动作,而是与现金流管理、算法对抗以…

2026年想要给Google广告账户充值,为了资金安全和投放效果到底应该找谁?

对于众多出海企业而言,获取海外流量的第一步往往是建立Google广告账户。然而,在实际操作中,企业尤其是中小商家常会面临一系列“隐形门槛”。在2026年的市场环境下,Google官方自助充值的门槛普遍要求首次预充值达到…

2026新规落地,网络安全迎来“大考”!这6大专业是未来高薪领域

建议收藏&#xff1a;2026网络安全法修订后&#xff0c;这6大专业让你轻松入行高薪领域&#xff01; 2026年修订后的《网络安全法》正式施行&#xff0c;标志着我国网络安全治理进入"智能时代"。文章详细介绍6大网络安全相关专业&#xff1a;网络空间安全、信息安全…

MemOS 产品更新|知识库检索更精准,记忆更省、更智能

在 v2.0.2 中&#xff0c;我们围绕「知识库问答效果」与「记忆系统内部机制」两条主线&#xff0c;对检索、工具记忆与事实记忆处理流程进行了进一步优化&#xff0c;同时补充了官方最佳实践文档&#xff0c;帮助开发者更快构建可落地的 MemOS 应用。 本次发布汇总一、优化知识…

2026年网络安全学习指南_核心方法与路径

网络安全8大方向学习路径收藏指南&#xff1a;从小白到专家的成长之路 文章为网络安全学习者提供8条清晰路径&#xff1a;渗透测试、SRC漏洞挖掘、红队攻防、代码审计、应急响应、红队免杀、JS逆向、App渗透。每条路径包含学习内容、实践任务、重点知识与常见误区&#xff0c;…

基于MATLAB的D2D通信模式选择仿真

基于MATLAB的D2D通信模式选择仿真&#xff0c;包含蜂窝模式、直传模式和中继模式的动态切换逻辑&#xff1a;一、系统建模与参数设置 %% 系统参数定义 params struct(...cell_radius, 500, % 小区半径 (m)d2d_range, 50, % D2D通信最大距离 (m)interference_threshol…

linux查看屏幕连接状态

常识 linux下一切皆文件,可以通过查看代表屏幕连接的文件获取连接状态 在终端运行cat /sys/class/drm/card0-HDMI-A-1/status会打印屏幕的连接状态 connected 或 disconnected

2026 年 1 月板材生产线厂家推荐排行榜,塑料/PP/PE/PVC木塑/亚克力/警示板/防滑板/PC阳光瓦板材生产线,高效智能与定制化解决方案深度解析

2026年1月板材生产线厂家推荐排行榜:高效智能与定制化解决方案深度解析 随着全球制造业向智能化、绿色化转型,以及新材料应用的不断拓展,板材生产行业正经历着一场深刻的技术革新。塑料板材,作为广泛应用于建筑装饰…

电脑上不小心永久删除了怎么恢复?盘点6个恢复文件的免费软件!

临时需要恢复一些文件&#xff0c;可市面上能找到的数据恢复软件大多价格高昂&#xff0c;有没有既免费又实用的数据恢复工具能帮我迅速解决难题呢&#xff1f;在电脑使用过程中&#xff0c;文件丢失是常见状况&#xff0c;想快速恢复文件却因软件价格而犹豫&#xff1f;电脑上…

vlm替代vlm+llm组合

因为vlm也能跑functioncall 测试 VLM 带工具调用 VLM服务初始化完成&#xff0c;模型: /root/my_python_server/models/OpenBMB_MiniCPM-V-2_6-int4 测试图像已创建: C:\Users\njsgcs\AppData\Local\Temp\tmpqfupvz29.png [VLM调试] 成功收到响应 响应状态: 成功 生成内容: 这…

【有源码】基于Hadoop+Spark的玉米产量多维度数据挖掘与可视化分析系统-基于Python的玉米产量数据质量评估与深度分析平台

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1 开发环境2 系统设计3 系统展示3.1 功能展示视频3.2 大屏页面3.3 分析页面3.4 基础页面 4 更多推荐5 部分功能代码 1 开发环境 发语言&#xff1a;python 采用技术&#xff1…

门窗怎么选?2026十大门窗品牌排行榜与选购指南全解析

当门窗从“遮风挡雨”的基础建材,升级为承载家居安全、舒适体验与智能生活的核心载体,消费者对品牌的选择标准愈发严苛。基于此,中国建筑金属结构协会与中国建筑装饰协会联合联合第三方权威检测机构,发起了2026年度…

2026 年 1 月太阳能杀虫灯厂家推荐排行榜,农田/农业太阳能杀虫灯,智能光控频振式杀虫灯源头厂家最新精选

2026年1月太阳能杀虫灯厂家推荐排行榜:聚焦农田/农业智能光控频振式杀虫灯源头厂家 随着全球对绿色、可持续农业发展的呼声日益高涨,物理防控技术在农业生产中的地位愈发凸显。太阳能杀虫灯,作为集成光伏技术、智能…

多线程的这9种用途,99%的人不知道!

并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。 并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f; 答&#xff1a;不一定&#xff0c;要看具体业务场景。 毕竟如果使用了多线程&#xff0…

远程访问Payload Website Template服务

Payload Website Template 是 Payload 官方提供的网站模板&#xff0c;适用于搭建从个人到企业级的各类网站、博客或作品集。该模板内置功能完善的后端系统、企业级管理面板&#xff0c;以及一套设计精美、可直接用于生产环境的前端界面。如果您计划开展以下项目&#xff0c;本…

2026年算法备案实操指南(全新版·避坑+双审适配)

本指南基于2026年1月最新监管口径&#xff08;含网信办11项新国标预告&#xff09;&#xff0c;聚焦算法备案“一审二审”双层审核逻辑&#xff0c;重点覆盖高风险场景界定、材料真实性核验、常见驳回问题修正&#xff0c;全程规避此前重复内容&#xff0c;兼顾合规性与实操性&…

【计算机毕业设计案例】基于springboot的高校学生心理健康管理系统基于SpringBoot的大学生心理健康咨询管理系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Clawdbot爆火背后的技术图谱:开源Agent、Manus与实在Agent的架构差异解析

Clawdbot 的出现&#xff0c;仅仅解决了“即使通讯”的问题。而在其身后&#xff0c;一场关于 AI 如何“真正干活”的暗战&#xff0c;正在大洋两岸以截然不同的路径展开。2026 年的第一个科技爆款&#xff0c;比预想中来得更“极客”一些。没有炫目的发布会&#xff0c;没有纳…

碰一碰发视频系统源码开发搭建技术分享

碰一碰发视频系统概述碰一碰发视频系统通常指通过NFC&#xff08;近场通信&#xff09;或蓝牙等短距离通信技术触发视频传输的功能。这类系统适用于社交分享、广告推送等场景&#xff0c;需结合移动端开发、服务端存储及通信协议实现。核心技术模块NFC/蓝牙通信模块Android端使…