設定ファイルの値を個別にコード内の変数にマッピングする
設定ファイルの値をコード内で変数として利用する場合には、リスト7のように@Valueアノテーションを利用します。
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Value("${app.web.prefix}") // (1)基本の利用方法
private String webPrefix;
@Value("${app.web.resource:classpath:/static/}") // (2)デフォルト値を指定した設定方法
private String webResource;
// (省略)
}
(1)が最も基本的なプロパティ設定値を利用する方法です。ただし、この場合に設定ファイルに指定のキーがない場合には、エラーになってしまいます。
その場合には、(2)のようにコロン(:)を使ってデフォルト値を設定すれば指定がない場合にも対応が可能です。
また、@Valueはフィールド以外にもメソッドにも利用できるので、設定を加工して利用したい場合などはsetterメソッドを用意して利用すればよいでしょう。
設定グループとして値を管理する
JDBCの設定のように設定項目が多くなると設定を1つの塊として管理したくなります。その場合には、@ConfigurationPropertiesを利用します。
@Valueを多く利用するとどこでどのような設定を使っているのかの管理がすぐに難しくなってしまうため、利用する場合にも限定した利用が望ましいと思います。
実際、Spring Bootのソースを見てもほとんど@Valueは使われていません。
例えば、server.portの設定を管理しているコードであるSpring Boot内のServerPropertiesクラスのソースを見てみます。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
// : 省略
public void setPort(Integer port) {
this.port = port;
}
// : 省略
}
また、同様にspring.datasourceの管理をしているクラスであるDataSourcePropertiesクラスのソースを見て見ます。
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
// : 省略
public void setDriverClassName(String driverClassName) { // (1)spring.datasource.driver-class-nameの設定
this.driverClassName = driverClassName;
}
// : 省略
public void setUrl(String url) { // (2)spring.datasource.urlの設定
this.url = url;
}
// : 省略
}
どちらにも、@ConfigurationPropertiesという指定があり、また、prefixで設定グループ名が指定されています。例えば(1)は、spring.datasource.driver-class-nameの指定であり、大文字を“-(ハイフン)”に置き換えて読み替えることができます。
また、(2)ではspring.datasource.urlの設定であり、どちらもprefixで指定したグループ以下の名称はsetterメソッドを使って設定が行われます。
こういったルールで設定できる項目がわかるので、他の設定項目もどこのソースで設定が行われているかを調べると、その設定の意味などを把握する上で参考となります。
設定項目もアノテーションと同様に網羅的な説明があるわけではありませんが、よく使われる設定などは多くの方が疑問に思うため、ブログなどにアップされている情報も多いでしょう。基本的にはそれらが参考になります。
ただし、使っているSpring Bootのバージョンによって多少変わってしまったり、設定が増えていたりといったこともまれにあるため、筆者も疑問に思ったり、具体的に他の設定はないのかを調べる際には、上記のようにソースコードを調べてしまいます。
最後に
Spring Bootを使っていると、自分が実装したいソースコードの内容以外に、どういったアノテーションを使えばよいのか、または、どういった設定をすれば希望する内容が有効(無効)になるのかをよく調べることになります。
しかし、これらすべてを理解するとなると非常に大変で、また、Spring Bootの簡単に始められるといった利点をも失ってしまいます。従って、アノテーションや設定を使いこなすことを気にせずプログラムを始めるのが、Spring Bootでは大切なことだと筆者は思っています。
ただし、問題にぶつかった時にSpring Bootの仕組みがわからないと、どこで何がおきているのかがわからないため、今回紹介した最低限の仕組みについての理解は必要だと思います。
次回は、サンプルコードのWeb APIを作成する際に必要なアノテーションやデータベース関連のアノテーションなど機能部分について紹介します。
参考資料

