2、Spring Boot 3 自定义 Starter 常用注解详解

springboot-自定义注解 第一步:定义注解第二步:配置注解第三步:解析注解int age();String sex() default "女";注意:自定义注解要用【@interface】在自定义注解中,其实现部分只能定义注解类型元素!说明:a.访问修饰符必须为public,不写默认为public;b.该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型以及一维数组;c.该元素的名称一般定义为名词,如果注解中只有一个元素,名字起为value最好; 阅读详情

在开发 Spring Boot 3 自定义 Starter 的过程中,正确使用注解是实现自动装配、配置绑定、条件化加载等功能的核心。下面我将为你系统梳理 Spring Boot 3 Starter 开发中最常用、最关键的注解,并为每个注解提供详细中文注释的使用示例,帮助你深入理解其作用和实际应用场景。


🧩 Spring Boot 3 自定义 Starter 常用注解详解(附中文注释示例)


✅ 1. @Configuration —— 标记自动配置类

📌 作用:

标记一个类为 Spring 的配置类,等价于 XML 配置文件。在 Starter 中用于定义自动配置类,Spring Boot 启动时会加载该类中的 @Bean 方法。

🧩 示例:

package com.example.starter;

import org.springframework.context.annotation.Configuration;

/**
 * 自动配置类:Spring Boot 启动时会扫描并加载此类
 * 用于注册 Starter 中的核心 Bean(如 Service、工具类等)
 */
@Configuration
public class GreetingAutoConfiguration {

    // 此类中可通过 @Bean 方法注册组件
}

💡 注意:自动配置类必须在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中注册才能被加载。


✅ 2. @Bean —— 声明 Spring 管理的组件

📌 作用:

在配置类中声明一个方法,该方法的返回值将被 Spring 容器管理为一个 Bean。常用于注册服务、工具类等。

🧩 示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GreetingAutoConfiguration {

    /**
     * 声明一个 GreetingService Bean
     * Spring 容器会自动调用此方法,并将返回对象注册为 Bean
     * 其他组件可通过 @Autowired 注入使用
     */
    @Bean
    public GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}

✅ 3. @ConditionalOnProperty —— 根据配置属性条件化加载

📌 作用:

根据 application.yaml 中的配置属性决定是否加载当前配置类或 Bean。是 Starter 实现“可开关”功能的核心注解。

🧩 示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;

/**
 * 仅当配置文件中 my.greeting.enabled = true 时才加载此类
 * matchIfMissing = true 表示:如果用户没配置,默认视为 true(即默认启用)
 */
@Configuration
@ConditionalOnProperty(
    prefix = "my.greeting",     // 配置前缀
    name = "enabled",           // 属性名
    havingValue = "true",       // 期望值
    matchIfMissing = true       // 未配置时是否匹配(默认启用)
)
public class GreetingAutoConfiguration {

    // 只有满足条件时,里面的 @Bean 才会生效
}

✅ 对应的 application.yaml:

my:
  greeting:
    enabled: false  # 设置为 false 将禁用整个 Starter 功能

✅ 4. @ConditionalOnMissingBean —— 当容器缺少某 Bean 时才创建

📌 作用:

避免 Starter 默认 Bean 与用户自定义 Bean 冲突。如果用户自己定义了同类型的 Bean,则跳过自动装配,实现“可覆盖”机制。

🧩 示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GreetingAutoConfiguration {

    /**
     * 仅当 Spring 容器中不存在 GreetingService 类型的 Bean 时,
     * 才创建并注册这个默认实现。
     * 用户可通过自定义 @Bean 覆盖此默认行为。
     */
    @Bean
    @ConditionalOnMissingBean  // 如果用户自己写了 GreetingService,这个就不创建
    public GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}

✅ 用户自定义覆盖示例:

@Component
public class MyCustomGreetingService implements GreetingService {
    @Override
    public String sayHello(String name) {
        return "Custom: Hi " + name + "!";
    }
}
// 此时 Starter 中的默认 GreetingServiceImpl 将不会被创建

