一、前言
** 在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的结合使用。**