プロジェクト

全般

プロフィール

Spring BootでHello world

はじめに

Spring Bootを利用して Spring Framework の Hello world プログラムを作成します。
Hello worldプログラムは、そのプログラミング言語の開発・実行環境が正しく動作することを非常に短いコードで実装して確認するために使われます。

Hello world プログラムの種類

Spring Bootで、次の種類の簡潔なコードを記述した Hello world プログラムを作成し実行します。

  1. コマンドライン版の Hello world プログラムで、アプリケーションクラス HelloApplication.java と、コマンドライン環境で起動時にコマンドライン引数を受け取り実行する HelloRunner.java で構成しコマンドラインインタフェース上にHello worldメッセージを表示します。
  2. REST APIでクライアントにJSONではなく単純な文字列 Hello world を返却するプログラム。アプリケーションクラス HelloApplication.java と RESTコントローラークラス HelloController.java で構成します。
  3. Spring MVCで Webブラウザに Hello world を返却するプログラム。アプリケーションクラス HelloApplication.java、コントローラークラス HelloController と Thymeleafをテンプレートエンジンに使ったビュー hello.html で構成します。

Hello world プログラムでは、本来は1つのソースファイルだけで構成したいところです。しかし、アプリケーションクラス HelloApplication に無理やりコマンドラインランナーやコントローラー機能を付けてしまうとかえって Spring Boot の理解の妨げになってしまいそうなので本記事では、複数のファイルで構成しました。

ビルド環境

今回は、インターネットに接続された環境を前提とし、ビルドツールに Gradle を使用し、JDKをインストールした環境で実行します。
コードの編集は、記述するコードが短いので IDE は必ずしも必要とせず、汎用のエディタで十分です。

コマンドライン版 Hello world

ビルド・実行環境

JDK JDK 25
Spring Boot 4.0.0
Gradle 9.2.1

プロジェクトディレクトリ

プロジェクトディレクトリを作成し、Gradleの設定ファイルを記述します。

springboot % mkdir hello_cli
springboot % cd hello_cli
hello_cli % 
hello_cli
 +- build.gradle.kts
 +- src
     +- main
         +- java
             +- com/torutk/hello
                 +- HelloApplication.java
                 +- cli
                     +- HelloRunner.java

build.gradle.kts の記述

plugins {
    java
    id("org.springframework.boot") version "4.0.0" 
    id("io.spring.dependency-management") version "1.1.7" 
}

group = "com.torutk" 
version = "0.0.1-SNAPSHOT" 

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
}

HelloApplication の記述

SsssspringBootアプリケーションでは、mainメソッドを持つアプリケーションの入り口となるメインクラスを定義します。

package com.torutk.hello;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;

@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}
  • クラスに @SpringBootApplicationアノテーションを指定します。このアノテーションは、次のアノテーションを含みます。
    • @SpringBootConfigurationアノテーション:Javaコンフィグクラスを指定するアノテーション
    • @EnableAutoConfigurationアノテーション:自動設定を有効
    • @ComponentScanアノテーション:@Componentアノテーションを付与したクラスをBeanとして登録
  • メインメソッドの中で、SpringApplicationを呼び出し、Spring Frameworkを起動します。

コンポーネントスキャンは、このクラスを配置したパッケージとその下のパッケージがスキャン対象となるので、このクラスはアプリケーションのトップ階層のパッケージに配置します。

HelloRunner の記述

Spring Bootでは、アプリケーション起動時にコマンドライン引数を受け取って処理をするための CommandLineRunner と ApplicationRunner の2つのインタフェースが提供されています。違いは、受け取るコマンドライン引数がString配列である CommandLineRunner と、高度なコマンドライン解析ができる ApplicationRunner とになります。

今回は、コマンドライン引数の解析は行いませんが、今後使う可能性の高い ApplicationRunner インタフェースを実装して作成します。

package com.torutk.hello.cli;

import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component;