✅ 5. @ConfigurationProperties —— 绑定 YAML 配置到 Java 对象

📌 作用:

将 application.yaml 中的配置属性自动绑定到 Java Bean 的字段上,支持类型转换、校验、IDE 提示(配合 spring-boot-configuration-processor)。

🧩 示例:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 配置属性类:用于绑定 application.yaml 中 my.greeting.* 的配置
 * prefix = "my.greeting" 表示绑定前缀
 */
@ConfigurationProperties(prefix = "my.greeting")
@Component  // 也可以不加 @Component,而在 @EnableConfigurationProperties 中注册
public class GreetingProperties {

    /**
     * 是否启用问候服务,默认 true
     */
    private boolean enabled = true;

    /**
     * 问候语前缀,默认 "Hello, "
     */
    private String prefix = "Hello, ";

    /**
     * 问候语后缀,默认 "!"
     */
    private String suffix = "!";

    // 必须提供 getter/setter,否则绑定失败
    public boolean isEnabled() { return enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }

    public String getPrefix() { return prefix; }
    public void setPrefix(String prefix) { this.prefix = prefix; }

    public String getSuffix() { return suffix; }
    public void setSuffix(String suffix) { this.suffix = suffix; }
}

✅ 对应的 application.yaml:

my:
  greeting:
    prefix: "🎉 欢迎, "
    suffix: " 👋"

✅ 6. @EnableConfigurationProperties —— 启用配置属性绑定

📌 作用:

在自动配置类上使用,显式启用某个 @ConfigurationProperties 类的绑定功能。如果不使用 @Component,则必须通过此注解注册。

🧩 示例:

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(GreetingProperties.class) // 启用 GreetingProperties 的绑定
public class GreetingAutoConfiguration {

    // 可在 @Bean 方法中注入 GreetingProperties 使用
    @Bean
    public GreetingService greetingService(GreetingProperties properties) {
        return new GreetingServiceImpl(properties);
    }
}

✅ 如果 GreetingProperties 上加了 @Component,则可以省略 @EnableConfigurationProperties,但官方推荐在自动配置类中显式声明,结构更清晰。


✅ 7. @ConditionalOnClass / @ConditionalOnMissingClass —— 根据类是否存在条件加载

📌 作用:

  • @ConditionalOnClass:当类路径中存在指定类时才加载配置。
  • @ConditionalOnMissingClass:当类路径中不存在指定类时才加载配置。

常用于 Starter 依赖可选库(如 Redis、MQ 等)时的条件装配。

🧩 示例:

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;

/**
 * 仅当项目中引入了 Redis 相关类时,才加载此配置
 * 避免在无 Redis 依赖的项目中报错
 */
@Configuration
@ConditionalOnClass(name = "org.springframework.data.redis.core.RedisTemplate")
public class RedisGreetingAutoConfiguration {

    // 只有项目中包含 spring-data-redis 时,此配置才生效
}

✅ 8. @AutoConfigureBefore / @AutoConfigureAfter —— 控制自动配置加载顺序

📌 作用:

控制当前自动配置类与其他配置类的加载顺序。例如,你的 Starter 依赖某个 Bean,必须在其之后加载。

🧩 示例:

import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.annotation.Configuration;

/**
 * 指定当前配置必须在 WebMvcAutoConfiguration 之前加载
 * 例如:你需要提前注册拦截器或视图控制器
 */
@Configuration
@AutoConfigureBefore(WebMvcAutoConfiguration.class)
public class MyWebAutoConfiguration {

}

✅ 9. @Import —— 导入其他配置类

📌 作用:

在当前配置类中导入其他配置类,实现模块化配置组合。

🧩 示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class}) // 导入多个配置类
public class MyStarterAutoConfiguration {

}

✅ 10. @Order —— 定义配置类或 Bean 的加载/执行顺序

📌 作用:

