[書きかけ] Spring Boot 2.0リリースノート解説

# この記事について
[Spring Boot 2.0 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes)を日本語で簡単にまとめたものです。ところどころ独自の補足も入れています。
内容の正確さには気をつけていますが、正確な内容を知りたい方は上記原文も参照してください。

> 2018-03-08時点で、まだ書きかけです。空白になっている部分は徐々に追記していきますので、気長にお待ち下さい🙇‍♂️

<!---------------------------------------------------------------------------------->
# Java 8ベース & Java 9サポート
- Java 8以上必須
    - JDK 6や7では動きません！！！
- Java 8の機能をフル活用
    - インタフェースのデフォルトメソッド
    - コールバック（ラムダ式の活用）
    - Date and Time APIなどの新しいAPI
- JDK 9のモジュールシステムに対応
    - すべてのJARはAutomatic Moduleとして作られています

Spring 5由来のものが多いです。Spring 5の詳細については、下記を参照してください。
JSUG SpringOne 2017報告会
https://www.slideshare.net/masatoshitada7/jsug-springone-2017

<!---------------------------------------------------------------------------------->
# サードパーティライブラリのアップグレード
- Tomcat 8.5
- Flyway 5
- Hibernate 5.2
- Thymeleaf 3

<!---------------------------------------------------------------------------------->
# リアクティブSpring
- Spring WebFlux & WebFlux.fn
- Reactive Spring Data
    - 現時点でリアクティブがサポートされているのはCassandra, MongoDB, Couchbase, Redis
- Reactive Spring Security
- Embedded Netty Server

