【Spring Boot】プロパティファイル
プロパティファイル
application.properties
Spring Boot ではapplication.properties
ファイルに各設定を行います。
以下はデータベース(MySQL)の接続設定の例です。
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 に変更することができます。
この場合、ファイルは以下のように設定します。
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
には、ファイルの記述ルールに則れば、独自のプロパティを設定することができます。
myproperties.hoge=hoge
myproperties.fuga=fuga
myproperties:
hoge: hoge
fuga: fuga
プロパティファイルの分割
application.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;
配列
以下のようにカンマ区切りのプロパティ値は、文字列配列またはリストとして取得することができます。
myproperties.hoge=hoge,fuga,piyo
@Value("${myproperties.hoge}")
private List<String> hoge; //String[] でも可
Map
以下のようにプロパティ値をキーと値のセットで設定します。
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
によって、プロパティをクラスオブジェクトに落とし込むことができます。
例えば以下のようにプロパティファイルを設定したとします。
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;
//セッター・ゲッターは省略
}
@ConfigurationProperties
のprefix
プロパティに、読み込むプロパティを指定します。
その子プロパティの名前と同じフィールドを定義することで、値が設定されます。
基本はString
で読み込みますが、カンマ区切りのプロパティは文字列配列、子孫プロパティがある場合はMap<String, String>
で読み込むことができます。