@Value
는 일반적으로 외부화(externalized)된 속성(property)을 주입하는 데 사용됩니다.
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name}") String catalog) {
this.catalog = catalog;
}
}
다음 구성을 사용합니다
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }
그리고 다음 application.properties
파일과 함께요:
catalog.name=MovieCatalog
이 경우 catalog
매개변수와 필드는 MovieCatalog
값과 동일(equal)합니다.
기본 관대한(lenient) 내장 값 resolver는 Spring에서 제공됩니다. 속성(property) 값을 확인하려고 시도하며, 확인할 수 없는 경우 속성 이름(예: ${catalog.name}
)이 값으로 삽입됩니다. 존재하지 않는 값에 대해 엄격한 제어를 유지하려면 다음 예제와 같이 PropertySourcesPlaceholderConfigurer
빈을 선언해야 합니다.
@Configuration
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
[Note]
JavaConfig를 사용하여PropertySourcesPlaceholderConfigurer
를 구성할 때@Bean
메서드는static
이어야 합니다.
위 구성을 사용하면 ${}
자리 표시자를 resolve 할 수 없는 경우 Spring 초기화가 실패합니다. setPlaceholderPrefix
, setPlaceholderSuffix
또는 setValueSeparator
와 같은 메소드를 사용하여 자리 표시자를 사용자 정의하는 것도 가능합니다.
[Note]
Spring Boot는 기본적으로application.properties
및application.yml
파일에서 속성을 가져오는PropertySourcesPlaceholderConfigurer
빈을 구성합니다.
Spring이 제공하는 내장 변환기(converter) 지원을 통해 간단한 타입 변환(예: Integer
또는 int
로)을 자동으로 처리할 수 있습니다. 여러 개의 쉼표로 구분된 값을 추가 노력 없이 자동으로 String
배열로 변환할 수 있습니다.
다음과 같이 기본값을 제공할 수 있습니다.
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
this.catalog = catalog;
}
}
Spring BeanPostProcessor
는 배후에서 ConversionService
를 사용하여 @Value
의 String
값을 대상 타입으로 변환하는 프로세스를 처리합니다. 고유한 사용자 정의 타입에 대한 변환 지원을 제공하려는 경우 다음 예제와 같이 고유한 ConversionService
Bean 인스턴스를 제공할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
public ConversionService conversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
conversionService.addConverter(new MyCustomConverter());
return conversionService;
}
}
@Value
에 SpEL
표현식이 포함된 경우 값은 다음 예제와 같이 런타임 시 동적으로 계산됩니다.
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {
this.catalog = catalog;
}
}
SpEL을 사용하면 더욱 복잡한 데이터 구조도 사용할 수 있습니다.
@Component
public class MovieRecommender {
private final Map<String, Integer> countOfMoviesPerCatalog;
public MovieRecommender(
@Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {
this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;
}
}