定义配置类、拦截器、过滤器等组件的执行顺序,值越小优先级越高。

🧩 示例:

import org.springframework.core.annotation.Order;
import org.springframework.context.annotation.Configuration;

@Configuration
@Order(1) // 优先级最高
public class HighPriorityConfig {

}

@Configuration
@Order(2)
public class LowPriorityConfig {

}

✅ 11. @DependsOn —— 强制指定 Bean 依赖顺序

📌 作用:

强制指定某个 Bean 必须在另一个 Bean 初始化之后再初始化。

🧩 示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

@Configuration
public class AppConfig {

    @Bean
    public DatabaseInitializer databaseInitializer() {
        return new DatabaseInitializer();
    }

    /**
     * 强制要求 greetingService 必须在 databaseInitializer 初始化之后再创建
     * 例如:greetingService 需要从数据库加载默认配置
     */
    @Bean
    @DependsOn("databaseInitializer")
    public GreetingService greetingService() {
        return new GreetingServiceImpl();
    }
}

✅ 12. @Description(配合 spring-boot-configuration-processor)—— 为配置属性添加说明

📌 作用:

为 @ConfigurationProperties 类的字段添加描述,编译后生成元数据,IDE 可显示提示和说明。

🧩 示例:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.Description;

@ConfigurationProperties(prefix = "my.greeting")
public class GreetingProperties {

    @Description("是否启用问候语服务。设为 false 可完全关闭此功能。")
    private boolean enabled = true;

    @Description("问候语前缀,例如 'Hello, ' 或 '您好,'")
    private String prefix = "Hello, ";

    @Description("问候语后缀,例如 '!' 或 ' 👋'")
    private String suffix = "!";

    // getter/setter 省略...
}

✅ 编译后,在 target/classes/META-INF/spring-configuration-metadata.json 中会包含描述信息,IDE 输入配置时会显示提示。


🧭 总结表格:Spring Boot 3 Starter 常用注解速查

注解用途是否必需示例场景
@Configuration声明自动配置类✅ 必需所有 Starter 配置类
@Bean注册组件到容器✅ 必需注册 Service、Util 等
@ConditionalOnProperty根据配置开关功能⭐ 强烈推荐实现 starter.enabled=false
@ConditionalOnMissingBean避免 Bean 冲突⭐ 强烈推荐允许用户自定义覆盖
@ConfigurationProperties绑定 YAML 配置✅ 必需(如需配置)自定义前缀/后缀/开关等
@NestedConfigurationProperty标记为嵌套配置✅ 推荐(结构清晰)与 @ConfigurationProperties 配合
@EnableConfigurationProperties启用属性绑定✅ 推荐(结构清晰)与 @ConfigurationProperties 配合
@ConditionalOnClass按依赖条件加载⭐ 按需使用Starter 依赖可选库时
@AutoConfigureBefore/After控制加载顺序⭐ 按需使用依赖其他 Starter 时
@Import导入其他配置⭐ 按需使用模块化配置拆分
@Order定义执行顺序⭐ 按需使用过滤器、拦截器排序
@DependsOn强制 Bean 依赖顺序⭐ 按需使用初始化顺序敏感场景
@Description配置属性说明✅ 推荐(提升体验)生成 IDE 配置提示

💡 开发建议:

  • 始终使用 @ConditionalOnMissingBean —— 让用户能轻松覆盖你的默认实现。
  • 使用 @ConditionalOnProperty 提供开关 —— 提升 Starter 的灵活性。
  • 添加 @Description + spring-boot-configuration-processor —— 极大提升用户体验。
  • 避免在 Starter 中使用 @ComponentScan —— 应通过 @Bean 精确控制注册。

✅ 掌握以上注解,你就可以开发出专业、健壮、用户友好的 Spring Boot 3 自定义 Starter!

如需我为你扩展某个注解的实战场景(比如结合 Redis、数据库、AOP 等),欢迎继续提问!