@Component
public class HelloRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        IO.println("Hello, world.");
    }
}
  • クラスに @Component アノテーションを付与し、Spring にインスタンス化して Springコンテナ管理下に入れます。
  • ApplicationRunner インタフェースを実装し、runメソッドをオーバーライドします。
  • SpringBoot アプリケーション起動時に、Springコンテナ管理下にある ApplicationRunner インスタンスのrunメソッドが実行されます。

複数の ApplicationRunner/CommandLineRunner インスタンスがあると、全てが実行されます。

Gradleの準備

gradle wrapper を実行します。

hello_cli % gradle wrapper
  :

ビルドと実行

hello_cli % ./gradlew bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v4.0.0)

  :(中略)

Hello, world

BUILD SUCCESSFUL in 1s

REST API 版 Hello world

REST API を使用した Hello world Webアプリケーションを作成します。

ビルド・実行環境

JDK JDK 25
Spring Boot 4.0.0
Gradle 9.2.1

プロジェクトディレクトリ

プロジェクトディレクトリを作成し、Gradleの設定ファイルを記述します。

springboot % mkdir hello_rest
springboot % cd hello_rest
hello_rest % 
hello_rest
 +- build.gradle.kts
 +- src
     +- main
         +- java
             +- com/torutk/hello
                 +- HelloApplication.java
                 +- HelloController.java

build.gradle.kts の記述

plugins {
    java
    id("org.springframework.boot") version "4.0.0" 
    id("io.spring.dependency-management") version "1.1.7" 
}

group = "com.torutk" 
version = "0.0.1-SNAPSHOT" 

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-webmvc")
}

HelloApplication.java

コマンドライン版とコードは全く同じとなります。

HelloController.java

package com.torutk.hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class HelloController {
    @GetMapping("/")
    public String home() {
        return "Hello, world.";
    }
}

REST APIの処理を実行するコントローラーです。@RestController アノテーションを付与し、HTTP GETメソッドで / にアクセスすると homeメソッドを実行するように@GetMappingアノテーションを設定します。
RestControllerは、HTML画面ではなく直接データをクライアントに返すので、戻り値に返すデータを指定します。

@RestControllerアノテーションは、@Controllerと@ResponseBodyの合成となっているので、@Controller と @ResponseBody を付与したクラスでも同じ動きをすることができます。

Gradleの準備

hello_rest % gradle wrapper

ビルド・実行

hello_rest % ./gradlew bootRun
  :
2025-12-17T00:54:14.253+09:00  INFO 20437 --- [main] o.s.boot.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'

メッセージにあるポート8080にブラウザから接続します。

Hello, world.のメッセージが表示されます。

Webアプリケーション版

Spring MVC と テンプレートエンジンに Thymeleaf を使用したHello Worldメッセージを表示するWebプログラムを作成します。

リクエスト 処理するコントローラ 処理後に表示するビュー
GET / HelloController index.html

開発環境

JDK JDK 25
Spring Boot 4.0.0
Gradle 9.2.1

プロジェクトのディレクトリ

プロジェクトディレクトリを作成し、Gradleの設定ファイルを記述します。

work $ mkdir hello_mvc
work $ cd hello_mvc
hello_mvc $
hello_mvc
 +- build.gradle.kts
 +- src/
     +- main/
         +- java/
         |   +- com/torutk/hello
         |       +- HelloApplication.java
         |       +- HelloController.java
         +- resources/
             +- templates/
                 +- hello.html

build.gradle.kts の記述

Gradleのビルド定義 build.gradle.kts を記述します。

plugins {
    java
    id("org.springframework.boot") version "4.0.0" 
    id("io.spring.dependency-management") version "1.1.7" 
}

group = "com.torutk.hello" 
version = "0.0.1-SNAPSHOT" 

tasks.compileJava {
    options.release = 25
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-webmvc")
    implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
}

コマンドライン版との違いは次です。

  • ソース・ターゲットのバージョン指定方法を変更👉GradleのJavaバージョン指定
  • dependenciesには、Spring MVCを使用するため、spring-boot-starter-webmvc を指定
    • 注)Spring Boot 4.0.0 から、Sprint MVCの依存名が spring-boot-starter-web から spring-boot-starter-webmvc に変更になりました。(Deprecated扱い)
  • dependenciesに、テンプレートエンジン Thymeleaf を使用するため、spring-boot-starter-thymeleaf を指定

