Spring Boot 1.5の主な変更点

今回は、Spring Boot 1.5.RC1の主な変更点を、[リリースノート](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.5-Release-Notes#spring-boot-15-rc1-release-notes)ベースで紹介したいと思います。（1.5の正式リリースは今のところ2017/1/25に設定されており、まだまだ変更が入ると思いますが。。。:smirk:）

> **Note:**
>
> 2017/01/15 「[OAuth 2 Resource Filter](http://qiita.com/kazuki43zoo/items/c26d99bb57888e42eaf1#oauth-2-resource-filter)」を追加。（RC1リリース後にリリースノートが修正されたため）

# Upgrading from Spring Boot 1.4

Spring Boot 1.4からSpring 1.5に移行する際に、影響がでる可能性がある主な変更点は以下の通りです。

## Deprecations from Spring Boot 1.4

「[Spring Boot 1.4で非推奨にしたAPIやプロパティキー](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes#deprecations-in-spring-boot-14)」は、1.5で削除されます。
ちなみに・・・HornetQとVelocityは完全にサポート外になるので、Spring Boot 1.5にアップデートする計画がある場合は、今のうちに対策を検討しておいた方がよいと思います。

## Renamed starters

「[Spring Boot 1.4で名前が変更になり非推奨扱いになっていたstarterアーティファクト](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes#deprecations-in-spring-boot-14)」は、1.5で削除されます。もしこれらのアーティファクトをまだ使っている場合は・・・

* `spring-boot-starter-ws` は `spring-boot-starter-web-services`
* `spring-boot-starter-redis` は `spring-boot-starter-data-redis`

を使うようにする必要があります。

## Spring Session store

Spring Boot 1.4までは、Spring SessionのセッションストアにRedisを使う場合は特別なコンフィギュレーションをしなくても自動でRedisの設定が適用されていましたが、1.5からは明示的にセッションのストアタイプ(`store-type`)を指定しないとエラーになるようになっています。（正確にいうと・・・Spring Boot 1.4の時はWARNログが出力されていました）

なので・・・`store-type`を明示的に指定していない場合は・・・

```properties:src/main/resources/application.properties
spring.session.store-type=redis
```

を追加する必要があります。

> **Note:**
>
> Spring Sessionを使ったことがないという方は・・・・「[Spring Boot+Spring SessionでスケーラブルなステートフルWebアプリが簡単につくれるよ〜](http://qiita.com/kazuki43zoo/items/8123906809632503cc21)」を試してみてください :grin:


## Actuator security

Spring Boot 1.4までは、Actuatorのsensitiveなエンドポイント(デフォルトだと`/health` と `/info` 以外)へ認可制御を行う場合はSpring Securityが必要でしたが、1.5からはSpring Boot単体で認可制御できるようになり、デフォルトで認可制御が有効になっています。
こちらについては・・・ @making@github のブログ「[Cloud Foundry :hearts: Spring Boot](https://blog.ik.am/entries/401)」をみてください！！

> **Note:**
>
> 認可制御が有効になっている状態でActuatorのsensitiveなエンドポイントにアクセスする場合は、Spring Boot 1.4まではデフォルトだと`ADMIN`ロールを持つユーザでアクセスする必要がありましたが、1.5からは`ACTUATOR`ロールを持つユーザでアクセスする必要があります。
> なお、Actuatorのsensitiveなエンドポイントにアクセスできるロールはプロパティファイルで変更することができるので、1.4と同じ動作にしたい場合は、以下のようなプロパティを追加してください。
>
> ```properties:src/main/resources/application.properties
> management.security.roles=ADMIN
> ```

## `InMemoryMetricRepository`

Spring Boot 1.4までは`InMemoryMetricRepository`クラスで`MultiMetricRepository`インタフェースを実装してたけど、1.5からは`MultiMetricRepository`インタフェースを実装した`InMemoryMultiMetricRepository`クラスが新設し、`InMemoryMetricRepository`は`InMemoryMultiMetricRepository`の中から使うようにしたよ〜ということみたいですね。
で・・・`MetricRepository`と`MultiMetricRepository`というインタフェースを介して利用してるはずだから、この変更は利用者が意識する必要ないはずだよね・・・ということっぽい。

## `spring.jpa.database`

Spring Boot 1.4までは、JPAの実装プロバイダ(Hibernate ORMなど)内で扱うデータベースの種類を指定するプロパティ(`spring.jpa.database`)を指定する必要がありましたが、1.5から省略することができるようになります。省略した場合は、`spring.datasource.url`に指定したURLからデータベースの種類を決定する仕組みになっています。

```properties:src/main/resources/application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/spring
#spring.jpa.database=postgresql # ← Spring Boot 1.5からURLから自動検出されるため省略できる！！
```


## `@IntegrationComponentScan`

Spring Boot 1.5から、Spring Integration提供の`@IntegrationComponentScan`を付与したクラスが自動コンフィギュレーションされる仕組みになったため、「[Spring Bootが推奨するプロジェクト構成](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#using-boot-structuring-your-code)」になっていれば、`@IntegrationComponentScan`の指定を省略することができるようになります。


## `ApplicationStartedEvent`

Spring Boot 1.5から、Spring Bootアプリケーションの起動開始を通知するイベントクラスの名前が`ApplicationStartedEvent`から`ApplicationStartingEvent`に変更されます。`ApplicationStartedEvent`は非推奨APIになるので、`ApplicationStartingEvent`を使うようにリファクタリングしましょう。

## Spring Integration Starter

Spring Boot 1.5から、`spring-boot-starter-integration`に`spring-integration-jmx`が含まれなくなります。`spring-integration-jmx`を使っている場合は、個別に依存アーティファクトに追加する必要があります。

## Devtools excluded by default

Spring Boot 1.5から、`spring-boot-devtools`はjarやwarファイルの中にパッケージされなくなります。
`spring-boot-devtools`から提供されているリモート機能を使いたい場合は、Maven又はGradleのSpring Boot pluginの`excludeDevtools`オプションに`false`を指定すると、`spring-boot-devtools`がjarやwarファイルの中にパッケージできます。

```xml:spring-boot-devtoolsをjarやwarに中に含める際のpom.xmlの定義例
<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<excludeDevtools>false</excludeDevtools>
	</configuration>
</plugin>
```

## Gradle 1.x

Spring Boot 1.5から、GradleのSpring Boot pluginはGradle 1.xで動かないため、Gradle 2.9+のGradleを使うようにする必要があります。

## Remote CRaSH shell

Spring Boot 1.5から、「[Spring BootアプリケーションにSSHでアクセスして内部の状態を確認できる機能](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#production-ready-remote-shell)」が非推奨扱いになり、Spring Boot 2.0で廃止されるようです。

## OAuth 2 Resource Filter

Spring Boot 1.4では、Actuator(の自動コンフィギュレーション)機能とSpring Security OAuth2提供のリソースサーバ用のコンフィギュレーション機能(`@EnableResourceServer`)を併用すると、Actuator機能のエンドポイント毎の認可定義に関係なく、OAuth 2の認証(アクセストークンの認証)が要求される動きになっていました([gh-5072](https://github.com/spring-projects/spring-boot/issues/5072))。

つまり・・・デフォルトの動きだとsensitiveでないActuatorのエンドポイント(デフォルトだと`/health` と `/info`)に認証なしでアクセスできなかった・・・・

```
$ curl -s -D - http://localhost:8080/health
HTTP/1.1 401
WWW-Authenticate: Bearer realm="null", error="unauthorized", error_description="Full authentication is required to access this resource"
...

{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
```

この動きがSpring Boot 1.5から改善され、

* sensitiveなエンドポイント(デフォルトだと`/health` と `/info` 以外)はBasic認証

    ```
    $ curl -s -D - http://localhost:8080/env
    HTTP/1.1 401 
    WWW-Authenticate: Basic realm="Spring"
    ....

    {"timestamp":1484460898978,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource","path":"/env"}
    ```

* sensitiveでないエンドポイント(デフォルトだと`/health` と `/info`)は認証なし

    ```
    $ curl -s -D - http://localhost:8080/health
    HTTP/1.1 200 
    ...

    {"status":"UP"}
    ```

* ユーザ定義のリソースのエンドポイント（デフォルトだと上記以外）はOAuth2認証(アクセストークン認証)

    ```
    $ curl -s -D - http://localhost:8080/hello
    HTTP/1.1 401 
    WWW-Authenticate: Bearer realm="null", error="unauthorized", error_description="Full authentication is required to access this resource"
    ....

    {"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
    ```

でアクセスできるようになります。

これは・・・Spring Securityの認証・認可の設定を適用する順序が関係しており、Spring 1.4では「Spring Security OAuth2 → Spring Boot Actuator」の順だったのが・・・Spring Boot 1.5から「Spring Boot Actuator → Spring Security OAuth2」の順で適用されるように改善されています。
なお、Spring Boot 1.4と同じ動きにしたい場合は、Spring Security OAuth2側のコンフィギュレーションの適用順をプロパティファイルで変更することで実現することができます。

```properties:src/main/resources/application.properties
security.oauth2.resource.filter-order=3
```


# New and Noteworthy

Spring Boot 1.5からの新機能や改善系の主な変更点は以下の通りです。

> **Note:**
>
> Spring Boot 1.5でのプロパティキーの追加・廃止・非推奨の状況については、「[Spring Boot 1.5 Configuration Changelog](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.5-Configuration-Changelog)」を参照してください。

## Third-party library upgrades

3rdパーティ製のライブラリやMavenプラグインなどのバージョンが更新されています。

具体的には・・・

* Spring Data Ingalls
* Jetty 9.4
* JooQ 3.9
* AssertJ 2.6.0
* Hikari 2.5
* Neo4J 2.1
* etc ..

です。

## Loggers endpoint

Spring Actuatorに「[ロガーの確認とログレベルを変更するためのエンドポイント(`/loggers`)](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#production-ready-loggers)」が追加されました。

具体的には・・・

* ロガーの一覧確認用の「`GET /loggers`」
* 特定のロガーの確認用の「`GET /loggers/{ロガー名}`」
* 特定のロガーのログレベル変更用の「`POST /loggers/{ロガー名}`」

が用意されています。

では、実際に`com.example`のログレベルの確認と変更をしてみましょう。本来は認可制御すべきですが、ここでは動作確認用に認可制御を無効化(`management.security.enabled=false`）した状態でアクセスします。 

```text:ログレベルの確認
$ curl -s http://localhost:8080/loggers/com.example
{"configuredLevel":null,"effectiveLevel":"INFO"}
```

```text:ログレベルの更新(未指定(INFO)->DEBUGへ)
$ curl -s http://localhost:8080/loggers/com.example -X POST -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'
```

```text:変更後のログレベルの確認
$ curl -s http://localhost:8080/loggers/com.example
{"configuredLevel":"DEBUG","effectiveLevel":"DEBUG"}
```

> **Note:**
>
> ~~ちなみに・・・更新時に指定するログレベルは大文字じゃないと`IllegalArgumentException`が発生します :disappointed_relieved: これはバグっっぽいので[Pull Request(spring-boot#gh-7914)](https://github.com/spring-projects/spring-boot/pull/7914)してみました。~~
>
> 2017/1/22 追記
> Pull Requestがマージされたので↑の問題は1.5.0.RELEASEで解消されます。

こちらも・・・ @making@github のブログ「[Cloud Foundry :hearts: Spring Boot](https://blog.ik.am/entries/401)」の中で、PCF(Pivotal Cloud Foundry)との連携という切り口で紹介されています！！


## Apache Kafka support

Spring Boot 1.5から、[Spring for Apache Kafka](https://projects.spring.io/spring-kafka/)向けの[自動コンフィギュレーション](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#boot-features-kafka
)がサポートされました。

> **Note:**
>
> Apache Kafkaは・・・2011年にLinkedInから公開されたオープンソースの分散メッセージングシステムで、ウェブサービスなどから発せられる大容量のデータ（例：ログやイベント）を高スループット/低レイテンシに収集/配信することを目的に開発されているようです。なお、ここではApache KafkaやSpring Kafkaの説明や使い方の説明は割愛します。

依存アーティファクトに`spring-kafka`を追加し、

```xml:pom.xml
<dependency>
	<groupId>org.springframework.kafka</groupId>
	<artifactId>spring-kafka</artifactId>
</dependency>
```

必要に応じて、spring-kafka用のプロパティ(`spring.kafka.*`)を行えば、Apache Kafkaを介したメッセージ連携が行えるようになります。もちろん・・・Kafka Cluster(Broker)の起動が別途必要ですが・・・:sweat_smile:

```properties:src/main/resources/application.properties
# APACHE KAFKA (KafkaProperties)
spring.kafka.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
spring.kafka.client-id= # Id to pass to the server when making requests; used for server-side logging.
spring.kafka.consumer.auto-commit-interval= # Frequency in milliseconds that the consumer offsets are auto-committed to Kafka if 'enable.auto.commit' true.
spring.kafka.consumer.auto-offset-reset= # What to do when there is no initial offset in Kafka or if the current offset does not exist any more on the server.
spring.kafka.consumer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
spring.kafka.consumer.client-id= # Id to pass to the server when making requests; used for server-side logging.
spring.kafka.consumer.enable-auto-commit= # If true the consumer's offset will be periodically committed in the background.
spring.kafka.consumer.fetch-max-wait= # Maximum amount of time in milliseconds the server will block before answering the fetch request if there isn't sufficient data to immediately satisfy the requirement given by "fetch.min.bytes".
spring.kafka.consumer.fetch-min-size= # Minimum amount of data the server should return for a fetch request in bytes.
spring.kafka.consumer.group-id= # Unique string that identifies the consumer group this consumer belongs to.
spring.kafka.consumer.heartbeat-interval= # Expected time in milliseconds between heartbeats to the consumer coordinator.
spring.kafka.consumer.key-deserializer= # Deserializer class for keys.
spring.kafka.consumer.max-poll-records= # Maximum number of records returned in a single call to poll().
spring.kafka.consumer.value-deserializer= # Deserializer class for values.
spring.kafka.listener.ack-count= # Number of records between offset commits when ackMode is "COUNT" or "COUNT_TIME".
spring.kafka.listener.ack-mode= # Listener AckMode; see the spring-kafka documentation.
spring.kafka.listener.ack-time= # Time in milliseconds between offset commits when ackMode is "TIME" or "COUNT_TIME".
spring.kafka.listener.concurrency= # Number of threads to run in the listener containers.
spring.kafka.listener.poll-timeout= # Timeout in milliseconds to use when polling the consumer.
spring.kafka.producer.acks= # Number of acknowledgments the producer requires the leader to have received before considering a request complete.
spring.kafka.producer.batch-size= # Number of records to batch before sending.
spring.kafka.producer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
spring.kafka.producer.buffer-memory= # Total bytes of memory the producer can use to buffer records waiting to be sent to the server.
spring.kafka.producer.client-id= # Id to pass to the server when making requests; used for server-side logging.
spring.kafka.producer.compression-type= # Compression type for all data generated by the producer.
spring.kafka.producer.key-serializer= # Serializer class for keys.
spring.kafka.producer.retries= # When greater than zero, enables retrying of failed sends.
spring.kafka.producer.value-serializer= # Serializer class for values.
spring.kafka.properties.*= # Additional properties used to configure the client.
spring.kafka.ssl.key-password= # Password of the private key in the key store file.
spring.kafka.ssl.keystore-location= # Location of the key store file.
spring.kafka.ssl.keystore-password= # Store password for the key store file.
spring.kafka.ssl.truststore-location= # Location of the trust store file.
spring.kafka.ssl.truststore-password= # Store password for the trust store file.
spring.kafka.template.default-topic= # Default topic to which messages will be sent.
```

## Cloud Foundry actuator extensions

Spring Boot 1.5から、Spring BootのActuator機能とCloud Foundryの運用系機能(管理コンソールとか)との連携機能が強化されています。 こちらについては、@making@github のブログ「[Cloud Foundry :hearts: Spring Boot](https://blog.ik.am/entries/401)」のみるのが一番わかりやすいと思います。

少しだけ補足すると・・・Spring BootアプリをCloud Foundryのインスタンス上にデプロイすると・・・「[`/cloudfoundryapplication`という特殊なエンドポイント（外部からアクセスできないエンドポイント）](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#production-ready-cloudfoundry)」が公開され、Cloud Foundryの運用系機能がそのエンドポイントを介してSpring Bootアプリの状態確認・変更が行える仕組みになっています。そのため、Actuator用のエンドポイントに対して認可制御がかかっている状態でも、Cloud Foundryの運用系機能からはアクセスできるというわけです。 

> **Note:**
>
> ちなみに・・・現時点でSpring BootのActuator機能と連携したUI提供を行っているのはPivotal Cloud Foundryだけのようですが、Spring Boot側の実装がPivotal Cloud Foundryを意識しているわけではないので、Pivotal Cloud Foundry以外のCloud Foundry上でも同じようなことを実現することは論理的には可能です。

## LDAP support

Spring Boot 1.5から、「[LDAP連携用のStarter(`spring-boot-starter-data-ldap`)と`spring-data-ldap`向けの自動コンフィギュレーションの仕組み](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#boot-features-ldap)」がサポートされました。また、組み込みのインメモリLDAPとして「[UnboundedID](https://www.ldap.com/unboundid-ldap-sdk-for-java)」の自動コンフィギュレーションもサポートされています。

依存アーティファクトに`spring-boot-starter-data-ldap`と`com.unboundid:unboundid-ldapsdk`を追加し、

```xml:pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>

<dependency> <!-- 組み込みLDAPを使う場合のみ -->
	<groupId>com.unboundid</groupId>
	<artifactId>unboundid-ldapsdk</artifactId>
</dependency>
```

必要に応じて、`spring-data-ldap`用のプロパティ(`spring.ldap.*`)を行えば、LDAPを介したデータ連携が行えるようになります。

```properties:src/main/resources/application.properties
# SPRING LDAP (LdapProperties)
spring.ldap.urls= # LDAP url of the server.
spring.ldap.base= # Base suffix from which all operations should originate.
spring.ldap.username= # Login user of the server.
spring.ldap.password= # Login password of the server.
spring.ldap.base-environment.*= # Ldap specification settings.

# EMBEDDED LDAP (EmbeddedLdapProperties)
spring.ldap.embedded.port= # Embedded LDAP port.
spring.ldap.embedded.credential.username= # Embedded LDAP username.
spring.ldap.embedded.credential.password= # Embedded LDAP password.
spring.ldap.embedded.base-dn= # The base DN
spring.ldap.embedded.ldif= # Schema (LDIF) script resource reference.
```

> **Note:**
>
> ちなみに・・・組み込みLDAPを使う場合は、`spring.ldap.embedded.base-dn`に値を指定しないと自動コンフィギュレーションされません。


## AuditEvents Endpoint Support

Spring Boot 1.5から、認証・認可の成功・失敗イベントがSpring MVCのエンドポイント(`/auditevents`)とJMXのMBeanを介して参照できるようになります。
以下は、Spring MVCのエンドポイントを介して取得できるJSON例です。

```json
{
  "events": [
    {
      "timestamp": "2017-01-09T04:57:41+0000",
      "principal": "anonymousUser",
      "type": "AUTHORIZATION_FAILURE",
      "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": null
      },
      "type": "org.springframework.security.access.AccessDeniedException",
      "message": "Access is denied"
    },
    {
      "timestamp": "2017-01-09T04:57:46+0000",
      "principal": "a",
      "type": "AUTHENTICATION_FAILURE",
      "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": null
      },
      "type": "org.springframework.security.authentication.BadCredentialsException",
      "message": "Bad credentials"
    },
    {
      "timestamp": "2017-01-09T04:57:54+0000",
      "principal": "user",
      "type": "AUTHENTICATION_SUCCESS",
      "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": null
      }
    }
  ]
}
```

> **Note:**
>
> Spring Boot 1.4でも認証・認可の成功・失敗イベント自体は記録されていたみたいですが、情報を公開するためのエンドポイントが提供されていなかったみたいです。~~でも、なぜMVCのエンドポイントの紹介はないのだろ・・・と思ったので、[RC1のリリースアナウンスのBLOGにコメント](https://spring.io/blog/2017/01/06/spring-boot-1-5-0-rc1-available-now)してみました。~~
>
> 2017/01/11 追記
> MVCのエンドポイントもリリースノートで紹介されるようになりました！！（なので・・・内容も一部変更しました）

## Transaction manager properties

Spring Boot 1.5から、自動コンフィギュレーションされた`PlatformTransactionManager`に対して、以下のプロパティを使用してカスタマイズすることができます。

* デフォルトのトランザクションタイムアウト時間(秒)
* コミット時にエラーが発生した際にロールバック処理を行うか否かのフラグ(デフォルト値はfalse=ロールバックメソッドは呼び出さない)

```properties:src/main/resources/application.properties
# TRANSACTION (TransactionProperties)
spring.transaction.default-timeout= # Default transaction timeout in seconds.
spring.transaction.rollback-on-commit-failure= # Perform the rollback on commit
```

> **Note:**
>
> この対応と同時に・・・`PlatformTransactionManager`をカスタマイズする仕組みが導入されているので、興味がある方は「[Spring Boot 1.5からPlatformTransactionManager用のCustomizerが追加される](http://qiita.com/kazuki43zoo/items/631164864a966b5e16c5)」をご覧ください。

## `JmxEndpoint` interface

Spring Boot 1.5から、ActuatorのJMX用エンドポイントを公開するための`org.springframework.boot.actuate.endpoint.jmx.JmxEndpoint`インタフェースが追加され、開発者はこのインタフェースを実装してDIコンテナに登録するだけでJMXサーバ上にMBeanを登録することができます。
これは、Spring MVC向けのエンドポイントを公開する時に使う`org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint`と同等の役割をもつインタフェースです。

極端な話・・・以下のようなBean定義を行うだけで、JMX上にMBeanを登録することもできます。

```java
@Bean
JmxEndpoint fooJmxEndpoint(){
	return new JmxEndpoint() {
		@Override
		public boolean isEnabled() {
			return true;
		}

		@Override
		public String getIdentity() {
			return null;
		}

		@Override
		public Class<? extends Endpoint> getEndpointType() {
			return null;
		}
	};
}
```

Spring MVCのエンドポイントも・・・以下のようなBean定義を行うだけでWeb上に公開することができ、以下の例だと`GET /foo`にアクセスすると`foo`という文字列がレスポンスされます。

```java
@Bean
MvcEndpoint fooMvcEndpoint() {
	return new MvcEndpoint() {
		@Override
		public String getPath() {
			return "/foo";
		}

		@Override
		public boolean isSensitive() {
			return false;
		}

		@Override
		public Class<? extends Endpoint> getEndpointType() {
			return null;
		}

		@GetMapping
		@ResponseBody
		public String get(){
			return "foo";
		}
	};
}
```

## Vendor specific flyway migrations

Spring Boot 1.5から、[Flywayを使ったデータベースのマイグレーション用スクリプト](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup)を、データベースのベンダー毎に用意できるようになります。
この仕組みを使う場合は、スクリプトファイルを読み込むロケーションの中に`{vendor}`というプレースホルダーを指定してください。

```properties:src/main/resources/application.properties
flyway.locations=db/migration/{vendor}
```

```
.
└── src
    └── main
        └── resources
            ├── application.properties
            └── db
                └── migration
                    ├── h2
                    │   └── V1_0_0_00__schema.sql
                    └── oracle
                        └── V1_0_0_00__schema.sql
```

この仕組みは、使用するデータベースを選択できるようなアプリケーションを作る場合に便利ですね。


## Testing updates

Spring Boot 1.5から、テスト用の自動コンフィギュレーションを有効にするためのアノテーション(`@JsonTest`, `@WebMvcTest`, `@DataJpaTest`, `@JdbcTest`, `@RestClientTest`)にて、指定した自動コンフィギュレーション用のクラスを除外するための属性(`excludeAutoConfiguration`)が追加されました。

```java
@RunWith(SpringRunner.class)
@SpringBootTest
@WebMvcTest(excludeAutoConfiguration = HttpMessageConvertersAutoConfiguration.class) // Spring 1.5+
//@ImportAutoConfiguration(exclude = HttpMessageConvertersAutoConfiguration.class) // Spring 1.4以前
public class FooTests {
    // ...
}
```

なお、[`@JdbcTest`](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jdbc-test)はSpring Boot 1.5から追加されたアノテーションです。

## Custom fat jar layouts

Spring Boot 1.5から、Spring Boot MavenとGradleプラグインを使って[独自のjarレイアウトを導入](http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-gradle-configuration-custom-repackager)できるようになったみたいです。このこの仕組みの導入により、[`spring-boot-thin-launcher`](https://github.com/dsyer/spring-boot-thin-launcher)のような（実験的な）jarレイアウトを開発することができるようになるとのことです。


## `JmsTemplate` customizations

Spring Boot 1.5から、自動コンフィギュレーションされた`JmsTemplate`に対して、以下のプロパティを使用してカスタマイズすることができます。

```properties:src/main/resources/application.properties
# JMS (JmsProperties)
# ...
spring.jms.template.default-destination= # Default destination to use on send/receive operations that do not have a destination parameter.
spring.jms.template.delivery-delay= # Delivery delay to use for send calls in milliseconds.
spring.jms.template.delivery-mode= # Delivery mode. Enable QoS when set.
spring.jms.template.priority= # Priority of a message when sending. Enable QoS when set.
spring.jms.template.qos-enabled= # Enable explicit QoS when sending a message.
spring.jms.template.receive-timeout= # Timeout to use for receive calls in milliseconds.
spring.jms.template.time-to-live= # Time-to-live of a message when sending in milliseconds. Enable QoS when set.
```

## Miscellaneous

その他、雑多な変更点は以下の通りです。

* Mockito 2.xで`@MockBean`が使えるようになる。

* Fully Executable Jar/Warの組み込みスクリプトにて、強制停止(`force-stop`)オプションがサポートされる。

* Cassandraのヘルスチェックがサポートされる。

* Cassandraのユーザ定義の型がSpring Dataの`SimpleUserTypeResolver`を介して解決できるようになる。

* Spring Boot Maven Pluginの`skip`プロパティが、`run`、`stop`、`repackage`で動作するようになる。

* 複数のメインメソッドクラスが見つかった場合、MavenとGradleのSpring BootPluginは自動的に`@SpringBootApplication`アノテーションが付与されているクラスを使用するようになる。


# Deprecations in Spring Boot 1.5

いくつか非推奨となるAPIやプロパティがあるので、必要に応じて修正しよう！

* `TomcatEmbeddedServletContainerFactory`の`setTldSkip`メソッドが非推奨になるため、代わりに`setTldSkipPatterns`を使うようにする。

* `ApplicationStartedEvent`は非推奨になるため、 代わりに`ApplicationStartingEvent`を使うようにする。

* `LoggingApplicationListener`に定義していた定数(`PATH_PROPERTY`と`FILE_PROPERTY`)が非推奨になるため、代わりに`LogFile`の定数を使うようにする。

* Cacheの実装としてGuavaが非推奨になるため、代わりに`Caffeine`への移行を検討する必要がある。なお、GuavaはSpring Frameowrk 5でサポート機能が完全に削除されます。

* CRaSHを使用してSpring BootアプリケーションにSSHでアクセスする機能が非推奨になるため、運用ツールなどでこの機能を使っている場合は別の仕組みへの移行を検討する必要がある。

* `JmxEndpoint`の導入に伴い、`EndpointMBeanExporter`のいくつかのprotectedメソッドが非推奨になるため、`JmxEndpoint`又は`adaptEndpoint`メソッドを使ってJMXサーバ上にMBeanを登録するようにする。

* `SearchStrategy#PARENTS`が非推奨になるため、`SearchStrategy#ANCESTORS`を使うようにする。

* Apache Commons DBCPが非推奨になるため、Apache Commons DBCP 2又は他のコネクションプーリングを使うようにする。

* Undertow内部で使われていないため([UNDERTOW-587](https://issues.jboss.org/browse/UNDERTOW-587))、Undertow用のプロパティ(`server.undertow.buffers-per-region`)が非推奨になる。

* `@AutoConfigureTestDatabase`のパッケージが`org.springframework.boot.test.autoconfigure.orm.jpa`から`org.springframework.boot.test.autoconfigure.jdbc`されるため、新しいパッケージに移動になったアノテーションを使うようにする。

# Property Renames

いくつかのプロパティの名前が変更・削除されます。

* `server.max-http-post-size`プロパティは、サーバ固有のプロパティ(例： `server.tomcat.max-http-post-size`)に変更される。これはサーバによって扱う型(`int` vs `long`)が異なるからみたいです。

* Spring Data Neo4Jのバージョンアップに伴い、`spring.data.neo4j.session.scope`プロパティが削除されます。


# まとめ

リリースノートベースなので他にもたくさん変更点があると思いますが・・・メインどころの変更点は抑えられていると思います。なお、英語にあまり自信がないので・・・誤釈があるかもしれません。へんなところあったらコメントお願いしま〜す :sweat_smile:


# 参考サイト

* https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.5-Release-Notes
* https://blog.ik.am/entries/401
* http://docs.spring.io/spring-boot/docs/1.5.x-SNAPSHOT/reference/htmlsingle/