祝你编码愉快,成为 Starter 大师!🚀

使用VScode编译AMI代码 我现在了解到的和拿到的code,都是基于AMI的code,一般的编译AMI都需要搭配使用AMI的编译环境Veb,而Veb用到现在,一直都觉得有点卡顿,浏览代码的体验也比VScode差很多。在这之前还要,考虑设置TOOLS_DIR和EWKE_DIR的环境变量,因为在Veb中是可以通过设置自动设置的,但是VScode里面没用设置环境变量的选项。这里可以看出,Veb工具栏中的Build和Rebuild All的命令对应这里的make和make rebuild,也就是说Veb是调用此命令进行编译的。 阅读详情

相关推荐

Cadence Allegro实战:如何精准导入结构DXF文件避免安装偏差(附图层配置技巧)

本文详细讲解了在Cadence Allegro中精准导入结构DXF文件以避免安装偏差的实战技巧。核心在于导入前的单位校准、创建专用图层结构,以及基于坐标基准点的精确对齐方法。文章还分享了将DXF图形转化为正式板框和禁布区、高效管理图层以及向结构工程师导出DXF的完整流程,帮助PCB工程师确保设计与机械结构完美契合。

1a2s3d4f5g的博客 505

springboot3使用​自定义注解+Jackson优雅实现接口数据脱敏

本文介绍了springboot开发后端服务中,接口数据脱敏优雅的设计与实现,坚持看完相信对你有帮助。同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。本文介绍了一种以优雅的方式实现对接口返回的敏感数据,如手机号、邮箱、身份证等信息的脱敏处理。这种方法也是企业常用方法。话不多说我们一起来看一下吧。/***///这是自定义的脱敏策略枚举类型,用于指定脱敏策略,获取对应脱敏处理方法。

蒾酒的博客 8246

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

Java Spring Boot 自定义注解详解与实践

本文介绍了在Spring Boot 3.0中使用自定义注解的方法。通过创建日志记录注解@LogAnnotation和对应的切面处理器LogAspect,开发者可以实现统一日志记录功能,避免重复代码。自定义注解的优势包括减少重复代码、增强可读性和便于维护扩展。文章详细演示了从定义注解、创建处理器到业务方法使用的完整流程,并强调了确保Spring扫描配置的重要性。这种注解方式适用于日志记录、性能监控等多种场景,能够有效提升代码质量和开发效率。

C_V_Better的博客 1039

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

5分钟搞定!用扣子空间LinkReaderPlugin快速搭建网页内容抓取机器人(附Python复现代码)

本文详细介绍了如何利用扣子空间的LinkReaderPlugin快速搭建网页内容抓取机器人,仅需5分钟即可完成配置。通过Python复现代码和可视化工作流,开发者可以轻松实现智能网页抓取,提升数据采集效率。文章还探讨了与RAG工作流的集成方案及性能优化技巧,适用于金融监控、电商追踪等多种场景。

study的专栏 1092

SpringBoot自定义注解

修饰符:访问修饰符必须为public,不写默认为pubic;关键字:关键字为@interface;注解名称:注解名称为自定义注解的名称注解类型元素:注解类型元素是注解中内容,根据需要标志参数,例如上面的注解的value;Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.参数成员只能用public或默认(default)这两个访问权修饰。

weixin_55850954的博客 5648

ROS Navigation global_planner框架解析

ROS Navigation global_planner框架解析主要讲一下我看源码总结的框架,如果大家跟着这个框架看源码的话可能会看的比较快。主要讲解global_planner关键配置参数含义及关键函数Astar,Dijkstra,QuadraticCalculator::calculatePotential,PotentialCalculator::calculatePotential,GridPath::getPath,GradientPath::getPath.

Jeff_Lee_的博客 4693

《Java 100 天进阶之路》第78篇:Spring Boot自动配置(2026版)

