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 필드 가 10 인 someBean 이라는 이름의 빈이 있다고 가정 합니다. 그런 다음 필드에 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 프로젝트 에서 사용할 수 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-value-annotation
'Java' 카테고리의 다른 글
Spring Boot의 유효성 검사(validation 예제) (0) | 2021.03.12 |
---|---|
자바에서 HashMap 초기화 (0) | 2021.03.12 |
스프링 부트 액추에이터 (0) | 2021.03.12 |
Java에서 문자열에 개행 문자(줄 바꿈) 추가 (0) | 2021.03.11 |
Java로 파일을 읽는 방법 (0) | 2021.03.11 |