SpringBoot自动装配注解的实现示例

 更新时间:2026年04月01日 10:23:44   作者:kevinzeng  
本文主要介绍了SpringBoot自动装配注解的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

这份指南详细整理了 Spring Boot 中最核心的配置绑定自动装配以及条件注解。这些注解是理解 Spring Boot "约定大于配置" (Convention over Configuration) 机制的基石。

本文档详细解析 Spring Boot 中用于配置绑定、自动装配流程控制及条件加载的核心注解。

1. 配置属性绑定 (Configuration Binding)

这一组注解的主要作用是将 application.yml 或 application.properties 中的配置值绑定到 Java Bean 中。

@ConfigurationProperties

  • 用途:将配置文件中指定前缀的属性值自动绑定到 Java 类的字段上。
  • 关键点:
    • 仅仅加上这个注解,Spring 容器并不会自动注册它。它需要配合 @EnableConfigurationProperties 或 @Component (配合扫描) 使用。
    • 支持松散绑定 (Relaxed Binding),例如 first-name 可以绑定到 firstName。

@EnableConfigurationProperties

  • 用途:显式地开启 @ConfigurationProperties 注解类的功能,并将该类注册为 Spring Bean。
  • 场景:通常用在 @Configuration 类上,用于引入第三方的配置类,或者当你不想在配置类上加 @Component 时使用。

@ConfigurationPropertiesScan

  • 用途:从 Spring Boot 2.2 开始引入。它会扫描指定包路径下所有标注了 @ConfigurationProperties 的类,并自动注册为 Bean。
  • 优势:省去了在配置类上写一堆 @EnableConfigurationProperties({A.class, B.class}) 的麻烦。

📝 代码示例

1. 配置文件 (application.yml)

app:
  server:
    timeout: 5000
    enabled: true

2. 配置类 POJO

import org.springframework.boot.context.properties.ConfigurationProperties;
// 声明前缀,Spring 会去查找 app.server.*
@ConfigurationProperties(prefix = "app.server")
public class ServerProperties {
    private Integer timeout;
    private boolean enabled;
    // 必须要有 Getter/Setter
    public Integer getTimeout() { return timeout; }
    public void setTimeout(Integer timeout) { this.timeout = timeout; }
    public boolean isEnabled() { return enabled; }
    public void setEnabled(boolean enabled) { this.enabled = enabled; }
}

3. 启用配置 (三种方式选其一)

  • 方式 A:配合 @Component (最简单)

    • ServerProperties 上直接加 @Component,配合 @ConfigurationProperties
  • 方式 B:使用 @EnableConfigurationProperties (推荐用于库开发)

    @Configuration
    @EnableConfigurationProperties(ServerProperties.class)
    public class MyConfig { ... }
  • 方式 C:使用 @ConfigurationPropertiesScan (适合大型项目)

    @SpringBootApplication
    @ConfigurationPropertiesScan("com.example.config") // 扫描指定包
    public class MyApplication { ... }

2. 自动装配核心 (Auto Configuration)

@EnableAutoConfiguration

  • 用途:Spring Boot 的魔法核心。它告诉 Spring Boot 根据添加的 jar 依赖自动配置 Spring 应用。

  • 原理:

    • 它利用 SpringFactoriesLoader 机制。
    • 扫描 classpath 下所有 jar 包中的 META-INF/spring.factories (Spring Boot 2.x) 或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (Spring Boot 3.x)。
    • 加载其中声明的配置类,但在加载前会通过 @Conditional 系列注解进行过滤。
  • 注意:通常包含在 @SpringBootApplication 中,很少单独使用。

3. 条件注解 (Conditionals)

这一组注解决定了 Bean 是否会被创建并注册到容器中。这是实现“自动装配”逻辑判断的关键。

@Conditional

  • 用途:最底层的注解。它接收一个实现了 Condition 接口的类。只有当 matches 方法返回 true 时,Bean 才会被创建。
  • 场景:编写非常复杂的自定义逻辑判断时使用。

@ConditionalOnProperty

  • 用途:这是 @Conditional 的扩展,专门用于判断配置文件中是否存在某个属性,或该属性的值是否等于特定值。

  • 常用属性:

    • prefix: 属性前缀。
    • name: 属性名。
    • havingValue: 期望的值(如果匹配则加载)。
    • matchIfMissing: 如果配置文件中没写这个属性,默认是否加载(true 为加载)。

📝 代码示例:基于配置开关功能的 Bean

假设我们根据配置决定启用 "短信通知" 还是 "邮件通知"。

1. 配置文件

feature:
  notification: sms  # 改为 email 则加载 EmailService

