@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 の初期化が失敗することが保証されます。setPlaceholderPrefixsetPlaceholderSuffixsetValueSeparator や 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>)