Spring Bootでプロパティファイルとのバインディング方法

Spring Bootにおいて、プロパティファイルとのバインディング方法をまとめました。

##単一項目のバンティング

以下のプロパティをJavaフィールドとバインディングする。

```application.properties
foo.intervel=1000
bar.intervel=500
```
まずは、プレイフィックス（foo, bar）毎に`@ConfigurationProperties`でプレイフィックス指定でコンテキストクラスを作成する。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private int intervel;
	
	public int getIntervel() {
		return intervel;
	}

	public void setIntervel(int intervel) {
		this.intervel = intervel;
	}
}
```

```java
@ConfigurationProperties(prefix="bar")
public class BarContext {
	
	private int intervel = 10; // ここでデフォルト値を指定可能
	
	public int getIntervel() {
		return intervel;
	}

	public void setIntervel(int intervel) {
		this.intervel = intervel;
	}
}
```
後は、コンテキストクラスをDIに登録すればOK。

```java
@Configuration
public class PropertiesConfiguration {
	
	@Bean
	public FooContext fooConfig() {
		return new FooContext();
	}

	@Bean
	public BarContext barConfig() {
		return new BarContext();
	}
}
```

以下の感じてプロパティ値を取得する。

```java
	@Autowired
	private FooContext fooContext;

	@Autowired
	private BarContext barContext;
	
	public void test {
		int fooIntervel = fooContext.getIntervel();
		int barIntervel = barContext.getIntervel();
	}
```

キャメルケースの場合、ハイフンで単語を連結するか、キャメルのままでもOK。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private int itemName;
	
	// getter & setter
}
```
```application.properties
foo.item-name=apple
```

```application.properties
foo.itemName=apple
```

##Collection型とのバインディング
リストや配列の場合、以下の感じてプロパティとバインディングする。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private List<String> items;    //or private String[] items;

	// getter & setter
}
```

```application.properties
foo.items[0]=apple
foo.items[1]=banana
```

カンマ区切りの書き方もOKです。

```application.properties
foo.items=apple,banana,...
```

##Map型とのバインディング

Map型の場合、以下の感じてプロパティとバインディングする。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private Map<String, String> itemMap;
	
	// getter & setter
}
```
```application.properties
foo.item-map.key1=apple
foo.item-map.key2=banana
```


##ネストオブジェクトのバインディング

ネストオブジェクトの場合、以下の感じてプロパティとバインディングする。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private Product product;	
	
	// getter & setter
}
```

```java
public class Product {
	
	private String productId;
	private String productName;
	
	// getter & setter
```

```application.properties
foo.product.product-id=001
foo.product.product-name=apple
```

リスト＋ネストの場合も同様です。

```java
@ConfigurationProperties(prefix="foo")
public class FooContext {
	
	private List<Product> products;	
	
	// getter & setter
}
```

```application.properties
foo.products[0].product-id=001
foo.products[0].product-name=apple
foo.products[1].product-id=002
foo.products[1].product-name=banana
```

##classpath内複数プロパティファイルとのバインディング

クラスパス内複数のプロパティファイルを指定する場合、`@PropertySources`を利用する。

```java
@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:another.properties")
})
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
```

##外部プロパティのバインディング
外部プロパティファイルを利用する場合、起動のコマンドラインにファイルパスを指定する。

```
java -jar demo.jar --spring.config.location="file:/tmp/properties/application.properties"
```