如何在SpringBoot中使用@Value注解来设置默认值
作者:mmseoamin日期:2023-12-14

👽👽👽在Spring Boot中,使用@Value注解可以为属性设置默认值。

一、支持注入数据类型

@Value注解可以用于注入以下类型属性

1、基本数据类型(如字符串、整数、浮点数等)

2、基本数据类型的数组

3、集合类型(如List、Set等)

4、自定义数据类型,包括自定义对象和自定义对象的集合

5、Spring框架提供的特殊类型,如Environment、Resource等

需要注意的是,对于集合类型和自定义数据类型的注入,需要使用特定的语法来表示,例如使用逗号分隔的字符串来表示数组,使用逗号分隔的字符串列表来表示集合类型。同时,还可以使用SpEL表达式来进行动态注入。

二、默认值数据类型

以下是使用@Value设置默认值的方法:

1. 基本类型和字符串类型:

使用 ${propertyName:defaultValue} 语法为基本类型和字符串类型的属性设置默认值。

如果在配置文件中没有配置对应的属性值,则会使用默认值。

例如:

@Value("${app.port:8080}")
private int port;
@Value("${app.name:MyApp}")
private String appName;

在上面的例子中,如果在配置文件中没有配置app.port的值,则port的默认值为8080;如果没有配置app.name的值,则appName的默认值为"MyApp"。

2. 数组和集合类型:

使用==${propertyName:defaultValue}==语法为数组和集合类型的属性设置默认值。默认值可以是逗号分隔的多个元素。例如:

@Value("${app.names:John,Doe}")
private String[] appNames;
@Value("${app.tags:tag1,tag2,tag3}")
private List appTags;

在上面的例子中,如果在配置文件中没有配置app.names的值,则appNames的默认值为包含"John"和"Doe"两个元素的数组;如果没有配置app.tags的值,则appTags的默认值为包含三个元素"tag1"、"tag2"和"tag3"的列表。

3. Map类型:

使用SpEL表达式为Map类型的属性设置默认值。例如:

@Value("#{${app.properties:{key1:'value1', key2:'value2'}}}")
private Map appProperties;

在上面的例子中,如果在配置文件中没有配置app.properties的值,则appProperties的默认值为包含两个键值对:“key1"对应"value1”,"key2"对应"value2"的Map。

不同数据类型的示例:

@Component
public class MyComponent {
    @Value("${app.port:8080}")
    private int port;
    @Value("${app.name:MyApp}")
    private String appName;
    @Value("${app.names:John,Doe}")
    private String[] appNames;
    @Value("${app.tags:tag1,tag2,tag3}")
    private List appTags;
    @Value("#{${app.properties:{key1:'value1', key2:'value2'}}}")
    private Map appProperties;
    public void displayValues() {
        System.out.println("Port: " + port);
        System.out.println("App Name: " + appName);
        System.out.println("App Names: " + Arrays.toString(appNames));
        System.out.println("App Tags: " + appTags);
        System.out.println("App Properties: " + appProperties);
    }
}

4. Environment&Resource

当使用@Value注解注入Environment和Resource类型的属性时,需要使用特定的语法来表示。

首先,需要确保在类上添加了@Component或者@Configuration注解,以便让Spring容器能够扫描到并进行注入。

示例代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
@Component
public class MyComponent {
    @Value("${my.property}")
    private String myProperty;
    
    @Value("${my.array}")
    private String[] myArray;
    
    @Value("${my.list}")
    private List myList;
    
    @Value("${my.environment.property}")
    private String environmentProperty;
    
    @Value("classpath:path/to/myfile.txt")
    private Resource resource;
    
    // getter and setter methods
    
    public void printValues() {
        System.out.println("myProperty: " + myProperty);
        System.out.println("myArray: " + Arrays.toString(myArray));
        System.out.println("myList: " + myList);
        System.out.println("environmentProperty: " + environmentProperty);
        System.out.println("resource: " + resource);
    }
}

在上面的示例中,我们注入了不同类型的属性,包括基本数据类型、数组、集合、Environment和Resource。

myProperty注入了一个键为my.property的属性值。

myArray注入了键为my.array的属性值,并将其解析为字符串数组。

myList注入了键为my.list的属性值,并将其解析为字符串列表。

environmentProperty注入了一个Environment属性值,其中my.environment.property是Environment中的某个键。

resource注入了一个Resource属性值,表示了一个类路径下的文件。

您可以在其他类中使用@Autowired注解将MyComponent注入,并调用printValues方法来查看注入的属性值。

请确保在application.properties或application.yml配置文件中定义了相应的属性值。

application.properties:

my.property=Hello World
my.array=value1,value2,value3
my.list=value1,value2,value3
my.environment.property=my.environment.value

application.yml:

my:
  property: Hello World
  array: value1,value2,value3
  list: value1,value2,value3
  environment:
    property: my.environment.value

通过以上步骤,我们就能够成功地注入Environment和Resource类型的属性了。

三、总结:

  • 使用@Value注解可以为属性设置默认值,可以在配置文件中使用${propertyName:defaultValue}语法为基本类型、字符串类型、数组和集合类型的属性设置默认值,也可以使用SpEL表达式为Map类型的属性设置默认值。
  • 使用@Value注解设置默认值可以使应用程序在缺少配置值时有一个合理的默认行为。