【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.Driverapplication.propertiesは、application.ymlと YAML に変更することができます。
この場合、ファイルは以下のように設定します。
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: hoge
password: fugafuga
driver-class-name: com.mysql.cj.jdbc.DriverSpring Boot の設定プロパティは以下を参照してください。
参考: https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
カスタムプロパティ
application.propertiesには、ファイルの記述ルールに則れば、独自のプロパティを設定することができます。
myproperties.hoge=hoge
myproperties.fuga=fugamyproperties:
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>で読み込むことができます。