1. 개요

이 빠른 자습서에서는 @Value Spring 어노테이션을 살펴볼입니다.

이 어노테이션은 Spring 관리 빈의 필드에 값을 주입하는 데 사용할 수 있으며 필드 또는 생성자 / 메서드 매개 변수 수준에서 적용 할 수 있습니다.

2. Application properties 셋팅

이 어노테이션에 대한 다양한 사용을 설명하려면 간단한 Spring 애플리케이션 구성 클래스를 구성해야합니다.

당연히 @Value 어노테이션 으로 주입 할 값을 정의하려면 속성 파일이 필요합니다 . 따라서 먼저 구성 클래스에서 속성 파일 이름 으로 @PropertySource 를 정의해야합니다 .

속성 파일을 정의 해 보겠습니다.

value.from.file=Value got from the file
priority=high
listOfValues=A,B,C

3. 사용 예

기본적이고 거의 쓸모없는 예로서 어노테이션의 "문자열 값"만 필드에 삽입 할 수 있습니다.

@Value("string value")
private String stringValue;

은 Using @PropertySource의 어노테이션하는 것은 우리가 가진 특성 파일에서 값을 사용하여 작업 할 수 있습니다 @Value 어노테이션.

다음 예에서는  필드에 할당 된 파일에서 값 을 얻 습니다 .

@Value("${value.from.file}")
private String valueFromFile;

동일한 구문으로 시스템 속성의 값을 설정할 수도 있습니다.

systemValue 라는 시스템 속성을 정의했다고 가정 해 보겠습니다 .

@Value("${systemValue}")
private String systemValue;

정의되지 않은 속성에 대해 기본값을 제공 할 수 있습니다. 여기에 일부 기본값  이 삽입됩니다.

@Value("${unknown.param:some default}")
private String someDefault;

동일한 속성이 시스템 속성과 속성 파일에 정의되어 있으면 시스템 속성이 적용됩니다.

System property 값이있는 시스템 속성 으로 정의되고 속성 파일에서 다른 것으로 정의 된 속성 우선 순위 가 있다고 가정 합니다. 값은 시스템 속성입니다 .

@Value("${priority}")
private String prioritySystemProperty;

때로는 많은 값을 주입해야합니다. 속성 파일의 단일 속성에 대해 쉼표로 구분 된 값으로 정의하거나 시스템 속성으로 정의하고 배열에 삽입하는 것이 편리합니다.

첫번째 섹션에서, 우리는 쉼표로 구분 된 값을 정의 listOfValues 속성 파일 , 배열의 값이 될 수 있도록 [ "A", "B", "C"] :

@Value("${listOfValues}")
private String[] valuesArray;

4. SpEL을 사용한 고급 예제

SpEL 표현식을 사용하여 값을 얻을 수도 있습니다.

priority 라는 시스템 속성이있는 경우 해당 값이 필드에 적용됩니다.

@Value("#{systemProperties['priority']}")
private String spelValue;

시스템 속성을 정의하지 않은 경우 null 값이 할당됩니다.

이를 방지하기 위해 SpEL 표현식에 기본값을 제공 할 수 있습니다. 시스템 속성이 정의되지 않은 경우 필드에 대한 몇 가지 기본값을 얻습니다 .

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

또한 다른 빈의 필드 값을 사용할 수 있습니다. someValue 필드 10someBean 이라는 이름의 빈이 있다고 가정 합니다. 그런 다음 필드에 10 이 할당됩니다.

@Value("#{someBean.someValue}")
private Integer someBeanValue;

속성을 조작하여 List ( 여기서는 문자열 값 A, B, C List) 을 얻을 수 있습니다 .

@Value("#{'${listOfValues}'.split(',')}")
private List<String> valuesList;

5. Map 와 함께 @Value 사용

@Value 어노테이션을 사용하여 Map 속성 을 삽입 할 수도 있습니다 .

먼저 속성 파일 {key : 'value'} 형식으로 속성을 정의해야 합니다.

valuesMap={key1: '1', key2: '2', key3: '3'}

의 값 은 작은 따옴표로 묶어야합니다.

이제 속성 파일에서이 값을 Map 으로 삽입 할 수 있습니다 .

@Value("#{${valuesMap}}")
private Map<String, Integer> valuesMap;

우리는 필요한 경우 특정 키 값을 얻기 위해Map를 , 우리가해야 할 모든은 표현의 키의 이름을 추가합니다 :

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

Map 에 특정 키가 포함되어 있는지 확실 하지 않은 경우 예외를 발생 시키지 않고 키를 찾을 수 없을 때 값을 null로 설정하는 더 안전한 표현식을 선택해야합니다 .

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

존재하지 않을 수있는 속성 또는 키에 대한 기본값설정할 수도 있습니다 .

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map<String, Integer> unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

주입 전에 항목을 필터링 할 수도 있습니다 .

값이 1보다 큰 항목 만 가져와야한다고 가정 해 보겠습니다.

@Value("#{${valuesMap}.?[value>'1']}")
private Map<String, Integer> valuesMapFiltered;

@Value 어노테이션을 사용하여 모든 현재 시스템 속성삽입 할 수도 있습니다 .

@Value("#{systemProperties}")
private Map<String, String> systemPropertiesMap;

6. 생성자 주입과 함께 @Value 사용

@Value 어노테이션 을 사용할 때 필드 주입에 국한되지 않습니다. 생성자 주입과 함께 사용할 수도 있습니다.

이것을 실제로 봅시다 :

@Component
@PropertySource("classpath:values.properties")
public class PriorityProvider {

    private String priority;

    @Autowired
    public PriorityProvider(@Value("${priority:normal}") String priority) {
        this.priority = priority;
    }

    // standard getter
}

위의 예에서는 PriorityProvider 의 생성자에 직접 우선 순위를 삽입합니다 .

속성을 찾을 수없는 경우에도 기본값을 제공합니다.

7. Setter 주입과 함께 @Value 사용

생성자 주입과 유사하게 setter 주입과 함께 @Value사용할 수도 있습니다 .

한 번 보자:

@Component
@PropertySource("classpath:values.properties")
public class CollectionProvider {

    private List<String> values = new ArrayList<>();

    @Autowired
    public void setValues(@Value("#{'${listOfValues}'.split(',')}") List<String> values) {
        this.values.addAll(values);
    }

    // standard getter
}

SpEL 표현식을 사용하여 값 List을 setValues 메소드에 삽입합니다 .

8. 결론

이 기사에서는 파일에 정의 된 간단한 속성, 시스템 속성 및 SpEL 표현식으로 계산 된 속성과 함께 @Value 어노테이션 을 사용할 수있는 다양한 가능성을 조사했습니다 .

항상 그렇듯이 예제 애플리케이션은 GitHub 프로젝트 에서 사용할 수 있습니다 .