プロジェクト

全般

プロフィール

Spring BootでHello world

Spring Boot 3

はじめに

Spring Bootを使った Spring Framework の Hello world プログラムを2種類作成します。
1つ目は、コマンドライン版の Hello world プログラムです。2つ目は、Web版の Hello world プログラムです。

コマンドライン版

ビルドツールを使う環境で動かす

コマンドライン版で Spring Boot プログラムを作成・実行するのに必要なソフトウェアは次です。

  • JDK
  • ビルドツール(MavenまたはGradleのいずれか)
  • エディタ

Spring Bootは、実際に必要とする様々なライブラリを依存関係で引っ張ってくれるので、ライブラリの依存解決ができるビルドツールを使います。
もし、ビルドツールを使わないとしたら、Spring Bootから利用されるライブラリ群と、それらがさらに依存するライブラリ群を調べて集めてくる作業が発生します。流石にこの作業は現実的ではないので、いずれかのビルドツールを使用します。

このページでは、JDK 21とGradle 8.12を使用します。

Spring Boot 3.4 に必要な環境

Spring Boot 3.4 は、JDK 17以上 JDK 23までに対応しています。
ビルドツールは、Maven 3.6.3以降、Gradle 7.6.4以降 または 8.4以降に対応しています。

コマンドライン版 Hello World

環境の確認

JDKとGradleのバージョンを確認します。

% java --version
java 21.0.6 2025-01-21 LTS
  :
% gradle --version
Welcome to Gradle 8.12.1!
  :

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

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

~ % mkdir spring_boot_hello
~ % cd spring_boot_hello
spring_boot_hello % 

build.gradle.kts の記述

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

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

java {
    sourceCompatibility = JavaVersion.VERSION_21
}

repositories {
    mavenCentral()
}

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

メインクラス

SpringBootアプリケーションでは、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を起動します。

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

com.torutk.hello/
  +-- HelloApplication
  |
  +-- model/
  |
  +-- view/
  |
  +-- controller/

メッセージ表示Bean

コマンドラインアプリケーションでは、アプリケーション起動時にコマンドラインで指定された引数を受け取り、それに基づく処理を実施します。
CommandLineRunnerまたはApplicationRunnerインタフェースを実装するクラスをBeanとして定義すると、アプリケーション実行時にこれらのBeanが自動で実行されます。
(SpringApplicationのrunを呼び出すと、これらが実行される)

package com.torutk.hello;

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

@Component
public class HelloMessage implements ApplicationRunner {
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("Hello, world");
    }
}

Webアプリケーション版

Spring MVC を使用したHello Worldメッセージを表示するWebプログラムを作成します。
書籍「Spring徹底入門 第2版」の4.2節のサンプルの最初の一歩であるプログラムを Spring Bootを使って実装します。

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

開発環境

JDK 21、ビルドツール Gradle、Spring Boot 3を使います。

work $ java --version
java 21.0.6 2025-01-21 LTS
Java(TM) SE Runtime Environment (build 21.0.6+8-LTS-188)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.6+8-LTS-188, mixed mode, sharing)

work $ gradle --version

------------------------------------------------------------
Gradle 8.13
------------------------------------------------------------

Build time:    2025-02-25 09:22:14 UTC
Revision:      073314332697ba45c16c0a0ce1891fa6794179ff

Kotlin:        2.0.21
Groovy:        3.0.22
Ant:           Apache Ant(TM) version 1.10.15 compiled on August 25 2024
Launcher JVM:  21.0.6 (Oracle Corporation 21.0.6+8-LTS-188)
Daemon JVM:    /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home (no JDK specified, using current Java home)
OS:            Mac OS X 15.3.2 aarch64

プロジェクトの作成

プロジェクトのディレクトリを作成

work $ mkdir hello_mvc
work $ cd hello_mvc
hello_mvc $

ビルド定義の記述

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

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

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

tasks.compileJava {
    options.release = 17
}

repositories {
    mavenCentral()
}

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

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

  • plugins で、spring bootの最新バージョンを記載
  • ソース・ターゲットのバージョン指定方法を変更👉GradleのJavaバージョン指定
  • dependenciesには、Spring MVCを使用するため、spring-boot-starter-web を指定

gradle wrapperを実行

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

hello_mvc $ gradle wrapper
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

BUILD SUCCESSFUL in 4s
1 actionable task: 1 executed
hello_mvc $ ls
build.gradle.kts gradle           gradlew          gradlew.bat

ソースコードの記述

次の3つのソースファイルを記述します。

  • アプリケーションのメインクラス (EchoApplication.java)
  • コントローラクラス(WelcomeController.java)
  • 画面表示のビューファイル(index.jsp)
hello_mvc
  +-- src
        +-- main
              +-- java
              |     +-- com
              |           +-- torutk
              |                 +-- spring
              |                       +-- echo
              |                             +-- EchoApplication.java
              |                             +-- WelcomeController.java
              +-- resources
              |     +-- application.properties
              +-- webapp
                    +-- WEB-INF
                          +-- index.jsp
  • HTMLテンプレートエンジンのコードは、src/main/resources/templates/ に置くのが Spring Frameworkの想定のようですが、JSPはWEB-INF以下に置く必要があります。

EchoApplication.java

パッケージ名、クラス名が違うだけで、コマンドライン版とほぼ同じコードです。

package com.torutk.spring.echo;

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

@SpringBootApplication
public class EchoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EchoApplication.class, args);
    }

}

WelcomeController.java

package com.torutk.spring.echo;

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

@Controller
public class WelcomeController {

    @RequestMapping("/")
    public String home() {
        return "index";
    }

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

index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Welcome</title>
    </head>
    <body>
        <p>Hello, World!</p>
    </body>
</html>

JSPを使う設定

上述の通りソースコードを作成して、gradleでビルド・実行します。
すると、ポート 8080 で待ち受けるWebアプリケーションが実行します。
しかし、ブラウザでアクセスするとエラーページが表示されてしまいます。

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Mar 25 00:44:17 JST 2025
There was an unexpected error (type=Not Found, status=404).

Spring MVCでビューのHTMLテンプレートにJSPを使う場合、Spring MVCにはJSPのライブラリが含まれていないので、追加でdependenciesに記述する必要があります。また、アプリケーションプロパティにJSPを使う指定を記述します。

ビルド定義への追加

build.gradle.kts の dependencies に追加

 dependencies {
     implementation("org.springframework.boot:spring-boot-starter-web")
+    implementation("org.apache.tomcat.embed:tomcat-embed-jasper")
 }

アプリケーション定義への追加

src/main/resources/application.properties

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
  • ビュー(JSP)のファイルが置かれている場所を指定
  • ビュー(JSP)の拡張子を定義

実行

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のメッセージが表示されます。

ライブラリ構成

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

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


約1ヶ月前に更新