<!---------------------------------------------------------------------------------->
# HTTP/2サポート
Tomcat、Undertow、Jettyによってサポートされていますが、サーバーやその他環境によります。
以下、[Spring Bootリファレンス](https://docs.spring.io/spring-boot/docs/2.0.x-SNAPSHOT/reference/htmlsingle/#howto-configure-http2)からの引用です。

> HTTP/2についてはあまり詳しくないので、この部分は自分の環境では未検証です。必ずご自分での検証をお願いします。

## Undertow
Undertow 1.4.0以上は、JDK 8以外に追加のライブラリ等は必要無いようです。

## Jetty
下記の追加ライブラリが必要とのことです。

- `org.eclipse.jetty:jetty-alpn-conscrypt-server`
- `org.eclipse.jetty.http2:http2-server`

## Tomcat
### Tomcat 8.5
Spring Bootのデフォルトはこのバージョンです。
このバージョンでHTTP/2を使うには、ホストOS側に`libtcnative`とその依存ライブラリが必要とのことです。詳細は[Tomcatのドキュメント](https://tomcat.apache.org/tomcat-8.5-doc/apr.html)を確認してください。

### Tomcat 9.0
JDK 9とTomcat 9.0にすれば、追加のライブラリ等は必要無いようです。
Tomcatのバージョンを9.0にするには、Mavenの場合だとpom.xmlに下記のpropertyを追加すればOKです。

```xml:pom.xml
    <properties>
        ...
        <tomcat.version>9.0.5</tomcat.version>
        ...
    </properties>

```

## HTTP/2の有効化（各サーバー共通）
application.proeprtiesに`server.http2.enabled=true`を追加します。

<!---------------------------------------------------------------------------------->
# プロパティのバインディング
Spring Boot 2.0からは、Relaxed Bindingのルールが **少し厳格** になりました。

これは長くなるので別記事にします（未作成）

## プロパティの定義場所が可視化される
プロパティのバインディング時に例外が発生すると、そのプロパティがどこに定義されているのかがエラーメッセージで出力されるようになりました。
例えば、ConfigurationPropertiesクラスでデータ型を間違って定義していた場合、こんなメッセージが表示されます。
「my.property[0].first-nameというプロパティが、application.propertiesの19行目に定義されてますよ」と書かれていますね。

```bash
***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'my.property[0].first-name' to java.lang.Integer:

    Property: my.property[0].first-name
    Value: Jane
    Origin: class path resource [application.properties]:19:27
    Reason: Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value 'Jane'; nested exception is java.lang.NumberFormatException: For input string: "Jane"

Action:

Update your application's configuration
```

また、Actuatorの`/env`エンドポイントでも、各プロパティの定義場所が表示されます。

```json
{
  "name": "applicationConfig: [classpath:/application.properties]",
  "properties": {
    "spring.security.user.name": {
      "value": "user",
      "origin": "class path resource [application.properties]:1:27"
    }
  }
}
```


## プロパティの型変換


<!---------------------------------------------------------------------------------->
# Gradle Plugin




<!---------------------------------------------------------------------------------->
# Kotlin

<!---------------------------------------------------------------------------------->
# Actuatorの改良




<!---------------------------------------------------------------------------------->
# データアクセス関連

## コネクションプールの変更
Spring Boot 1.xではTomcat Poolがデフォルトでしたが、HikariCPに変更されました。

## 初期化

## jOOQ
jOOQのDialectがDataSourceから自動検知されるようになりました。

## JdbcTemplate
JdbcTemplateの各種プロパティを、application.propertiesで設定できるようになりました。具体的には、下記の3つです。

```application.properties
spring.jdbc.template.fetch-size=-1 # Number of rows that should be fetched from the database when more rows are needed.
spring.jdbc.template.max-rows=-1 # Maximum number of rows.
spring.jdbc.template.query-timeout= # Query timeout. Default is to use the JDBC driver's default configuration. If a duration suffix is not specified, seconds will be used.
```

それぞれ、JdbcTemplateクラスのsetFetchSize()、setMaxRows()、setQueryTimeout()メソッドの引数に渡されます。

## Spring Data Web Configuration

<!--
spring.data,rest.max-page-sizeとかと何が違うんだ！！！！！！！！！！！！！！

application.propertiesで、ソートやページングの設定を記述できるようになりました。

```application.properties
spring.data.web.pageable.default-page-size=20 # Default page size.
spring.data.web.pageable.max-page-size=2000 # Maximum page size to be accepted.
spring.data.web.pageable.one-indexed-parameters=false # Whether to expose and assume 1-based page number indexes.
spring.data.web.pageable.page-parameter=page # Page index parameter name.
spring.data.web.pageable.prefix= # General prefix to be prepended to the page number and page size parameters.
spring.data.web.pageable.qualifier-delimiter=_ # Delimiter to be used between the qualifier and the actual page number and size properties.
spring.data.web.pageable.size-parameter=size # Page size parameter name.
spring.data.web.sort.sort-parameter=sort # Sort parameter name.
```

-->

## InfluxDB
InfluxDBがサポートされました。特にStarterのようなものは無く、`org.influxdb:influxdb-java`を依存性に追加するだけでOKのようです。
spring-boot-autoconfigure.jarにAuto Configurationクラスが入ってますね。
<img width="402" alt="スクリーンショット 2018-03-08 13.33.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/58650/17c68fdf-e6e8-faa5-be41-684d562950d6.png">



## Flyway/Liquibase Flexible Configuration
Flywayを使ったことが無いので詳しくはわからないのですが、DB接続時に通常の`spring.datasource.*`プロパティが使われる、ということっぽいです。
自信が無いので原文をご確認ください・・・
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes#flywayliquibase-flexible-configuration

## Hibernate
Hibernateの`ImplicitNamingStrategy`や`PhysicalNamingStrategy`を、Beanとして定義すればAuto Configuration側でそれを設定してくれるようになりました。
こんなイメージです。

```java
@Configuration
public class NamingConfig {
    @Bean
    public ImplicitNamingStrategy myImplicitNamingStrategy() {
         return new MyImplicitNamingStrategy();
    }

    @Bean
    public PhysicalNamingStrategy myPhysicalNamingStrategy() {
         return new MyPhysicalNamingStrategy();
    }
}
```

従来どおり、application.propertiesでの設定も可能です。

```application,properties
spring.jpa.hibernate.naming.implicit-strategy= com.example.MyImplicitNamingStrategy
spring.jpa.hibernate.naming.physical-strategy= com.example.MyPhysicalNamingStrategy
```

また、`HibernatePropertiesCustomizer`インタフェースも追加されました。これも実装クラスを作成してBean定義すれば使ってくれます。


## MongoDB Client Customization 
`MongoClientSettingsBuilderCustomizer `インタフェースが追加されました。

<!---------------------------------------------------------------------------------->
# Web

## コンテキストパスがログに出力される
下記のようなログが出力されます。ちなみに、コンテキストパスは`server.servlet.context-path`で設定できます。

```bash
Tomcat started on port(s): 8080 (http) with context path '/foo'
```

## フィルターの初期化


## Thymeleaf
`spring-boot-starter-thymeleaf`に、`thymeleaf-extras-java8time`が追加されました。これで、何も気にすること無くDate and Time APIが使えますね！

## JSON
`spring-boot-starter-json`（`spring-boot-starter-web`に含まれています）は、デフォルトでJacksonを使っています。また、Date and Time APIをサポートするライブラリなどもデフォルトで入るようになりました。

- `jackson-datatype-jdk8`
- `jackson-datatype-jsr310`
- `jackson-module-parameter-names`

<!---------------------------------------------------------------------------------->
# Quartz
Quartz SchedulerのAuto Configurationが追加されました。`spring-boot-starter-quartz`というStarterも用意されています。
（Quartzは触ったことないので、誰か解説ブログをお願いします・・・！！！）

<!---------------------------------------------------------------------------------->
# Testing

- `@WebFluxTest`が追加されました。
- `Converter`と`GenericConverter`が、`@WebMvcTest`や`@WebFluxTest`でスキャン対象になりました
- `@AutoConfigureWebTestClient`が追加され、`WebTestClient`のBeanがテストで使えるようになりました。
    - このアノテーションは、`@WebFluxTest`を付加すると自動的に適用されます（ソースを読むと、`@WebFluxTest`に`@AutoConfigureWebTestClient`が付加されています）。
- `ApplicationContextRunner`が追加され、自作のAuto Cofigurationクラスのテストがやりやすくなりました。
    - [公式ブログ](https://spring.io/blog/2018/03/07/testing-auto-configurations-with-spring-boot-2-0)に紹介されているので、こちらを読むといいでしょう。

<!---------------------------------------------------------------------------------->
# その他

- `@ConditionalOnBean`に複数条件を指定した場合、1.xではORだったのですが2.0ではANDになりました。
    - 例えば、`@ConditionalOnBean({A.class, B.class})`と書いた場合、1.xではAとBいずれかのBeanがApplicationContext内にあれば有効化されたんですが、2.0ではAとB両方のBeanがApplicationContext内にある必要があります。
- `@ConditionalOnXxx`が付いていないAuto Configurationクラスがログで出力されるようになりました。
    - application.propertiesで`logging.level.org.springframework.boot=debug`にすると確認できます。

```bash
...
2018-03-08 15:04:36.289 DEBUG 4600 --- [           main] ConditionEvaluationReportLoggingListener : 


============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
    ...

Negative matches:
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
    ...

Exclusions:
-----------

    None


Unconditional classes:
----------------------

    org.springframework.boot.actuate.autoconfigure.management.HeapDumpWebEndpointAutoConfiguration

    org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration

    org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration

...
```

- `spring`CLIに、Spring Securityと互換性のある`encodepassword`コマンドが追加されました。
- Actuatorに`/scheduledtasks`エンドポイントが追加されました。`@EnableScheduling`などで定義したスケジュールタスクを一覧で確認できます。
- Actuatorの`/logger`エンドポイントで、ロガーのレベルをデフォルトに戻すことができるようになりました
    - （未確認）
- Actuatorに`/sessions`エンドポイントが追加されました。Spring Sessionを使っている場合、セッションを一覧したり削除したり（！）できます。
- `spring-boot-starter-parent`を利用しているMavenプロジェクトは、デフォルトで`-parameters`が適用されます。
    - `-parameters`はJDK 8で追加されたコンパイルオプションで、クラスファイル内にメソッド引数名の情報を残します
- Spring Boot自体のビルドツールがConcourseに変更されました。
    - 私達ユーザーには影響はないはずですが、「何か問題があったら[GitHubのIssue](https://github.com/spring-projects/spring-boot/issues)に書いてね」とのことです


<!---------------------------------------------------------------------------------->
# バナーでアニメーション
Spring Boot起動時に出力されるバナーで、[GIFみたいなアニメーション](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes#animated-ascii-art)が出力できるようになりました。
バナー好きやなｗ