spring.svg

【Spring Boot】プロパティファイル

SpringBoot

プロパティファイル

application.properties

Spring Boot ではapplication.propertiesファイルに各設定を行います。 以下はデータベース(MySQL)の接続設定の例です。

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=hoge
spring.datasource.password=fugafuga
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

application.propertiesは、application.ymlと YAML に変更することができます。 この場合、ファイルは以下のように設定します。

application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: hoge
    password: fugafuga
    driver-class-name: com.mysql.cj.jdbc.Driver

Spring Boot の設定プロパティは以下を参照してください。

参考: https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html

カスタムプロパティ

application.propertiesには、ファイルの記述ルールに則れば、独自のプロパティを設定することができます。

application.properties
myproperties.hoge=hoge
myproperties.fuga=fuga
application.yml
myproperties:
  hoge: hoge
  fuga: fuga

プロパティファイルの分割

application.propertiesと同じ階層に、別のプロパティファイルを作成します。

custom.properties
myproperties.hoge=hoge
myproperties.fuga=fuga

独自のプロパティファイルを読み込むには、以下のような設定クラス(@Configuration)を作成します。

@Configuration
@PropertySource(value = "classpath:custom.properties")
public class AppConfig {
  @Bean
  public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
    return new PropertySourcesPlaceholderConfigurer();
  }
}

application.propertiesの指定は不要です。 複数ファイル読み込む場合は、以下のように@PropertySourcesを使用します。

@Configuration
@PropertySources({
  @PropertySource(value = "classpath:custom1.properties"),
  @PropertySource(value = "classpath:custom2.properties")
})
public class AppConfig {
  @Bean
  public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
    return new PropertySourcesPlaceholderConfigurer();
  }
}

@Value

値の取得

プロパティファイルの値は、@Valueを用いて取得することができます。 @Valueのプロパティには、取得するプロパティ名を${}で囲って指定します。

@Service
public class SampleService {
  @Value("${myproperties.hoge}")
  private String hoge;
}

デフォルト値

プロパティ名:デフォルト値@Valueのプロパティを指定することにより、指定したプロパティが存在しなかった場合のデフォルト値を設定します。

@Value("${myproperties.hoge:default value}")
private String hoge;

配列

以下のようにカンマ区切りのプロパティ値は、文字列配列またはリストとして取得することができます。

application.properties
myproperties.hoge=hoge,fuga,piyo
@Value("${myproperties.hoge}")
private List<String> hoge;  //String[] でも可

Map

以下のようにプロパティ値をキーと値のセットで設定します。

application.properties
myproperties.hoge={hoge: 1, fuga: 2, piyo: 3}

これを以下のようにしてMap<String, String>で取得することができます。

@Value("#{${myproperties.hoge}}")
private Map<String, String> hoge;

一応Mapで取得することは可能ですが、プロパティ名で分ける方が無難です。

SpEL

@Valueのプロパティには、SpEL を使用することができます。 SpEL は、Spring Expression Language の略で、#{}の中に式を埋め込むことができます。

例えば、プロパティ値をすべて大文字に変換するには以下のようにします。

@Value("#{'${myproperties.hoge}'.toUpperCase()}")
private String hoge;

SpEL の使用頻度はあまり高くないと思います。

@ConfigurationProperties

@ConfigurationPropertiesによって、プロパティをクラスオブジェクトに落とし込むことができます。 例えば以下のようにプロパティファイルを設定したとします。

application.properties
myproperties.hoge=hoge
myproperties.fuga=1,2,3
myproperties.piyo.a=1
myproperties.piyo.b=2
myproperties.piyo.c=3

このプロパティに対応するクラスを以下のように作成します。

@Component
@ConfigurationProperties(prefix = "myproperties")
public class MyProperties {
  private String hoge;
  private List<String> fuga;
  private Map<String, String> piyo;
  //セッター・ゲッターは省略
}

@ConfigurationPropertiesprefixプロパティに、読み込むプロパティを指定します。 その子プロパティの名前と同じフィールドを定義することで、値が設定されます。

基本はStringで読み込みますが、カンマ区切りのプロパティは文字列配列、子孫プロパティがある場合はMap<String, String>で読み込むことができます。