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

假设你的application.properties文件中有以下配置
app.name=DCCAPP
app.version=1.0.0
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

假设你的application.properties文件中有以下配置
csb:
  requestURL: http://127.0.0.1:8086/CSB
  accessKey: 123456
  secretKey: abc123456
@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。这通常用于检查是否存在某个依赖库。

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

②. @ConditionalOnProperty

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

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

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

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

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


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

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

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

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

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

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

  • 47
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值