Spring BootでHello World


# 環境
 - Windows 10, コマンド実行はコマンドプロンプトから
 - Maven 3.6.0
 - Java 11


# Mavenで空プロジェクトを作成

アーキタイプに`maven-archetype-quickstart`を指定して`mvn archetype:generate`を実行します。

```
> mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DgroupId=net.hidakanoko -DartifactId=spring-boot-hello-world -Dversion=1.0.0-SNAPSHOT
> cd spring-boot-hello-world
```

# POMの編集

`prent`に`spring-boot-starter-parent`を指定します。

```
(...省略)
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <dependencies>
(...省略)
```

`spring-boot-starter-parent`を指定しておくと、各種設定を**いい感じ**にしておいてくれるほか、依存性の`version`を省略できるように`dependency-management`セクションを提供してくれます。

Githubにそのparent pomがありました。
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml

この時点でいったん`mvn clean install`が成功することを確認しておきます。


```
>mvn clean install

(...省略)

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  16.193 s
[INFO] Finished at: 2019-03-17T10:38:22+09:00
[INFO] ------------------------------------------------------------------------
```

## 依存ライブラリの追加

`spring-boot-starter-web`はRESTful API, MVC, 組み込みTomcatなど、Webサービスの構築に必要なライブラリの依存性を提供してくれます。

`dependencies`に下記設定を追加します。

```
  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

```

コマンドラインから`mvn dependency:tree`を実行すると追加された依存ライブラリが確認できます。


# コードの編集

すでに配置されている`App.java`を開いて次の通り編集します。

```
package net.hidakanoko;

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;

@RestController
@EnableAutoConfiguration
public class App 
{
    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
```
# アノテーションと処理

 - `@RestController` ステレオタイプと呼ばれるアノテーションで、コードを読む人とSpringに対してこのクラスが特定の役割を果たすことを示します。このアノテーションはクラスがWeb`@Controller`であることを明示して、SpringがWebリクエストを適切に扱ってくれます。
 - `@RequestMapping` リクエストのルーティング情報を定義しています。指定されたパス "/" へのリクエストは`home`メソッドで処理されます。`@RestController`アノテーションが指定されている場合、メソッドの戻り値はそのまま呼び出し元に返されます。
 - `@EnableAutoConfiguration` このアノテーションを追加しておくと、jarの依存性等に応じてSpringを**いい感じ**に設定してくれます。`spring-boot-starter-web`がSpring MVCやTomcatへの依存性を追加するので、このプロジェクトはWebアプリケーションであると判定され、Springもそのように設定されます。
 - `main`メソッドはJavaのエントリーポイントです。ここでは`SpringApplication.run`を呼び出しています。`run`メソッドにはプライマリソースとしてロードするクラス`App.class`とコマンドラインパラーメーターがそのまま渡されています。

# 実行

コマンドラインから`mvn spring-boot:run`を実行してアプリケーションを起動します。
次のような出力が確認出来たらブラウザで`http://localhost:8080`にアクセスしてみます。"Hello World"がかえって来たら成功です。

```
> mvn spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)
```

---

https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web