この記事について
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です。
<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つです。
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のImplicitNamingStrategy
やPhysicalNamingStrategy
を、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-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クラスのテストがやりやすくなりました。- 公式ブログに紹介されているので、こちらを読むといいでしょう。
その他
-
@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
にすると確認できます。
- application.propertiesで
...
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に書いてね」とのことです
バナーでアニメーション
Spring Boot起動時に出力されるバナーで、GIFみたいなアニメーションが出力できるようになりました。
バナー好きやなw