@Value
を使用する
@Value
は通常、外部化されたプロパティを注入するために使用されます。
Java
Kotlin
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name}") String catalog) {
this.catalog = catalog;
}
}
@Component
class MovieRecommender(@Value("\${catalog.name}") private val catalog: String)
次の構成で:
Java
Kotlin
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }
@Configuration
@PropertySource("classpath:application.properties")
class AppConfig
そして、次の application.properties
ファイル:
catalog.name=MovieCatalog
その場合、catalog
パラメーターとフィールドは MovieCatalog
値と等しくなります。
デフォルトの寛容な埋め込み値リゾルバーは、Spring によって提供されます。プロパティ値を解決しようとしますが、解決できない場合は、プロパティ名(${catalog.name}
など)が値として挿入されます。存在しない値を厳密に制御したい場合は、次の例に示すように、PropertySourcesPlaceholderConfigurer
Bean を宣言する必要があります。
Java
Kotlin
@Configuration
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
@Configuration
class AppConfig {
@Bean
fun propertyPlaceholderConfigurer() = PropertySourcesPlaceholderConfigurer()
}
JavaConfig を使用して PropertySourcesPlaceholderConfigurer を構成する場合、@Bean メソッドは static でなければなりません。 |
上記の構成を使用すると、${}
プレースホルダーを解決できなかった場合に Spring の初期化が失敗することが保証されます。setPlaceholderPrefix
、setPlaceholderSuffix
、setValueSeparator
や setEscapeCharacter
などのメソッドを使用してプレースホルダーをカスタマイズすることもできます。
Spring Boot は、デフォルトで、application.properties および application.yml ファイルからプロパティを取得する PropertySourcesPlaceholderConfigurer Bean を構成します。 |
Spring が提供する組み込みのコンバーターサポートにより、単純な型変換(たとえば、Integer
または int
への変換)を自動的に処理できます。複数のコンマ区切り値は、余分な労力をかけずに自動的に String
配列に変換できます。
次のようにデフォルト値を提供することが可能です。
Java
Kotlin
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
this.catalog = catalog;
}
}
@Component
class MovieRecommender(@Value("\${catalog.name:defaultCatalog}") private val catalog: String)
Spring BeanPostProcessor
は、バックグラウンドで ConversionService
を使用して、@Value
の String
値をターゲット型に変換するプロセスを処理します。独自のカスタム型の変換サポートを提供する場合は、次の例に示すように、独自の ConversionService
Bean インスタンスを提供できます。
Java
Kotlin
@Configuration
public class AppConfig {
@Bean
public ConversionService conversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
conversionService.addConverter(new MyCustomConverter());
return conversionService;
}
}
@Configuration
class AppConfig {
@Bean
fun conversionService(): ConversionService {
return DefaultFormattingConversionService().apply {
addConverter(MyCustomConverter())
}
}
}
@Value
に SpEL
式が含まれる場合、次の例に示すように、値は実行時に動的に計算されます。
Java
Kotlin
@Component
public class MovieRecommender {
private final String catalog;
public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {
this.catalog = catalog;
}
}
@Component
class MovieRecommender(
@Value("#{systemProperties['user.catalog'] + 'Catalog' }") private val catalog: String)
SpEL は、より複雑なデータ構造の使用も可能にします。
Java
Kotlin
@Component
public class MovieRecommender {
private final Map<String, Integer> countOfMoviesPerCatalog;
public MovieRecommender(
@Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {
this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;
}
}
@Component
class MovieRecommender(
@Value("#{{'Thriller': 100, 'Comedy': 300}}") private val countOfMoviesPerCatalog: Map<String, Int>)