@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() などのメソッドを使用してプレースホルダの構文をカスタマイズすることも可能です。さらに、JVM システムプロパティ(または SpringProperties メカニズム)を介して spring.placeholder.escapeCharacter.default プロパティを設定することで、デフォルトのエスケープ文字をグローバルに変更または無効化できます。
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>)