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的结合使用。**

相关推荐
ok!ko3 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2401_857622663 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589363 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没5 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch5 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
编程、小哥哥5 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程6 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
韩楚风6 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
莹雨潇潇6 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器