gradle wrapperを実行

build.gradle.ktsを記述したら、必要な gradle wrapperを生成します。

hello_mvc $ gradle wrapper
  :

HelloApplication

アプリケーションのメインクラスを記述します。コマンドライン版 HelloApplication.java と同じです。

HelloController

コントローラクラス

package com.torutk.hello;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/")
    public String home() {
        return "hello";
    }
}
  • Spring MVCを使うアプリケーションでは、コントローラとして振る舞うクラスに @Controller アノテーションを指定
  • リクエストを処理するメソッド home を記述、このメソッドには RequestMapping アノテーションを付与しURLのリクエストパス("/"@)を指定
  • リクエストに対応する画面(レスポンス)を表示するThymeleaf HTMLファイルのビュー名(hello)を戻り値として返却

hello.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Hello, world</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
        <p>Hello, world</p>
    </body>
</html>
  • Thymeleaf HTMLテンプレートエンジンのコードは、src/main/resources/templates/ に置くのが Spring Frameworkの規定です。
  • html要素のxmlns:th は、最近の HTML Living standard では非推奨ですが、開発ツールへのヒントとして使用されるので、Thymeleafのドキュメントではxml:thが記載されています。

実行

gradle の bootRunタスクを実行すると、コンパイル後実行されます。

hello_mvc $ ./gradlew bootRun
  :
2025-03-25T01:21:04.773+09:00  INFO 63711 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
  :

ブラウザで8080ポートにアクセスするとHello Worldのメッセージが表示されます。

Webアプリケーション(Initializr)

Spring Initializr Webサービスを利用してプロジェクトを生成し、RESTコントローラによるWeb版 Hello world プログラムを作成します。

プロジェクトの生成

主要なIDEでは、Spring Bootプロジェクトの生成メニューを用意していますが、生成には Spring Initializr Webサービスを呼び出しています。
手動で https://start.spring.io にアクセスして設定を指定してプロジェクトの雛形を取得することもできます。Webブラウザでアクセスし必要な設定を記述します。

[GENERATE]ボタンをクリックすると、指定した条件で生成したプロジェクトがzip形式でダウンロードされます。

プロジェクトのディレクトリツリー

├── build.gradle.kts
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── HELP.md
├── settings.gradle.kts
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── torutk
    │   │           └── hello
    │   │               └── HelloApplication.java
    │   └── resources
    │       └── application.properties
    └── test
        └── java
            └── com
                └── torutk
                    └── hello
                        └── HelloApplicationTests.java

ビルド定義ファイル

  • build.gradle.kts
plugins {
    java
    id("org.springframework.boot") version "3.5.6" 
    id("io.spring.dependency-management") version "1.1.7" 
}

group = "com.torutk" 
version = "0.0.1-SNAPSHOT" 
description = "Demo project for Spring Boot" 

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<Test> {
    useJUnitPlatform()
}

生成される成果物

Spring BootでビルドしたプログラムにはWebサーバーが組み込まれています。
サーブレット機能を必要とするSpring MVCを使用したプログラムの場合、Tomcatサーバーが組み込まれます。
サーブレットを使わないREST APIのプログラムであれば、Jettyを組み込むことが可能です。

ライブラリ構成

Spring Boot

spring-boot-starter

Spring Bootで必要とする依存関係のみ定義したライブラリ。jarファイルは、MANIFESTディレクトリのみ含みます。次のライブラリへの依存を定義しています。
Web機能を含まず、最低限 Spring Framework を使うだけの依存を含みます。

  • spring-boot
  • spring-boot-autoconfigure
  • spring-boot-starter-logging
  • jakarta.anotation-api
  • spring-core
  • snakeyaml

これらのライブラリがさらに依存ライブラリを持つ可能性があるので、実際に必要なライブラリは上述よりも多くなります。


16日前に更新