@ConfigurationProperties和@EnableConfigurationProperties详解

@ConfigurationProperties:

  • @ConfigurationProperties注解用于自动配置绑定,可以将配置中的值注入到bean对象上。

如下图:

在yml配置文件中定义了一个配置信息,其中每个属性名和类中属性名一一对应

其中 @Component将类转换为bean,@Data是简化实体类开发,prefix=“”意思是匹配配置文件中的配置信息,我们在启动类中将其打印出来。

 

可以看到,配置中的值成功注入。

再来看

 @EnableConfigurationProperties:

        @EnableConfigurationProperties注解可以将使用@ConfigurationProperties注解对应的类加入Spring容器,可以理解为一个@ConfigurationProperties的开关。

如下,在启动类上运用。

实体类注解如下:

运行启动类结果如下:

同样能成功运行。

但是细心的人会发现,我将@Component注释起来了,为什么?

让我们看看 不注释@Component结果会如何:

报错了!!!为什么? 

 这个报错的意思是想要找到一个单一匹配的ServerConfig的bean,结果找到了俩。

这是因为@Component 可以将类加入Spring容器,而 @EnableConfigurationProperties会默认将它管理的类加入容器,这样就会造成容器中存在两个同名的bean,导致报错,所以当我们在使用@EnableConfigurationProperties和@Component时,要注意不能让@EnableConfigurationProperties管理的类上方同时出现@Component。

 

