Spring Bootとは(2)
アプリケーションの実行方法から配布形態までをカバーするフレームワーク
Spring Bootが他のフレームワークと大きく異なるもう1つの特徴として、アプリケーションの実行方法から配布形態までカバーしている点が挙げられます。
Spring Bootでプロジェクトを作ると、リスト2の通りメインクラスが用意されます。Webフレームワークなどではメインクラスを自分で触ることができないことが多々ありますが、さまざまな利用ケースを想定した場合にメインクラスを自分で変更可能なことは非常に大切です。
特にミドルウェアなどを組込み用として内包してしまう場合には、その起動から停止までのライフタイムを完全にコントロールしたいことがあります。その場合、メインクラスから提供されているので、それらのライフタイムは完全にコントロール可能です。
また、メインクラスが提供されていることで、Java初心者にとってもイメージしやすい構造になっていると思います。
package com.coltware.springboot.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Part1Application {
public static void main(String[] args) {
SpringApplication.run(Part1Application.class,args);
}
}
そして、Spring Bootをビルドすると実行可能な1つのJarファイルができあがり、その中に依存しているライブラリなどがすべて含まれるようになっています。従って、できあがったJarファイルを実行する際にもリスト3の通り1つのファイルを指定するだけです。
$./gradlew build // ・・省略・・・ $java -jar build/libs/demo-0.0.1.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.0.RELEASE) 2018-11-25 15:51:52,883 INFO [main] boot.StartupInfoLogger (StartupInfoLogger.java:50) - Starting Part1Application on xxxxxx with PID 25343 2018-11-25 15:51:52,890 DEBUG [main] boot.StartupInfoLogger (StartupInfoLogger.java:53) - Running with Spring Boot v2.1.0.RELEASE, Spring v5.1.2.RELEASE 2018-11-25 15:51:52,891 INFO [main] boot.SpringApplication (SpringApplication.java:675) - No active profile set, falling back to default profiles: default 2018-11-25 15:51:55,049 INFO [main] boot.StartupInfoLogger (StartupInfoLogger.java:59) - Started Part1Application in 2.544 seconds (JVM running for 3.592)
1つのJarファイルで完結しているので、アプリケーションを配布する際にも1つのファイルで済みます。また、実行時に依存するライブラリのバージョンなどが環境によって異なることもなくなります。
こうした特徴は単純ではありますが、Dockerなどのコンテナ上で動的にサービスを起動したり落としたりする場合のメンテナンスが非常に簡単になります。また、依存しているライブラリはJarファイル内のBOOT-INFフォルダに含まれるので、ライブラリとバージョンなどはそこから調べることもできます。
Java 11への対応状況
2018年10月30日にリリースされたSpring Boot 2.1からJava 11がサポートされました。内部で利用しているSpring FrameworkのバージョンもJava 11対応された5.1に変更されています。また、まだまだJava全体としてJava 8がベースとして普及していることもあり、Java 8での互換性に関しても問題なくサポートされます。
もちろん、Java 9以降モジュール対応されたアプリケーションにも対応しています。しかし、Spring Bootで作成するアプリケーションが、依存するすべてのライブラリも含めて、モジュール対応されているわけではありません。
このため、モジュール対応されたアプリケーションを作る場合にはSpring Bootとは関係がない課題や疑問が生じると思われます。Spring Bootを初めて使う場合には避けた方がよいと思います。
最後に
Springのプロジェクトも非常に多岐にわたるようになり、どのプロジェクトがどのように使われているのか、どのように使えばよいのか分かりにくくなってしまっています。筆者にとっても、久しぶりにSpringプロジェクトのWebサイトを見ると、どこから手をつけてよいのか迷うほどプロジェクトが増えています。
また、Springプロジェクトに限らず、さまざまなフレームワーク、ライブラリも含めるとますますどのような構成がよいのか分かりにくいでしょう。
Spring Bootはこういった状況の中で、組み合わせの成功パターンを管理するためのフレームワークと言えます。従って、Spring Bootだけを見ていると全体像がつかみにくいのですが、Spring Frameworkの特徴やこれまでの課題点が分かると、Spring Bootがより理解しやすくなると思います。
そして、各種ライブラリやミドルウェア単体などのノウハウは十分蓄積されていると言えますが、組み合わせのノウハウはなかなか見つかりません。Spring Bootを使うことで組み合わせが共通化されやすくなります。また、Starterというキーワードもあるので、迷った場合にも同様の課題を持った人などが既に共有しているケースもありノウハウも見つけやすいはずです。
こういった背景がSpring Bootの注目度が高まっている理由の1つではないかと思います。次回からは、サンプルアプリケーションを作りながらSpring Bootの使い方を説明していきます。
参考資料