2. 业务 Bean 定义

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class NotificationConfig {
    @Bean
    // 当 feature.notification = email 时生效
    @ConditionalOnProperty(prefix = "feature", name = "notification", havingValue = "email")
    public NotificationService emailService() {
        return new EmailNotificationService();
    }
    @Bean
    // 当 feature.notification = sms 时生效
    // matchIfMissing = true 表示如果不配这个配置,默认也启用 SMS
    @ConditionalOnProperty(prefix = "feature", name = "notification", havingValue = "sms", matchIfMissing = true)
    public NotificationService smsService() {
        return new SmsNotificationService();
    }
}

📝 代码示例:自定义 @Conditional (高阶用法)

如果 @ConditionalOnProperty 无法满足需求(比如判断操作系统、判断某个文件是否存在),可以使用 @Conditional

// 1. 定义判断逻辑
public class WindowsCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("os.name").contains("Windows");
    }
}
// 2. 使用注解
@Bean
@Conditional(WindowsCondition.class) // 只有在 Windows 系统下才加载该 Bean
public CmdService cmdService() {
    return new WindowsCmdService();
}

4. 总结速查表

注解作用域核心作用一句话记忆
@ConfigurationProperties定义配置属性与 POJO 的映射"把 yml 变成 Java 对象"
@EnableConfigurationProperties配置类激活并注册 @ConfigurationProperties 类"手动开关:启用属性对象"
@ConfigurationPropertiesScan启动类自动扫描并注册属性类"自动开关:扫码全注册"
@EnableAutoConfiguration启动类开启自动装配机制 (SPI)"Spring Boot 的自动魔法引擎"
@Conditional方法/类自定义复杂的加载条件"万能的 if 判断"
@ConditionalOnProperty方法/类基于配置属性值决定是否加载 Bean"根据开关 (Toggle) 加载 Bean"

到此这篇关于SpringBoot自动装配注解的实现示例的文章就介绍到这了,更多相关SpringBoot自动装配注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis中的properties配置(推荐)

    MyBatis中的properties配置(推荐)

    这篇文章给大家介绍了MyBatis中的properties配置,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • 一文详解Java过滤器拦截器实例逐步掌握

    一文详解Java过滤器拦截器实例逐步掌握

    这篇文章主要为大家介绍了Java过滤器拦截器实例详解逐步掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例

    这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • SpringBoot中四种常用的条件装配技术详解

    SpringBoot中四种常用的条件装配技术详解

    Spring Boot提供了多种条件装配技术,允许开发者根据不同条件动态配置应用程序,本文将介绍Spring Boot中四种常用的条件装配技术,需要的可以参考下
    2025-04-04
  • Java web含验证码及权限登录实例代码

    Java web含验证码及权限登录实例代码

    这篇文章主要介绍了Java web含验证码及权限登录实例代码,所用到的开发工具为myeclipse10,MySQL数据库,具体实现代码大家参考下本文吧
    2017-03-03
  • springboot jsp支持以及转发配置方式

    springboot jsp支持以及转发配置方式

    文章介绍了如何在Spring Boot项目中配置和使用JSP,并提供了一步一步的指导,包括添加依赖、配置文件设置、控制器和视图的使用
    2024-12-12
  • 彻底卸载、更换jdk全过程

    彻底卸载、更换jdk全过程

    本文介绍了卸载旧版JDK并安装新版JDK的详细步骤,包括卸载JDK、删除注册表中的JavaSoft文件夹、删除环境变量、删除exe文件以及安装新版JDK
    2026-02-02
  • SpringCloud集成MybatisPlus实现MySQL多数据源配置方法

    SpringCloud集成MybatisPlus实现MySQL多数据源配置方法

    本文详细介绍了SpringCloud集成MybatisPlus实现MySQL多数据源配置的方法,包括在application.properties中配置多数据源,配置MybatisPlus,创建Mapper接口和使用多数据源等步骤,此外,还解释了每一个配置项目的含义,以便读者更好地理解和应用
    2024-10-10
  • Jenkins中修改admin账号密码的正确位置与方法步骤

    Jenkins中修改admin账号密码的正确位置与方法步骤

    这篇文章主要介绍了Jenkins中修改admin账号密码的正确位置与方法步骤,包括通过Web界面修改和后台重置两种情况,同时还强调了直接修改配置文件的方法的安全风险,并提供了常见问题的解决提示,需要的朋友可以参考下
    2026-02-02
  • MyBatis传入参数为List对象的实现

    MyBatis传入参数为List对象的实现

    这篇文章主要介绍了MyBatis传入参数为List对象的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论