<think>好的,我现在需要回答用户关于Spring Boot中@EnableConfigurationProperties@ConfigurationProperties两个注解的问题。首先,我要回想一下这两个注解的具体作用用法,确保自己理解正确。 用户之前已经询问过属性绑定相关的注解,现在进一步深入,要求详细介绍这两个。我需要明确两者的区别联系。首先,@ConfigurationProperties用于将配置文件中的属性绑定到Bean,而@EnableConfigurationProperties则是启用这种绑定机制,通常配置类一起使用。 接下来,我需要组织内容的结构。可能分为两个部分,分别介绍每个注解,然后比较它们的协同工作方式。同时,用户之前的回答中提到了@ConfigurationProperties的一些细节,比如类型安全、松散绑定等,这里需要再次强调,但也要补充与@EnableConfigurationProperties的关系。 需要注意的是,用户可能已经有一定的了解,所以需要提供更深入的信息,例如使用场景、示例代码以及常见问题。需要确保示例代码正确,符合之前提到的LaTeX格式要求,但根据系统指令,行内数学表达式用$...$,而独立公式用$$...$$。不过在这里主要是代码示例,可能需要用代码块展示,但用户之前的回答使用了代码块,所以继续沿用。 还要检查是否有遗漏的重要点,比如是否需要提到在Spring Boot的版本差异,比如@ConstructorBinding在2.2+中的支持,但这里可能不相关,但如果有涉及这两个注解的变化,需要提及。此外,是否需要说明在Spring Boot自动配置中这些注解的作用。 需要确认@EnableConfigurationProperties的作用是否包括注册配置属性Bean到Spring上下文,而@ConfigurationProperties本身需要结合@Component或其他方式注册。例如,使用@EnableConfigurationProperties可以避免在配置类上添加@Component,而是通过该注解来启用。 另外,是否需要提到在Spring Boot的自动配置类中,通常使用@EnableConfigurationProperties来引入外部的配置属性类,这样可以将配置属性与自动配置逻辑分离,提高模块化。 可能还需要讨论当使用@ConfigurationProperties时,如果没有使用@Component或@EnableConfigurationProperties,是否会失效,导致属性无法绑定。这时候需要解释两者如何配合使用,确保Bean被正确创建属性注入。 需要确保语言简洁明了,结构清晰,分点说明,帮助用户逐步理解。同时,回顾用户之前的回答,避免重复,但可以适当补充更详细的内容,例如更复杂的示例或者使用中的注意事项。 最后,检查是否有遵循系统级指令,如使用正确的中文,LaTeX格式是否正确,行内独立公式的区分,但这里主要涉及代码示例,所以可能不涉及数学公式,但需要确保代码块的正确展示。同时,回答结构要符合用户可见层的要求,结构清晰,步骤明确,真实可靠。</think>### @EnableConfigurationProperties@ConfigurationProperties 详解Spring Boot 中,`@ConfigurationProperties` `@EnableConfigurationProperties` 是用于属性绑定的核心注解。它们协同工作,但职责不同。以下从**功能**、**使用方式****关联性**三个方面进行对比分析。 --- #### 一、@ConfigurationProperties:属性绑定的核心 ##### 1. **核心作用** - **属性映射**:将配置文件(如 `application.yml`)中的属性**批量绑定**到 Java 对象。 - **类型安全**:自动将字符串配置值转换为目标字段类型(如 `List`、`Map`、自定义对象等)。 - **松散绑定**:支持属性名的多种格式(如 `app.server-url` → `serverUrl`)。 ##### 2. **使用方式** - **标注在类上**:通过 `prefix` 指定配置前缀。 - **依赖 Setter 或构造函数**: - 若使用 Setter 注入,需提供字段的 Setter 方法。 - 若使用构造函数绑定(不可变对象),需配合 `@ConstructorBinding`(Spring Boot 2.2+)。 ##### 3. **示例** ```java @ConfigurationProperties(prefix = "app") public class AppConfig { private String name; private Database database; // Setter/Getter 或构造函数(略) } public class Database { private String url; private String username; } ``` 配置文件 `application.yml`: ```yaml app: name: MyApp database: url: jdbc:mysql://localhost:3306/db username: root ``` ##### 4. **关键特性** - **嵌套对象支持**:自动递归绑定层级属性。 - **集合类型支持**:如 `List`、`Map` 可直接映射(如 `app.servers[0]=server1`)。 - **校验支持**:结合 `@Validated` JSR-303 注解(如 `@NotNull`)进行属性验证。 --- #### 二、@EnableConfigurationProperties:启用属性绑定的开关 ##### 1. **核心作用** - **注册配置类**:将 `@ConfigurationProperties` 标注的类**显式注册为 Spring Bean**。 - **触发绑定流程**:启用属性绑定机制,使 `@ConfigurationProperties` 生效。 ##### 2. **使用场景** - **非自动扫描的类**:当配置类未被 `@Component` 扫描时(如第三方库中的类),需通过此注解手动注册。 - **明确控制配置类的加载顺序**:在特定配置类中集中管理属性绑定。 ##### 3. **示例** ```java @Configuration @EnableConfigurationProperties(AppConfig.class) public class MyConfiguration { // 其他 Bean 定义 } ``` 或直接标注在启动类: ```java @SpringBootApplication @EnableConfigurationProperties(AppConfig.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ##### 4. **关键特性** - **按需加载**:仅在需要时启用特定配置类的绑定。 - **避免组件扫描依赖**:不依赖 `@ComponentScan` 自动发现配置类。 --- #### 三、二者的协同工作 | 场景 | 实现方式 | | --- | --- | | **自动绑定(推荐)** | 在 `@ConfigurationProperties` 类上添加 `@Component`,Spring 自动扫描并绑定。 | | **手动绑定** | 使用 `@EnableConfigurationProperties(AppConfig.class)` 显式注册配置类。 | ##### 典型工作流程: 1. **定义配置类**:使用 `@ConfigurationProperties` 声明属性映射规则。 2. **启用绑定**:通过 `@EnableConfigurationProperties` 或 `@Component` 将配置类纳入 Spring 容器。 3. **注入使用**:通过 `@Autowired` 获取配置类的实例。 --- #### 四、对比总结 | 注解 | 职责 | 使用位置 | 是否必须 | | --- | --- | --- | --- | | `@ConfigurationProperties` | 定义属性映射规则 | **配置类** | 是(绑定属性必须) | | `@EnableConfigurationProperties` | 启用属性绑定并注册配置类 | **配置类或启动类** | 否(若配置类已被 `@Component` 扫描) | --- #### 五、常见问题 1. **属性未生效**: - 检查 `@EnableConfigurationProperties` 是否遗漏,或配置类未被 Spring 扫描。 - 确认 `prefix` 与配置文件中的前缀一致。 2. **嵌套对象绑定失败**: - 确保嵌套类有默认构造函数 Setter 方法。 3. **IDE 无属性提示**: - 添加 `spring-boot-configuration-processor` 依赖生成元数据。 --- #### 六、最佳实践 - **推荐组合**:在配置类上同时使用 `@Configuration` + `@ConfigurationProperties`,避免滥用 `@Component`。 - **模块化配置**:为不同功能模块定义独立的配置类,通过 `@EnableConfigurationProperties` 按需启用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值