SpringBoot:SpringBoot强大的自定义属性配置

一、前言

**  在Spring Boot中,自定义属性配置是指除了Spring Boot默认提供的配置属性外,用户根据自身需求定义的配置属性。这些属性可以在application.properties或application.yml文件中进行设置,并通过特定的方式在Spring Boot应用程序中进行加载和使用。其中@Value和@ConfigurationProperties是两种常用的注解**

二、简介

2.1 用途

@Value:主要用于从简单的属性文件中注入值,如application.properties或application.yml。它可以直接将配置文件中的某个具体值注入到Spring管理的Bean的某个字段上。它适用于单个配置项的注入,且通常用于简单的属性注入场景。

@ConfigurationProperties:用于从带有嵌套属性的复杂配置文件中注入值,如application.yml。它支持更复杂的配置,可以处理嵌套属性、列表、集合等,并提供了类型安全。

2.2 类型安全

@Value:不支持类型安全,当需要注入的属性与字段类型不匹配时,需要手动进行类型转换或使用第三方库(如Apache Commons BeanUtils)进行转换。

@ConfigurationProperties:支持类型安全,通过自动绑定和类型转换,可以确保注入的属性与字段类型完全匹配。

2.3 配置方式

@Value:通常直接通过注解的value属性指定要注入的属性@Value("${property.name}")。

@ConfigurationProperties:需要配合prefix属性指定配置属性的前缀,Spring Boot会自动将该前缀下的所有属性绑定到对应的字段上。同时,可以配合@Configuration或@Component等注解使用,将配置属性封装为一个Bean。

2.4 默认值与错误处理

@Value:支持在注解中指定默认值,如@Value("${property.name:defaultValue}")。如果指定的属性不存在,将使用默认值。但如果不指定默认值且属性不存在,则会抛出异常。

@ConfigurationProperties:支持更复杂的错误处理和默认值设置。例如,可以通过ignoreUnknownFields属性忽略未知字段,避免因为配置文件中的额外字段导致错误。

三、案例分析

@Value

java 复制代码
假设你的application.properties文件中有以下配置
app.name=DCCAPP
app.version=1.0.0
java 复制代码
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;  
  
@Component  
public class AppConfig {  
  
    @Value("${app.name}")  
    private String appName;  
  
    @Value("${app.version}")  
    private String appVersion;  
  
    // getters and setters...  
}

@ConfigurationProperties

java 复制代码
假设你的application.properties文件中有以下配置
csb:
  requestURL: http://127.0.0.1:8086/CSB
  accessKey: 123456
  secretKey: abc123456
java 复制代码
@Component
@ConfigurationProperties(prefix = "csb")
public class CsbConfig {

    /**
     * 请求Path
     */
    private String requestURL;

    /**
     * AK
     */
    private String accessKey;

    /**
     * SK
     */
    private String secretKey;

    public String getRequestURL() {
        return requestURL;
    }

    public void setRequestURL(String requestURL) {
        this.requestURL = requestURL;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }
} 

**  注意:为了使@ConfigurationProperties注解正常工作,你通常需要在你的Spring Boot主类或配置类上添加@EnableConfigurationProperties注解(但在Spring Boot 2.2及以上版本中,对于@Component类,这不是必需的)。**

四、 自定义属性的优先级

Spring Boot支持从多个位置加载属性,并按照一定的优先级进行排序。这些位置包括:

①.命令行参数

②.java:comp/env 里的 JNDI 属性

③.JVM 系统属性

④.操作系统环境变量

⑤.随机生成的带 random.* 前缀的属性

⑥.应用程序以外的 application.properties 或 application.yml 文件

⑦.打包在应用程序内的 application.properties 或 application.yml 文件

⑧.通过 @PropertySource 标注的属性源

⑨.默认属性

五、与自定义属性相关的几个注解

**  在Spring Boot中,@Conditional注解及其派生注解(如@ConditionalOnClass、@ConditionalOnProperty、@ConditionalOnMissingBean、@ConditionalOnBean等)允许你根据特定的条件来决定是否应该创建一个bean。这些条件注解为Spring Boot的自动配置(auto-configuration)提供了强大的灵活性。**

①. @ConditionalOnClass

  注解用于确保指定的类在类路径(classpath)上可用时,才会创建bean。这通常用于检查是否存在某个依赖库。

java 复制代码
@Configuration  
@ConditionalOnClass(DataSource.class)  
public class DataSourceConfig {  
    // ...  
}
上面的配置类只有在DataSource类(通常来自JDBC API)在类路径上时才会被加载。

②. @ConditionalOnProperty

  注解允许你根据某个配置属性的值来决定是否创建bean。

java 复制代码
@Configuration  
@ConditionalOnProperty(name = "test.enabled", havingValue = "true")  
public class MyConfig {  
    // ...  
}
上面的配置类只有在test.enabled属性被设置为true时才会被加载。

③. @ConditionalOnMissingBean

  注解用于确保当容器中不存在指定类型的bean时,才会创建bean。这允许你提供默认实现,但允许用户通过定义自己的bean来覆盖它。

java 复制代码
@Bean  
@ConditionalOnMissingBean  
public MyService myService() {  
    return new MyDefaultService();  
}
上面的myService方法会创建一个MyService类型的bean,但只有当容器中没有其他MyService类型的bean时才会这样做。

④. @ConditionalOnBean

  与@ConditionalOnMissingBean相反,@ConditionalOnBean注解确保只有当容器中已经存在指定类型的bean时,才会创建bean。

java 复制代码
@Bean  
@ConditionalOnBean(BService.class)  
public AService aService(BService bService) {  
    return new AService(bService);  
}
上面的aService方法会创建一个MyDependentService类型的bean,但只有当容器中已经存在一个BService类型的bean时才会这样做。

⑤. 组合使用这些条件注解

  以便创建更复杂的条件逻辑。例如,仅在某个类存在且某个属性被设置为true时才创建bean。

java 复制代码
@Configuration  
@ConditionalOnClass(DataSource.class)  
@ConditionalOnProperty(name = "test.enabled", havingValue = "true")  
public class TestDataSourceConfig {  
    // ...  
}

在这个例子中,配置类TestDataSourceConfig只有在DataSource类在类路径上且test.enabled属性被设置为true时才会被加载。

**  以上就是自定义属性配置与注解@Value和@ConfigurationProperties的介绍与代码使用,以及Conditional注解及其派生注解在构建复杂场景的时候与@Configuration的结合使用。**

相关推荐
悦数图数据库6 小时前
图数据库选型指南 2026:从架构、性能、AI 适配三个维度看 悦数科技
数据库·人工智能·架构
better_liang6 小时前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码7 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
better_liang7 小时前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit7 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
ServBay8 小时前
2026 Mac 本地大模型部署深度解析与混合架构指南
后端·macos·aigc
一拳一个娘娘腔8 小时前
【SRC漏洞挖掘系列】第10期:GraphQL & API 安全 —— 现代 API 的“裸奔”时代
后端·安全·graphql
ZhengEnCi8 小时前
01-如何监听接口调用情况?
java·spring boot·后端