Help us understand the problem. What is going on with this article?

[書きかけ] 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クラスが入ってますね。
スクリーンショット 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

suke_masa
Java / Spring / Microservices / Kubernetes(CKAD) / IntelliJ IDEA
https://www.casareal.co.jp/ls
casareal
システム開発/評価・検証支援/品質改善支援サービスと現場に即した実践的なIT研修サービスを提供しています。
https://www.casareal.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away