Edited at

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

More than 1 year has passed since last update.


この記事について

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リファレンスからの引用です。


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のドキュメントを確認してください。


Tomcat 9.0

JDK 9とTomcat 9.0にすれば、追加のライブラリ等は必要無いようです。

Tomcatのバージョンを9.0にするには、Mavenの場合だとpom.xmlに下記のpropertyを追加すればOKです。


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行目に定義されてますよ」と書かれていますね。

***************************

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エンドポイントでも、各プロパティの定義場所が表示されます。

{

"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


InfluxDB

InfluxDBがサポートされました。特にStarterのようなものは無く、org.influxdb:influxdb-javaを依存性に追加するだけでOKのようです。

spring-boot-autoconfigure.jarにAuto Configurationクラスが入ってますね。


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のImplicitNamingStrategyPhysicalNamingStrategyを、Beanとして定義すればAuto Configuration側でそれを設定してくれるようになりました。

こんなイメージです。

@Configuration

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

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

従来どおり、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で設定できます。

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-jsonspring-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が追加されました。


  • ConverterGenericConverterが、@WebMvcTest@WebFluxTestでスキャン対象になりました


  • @AutoConfigureWebTestClientが追加され、WebTestClientのBeanがテストで使えるようになりました。


    • このアノテーションは、@WebFluxTestを付加すると自動的に適用されます(ソースを読むと、@WebFluxTest@AutoConfigureWebTestClientが付加されています)。




  • ApplicationContextRunnerが追加され、自作のAuto Cofigurationクラスのテストがやりやすくなりました。



    • 公式ブログに紹介されているので、こちらを読むといいでしょう。




その他



  • @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にすると確認できます。



...

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

...



  • springCLIに、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に書いてね」とのことです




バナーでアニメーション

Spring Boot起動時に出力されるバナーで、GIFみたいなアニメーションが出力できるようになりました。

バナー好きやなw