每天用@SpringBootApplication,但你知道背后的魔法吗?一文掌握自动配置核心链路(@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→SPI加载→条件过滤→Bean注册)、@SpringBootApplication三大组成注解、Spring Boot 3.x重大变化(废弃spring.factories,改用.imports文件)、6种条件注解

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 6462

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1620

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9694

Spring Boot2.x教程:(十九)入参校验

Spring Boot通过注解校验简化了数据有效性验证。使用时需引入 spring-boot-starter-validation 依赖(2.3及以后版本),它整合了hibernate-validator和validation-api。

欧阳方超的专栏 1435

芒果YOLOv8改进160:姿态估计Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

芒果YOLOv8改进159:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 810

SpringBoot中自定义Starter

1. 前置知识1-1 什么是Starter?1-2 常用的Condition注解说明1-3 Starter的命名规范2. 自定义自己的Starter示例2-1 创建Starter项目2-2 Pom.Xml【示例引入了spring-boot-starter和lombok】2-3-1 配置类:PersonProperties2-3-2 业务类:PersonService2-3-3 自动配置类:PersonAutoConfiguration2-4 创建spring.factories文件。

sthnyph的博客 371

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring Boot Starter 作用及原理详解

SpringBoot Starter是SpringBoot框架的核心组件,采用"约定优于配置"理念,通过预定义依赖和自动配置简化应用开发。文章详细解析了Starter的核心作用、分类(官方和第三方)、优势(依赖管理简化和自动配置实现),并深入剖析其工作原理,包括自动配置机制、条件注解体系、spring.factories文件机制等。同时提供了自定义Starter的开发实践示例(短信服务Starter),涵盖需求分析、项目结构设计、核心代码实现和使用示例。最后总结了Starter的最佳实践

油墨香^-^的博客 638

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

自定义starter,扫描指定注解的bean

相当于自己根据配置信息,生成了一个默认的bean,导入依赖:</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</</将springboot启动类,测试类删掉,,将maven打包成jar的配置删掉,,2. 自定义一个配置类,,来定义配置@Data通过这个配置加载一个默认的 Bean@Data@Autowired@Bean。

qq_36022463的博客 403

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Boot自定义Starter实战:告别重复代码的自动配置方案

在微服务架构中,随着Spring Boot项目数量增加,重复的配置类、拦截器和工具方法常被复制粘贴到多个服务,导致维护成本飙升与版本漂移风险。Spring Boot的自动配置机制遵循约定优于配置原则,支持将公共能力打包为自定义Starter,实现依赖即插即用。通过条件注解、配置属性绑定等核心技巧,开发者可以控制Bean的装配时机与覆盖逻辑,让通用模块从人工同步升级为版本治理。典型应用场景包括短信发送、接口幂等校验、操作审计日志等。本文以短信发送Starter的完整开发过程为例,深入讲解自动配置原理、impo

weixin_30768881的博客 295

一篇文章让你彻底弄懂Spring Boot 自动配置原理详解

Spring Boot自动装配原理

zhiyuanIT的专栏 1869

自定义Starter(3x版本)

Spring Boot Starter 是简化依赖管理和配置的模块化机制,本文探讨了自定义 Starter 的方式以及在自定义Starter过程的一些注意事项。

weixin_62307424的博客 979

Spring Boot Starter 自定义开发指南

自动配置是Starter的灵魂。核心配置类应使用@Configuration注解,并通过spring.factories文件实现自动装配,这是Starter与Spring Boot整合的关键。Spring Boot Starter作为Spring生态中简化依赖管理的核心组件,能够将复杂的配置封装为开箱即用的模块。对于希望深度定制化或扩展功能的开发者而言,掌握Starter的自定义开发至关重要。本文将围绕Starter的设计原理与实现步骤,从关键环节展开详解,帮助开发者快速构建高效、可复用的组件。

hiszmm_124的博客 199
上一篇: 1、Spring Boot 3 自定义 Starter 开发完整指南
下一篇: 3、Spring Boot 3 嵌套配置绑定实战示例
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值