Java
spring
spring-boot

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

この記事について

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クラスが入ってますね。
スクリーンショット 2018-03-08 13.33.53.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の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