プロジェクトはできたので、ひとまず Building an Application with Spring Boot を読んでみることにした。
Gradleでビルド
gradleでビルドするときには、gradleのspring-bootプラグインがあるようだ。これを使うと、Spring Boot用のtaskが追加され、gradle bootRunでSpring Bootが起動クラスを探して起動してくれるようだ。
また、プラグインはeclipseやideaもあるようだ。これを使うとそれぞれのIDE用のプロジェクトファイルを作ってくれるらしい。自分が使うかどうかはわからない。今のところ、使いどころがいまいちわからない。twitterで話した感じだと、昔はIDEでpom.xmlやbuild.gradleをプロジェクトとして直接読み込めなかったからじゃないか?という結論に至った。
jarブロックで、jarファイル名やバージョン名を指定できるようである。jarブロックで指定できることはかなりあるようだ。
buildscriptブロック
毎回コピペするだけで、いまいちよくわかっていなかったのだけれど、buildscriptブロックを書くことで、外部ライブラリをビルドスクリプトとして使う事ができるそうだ。dependenciesブロックで、利用するライブラリのクラスパスとしてspring-boot-gradle-pluginを指定すると、このプラグインで設定されているビルド設定が利用できるので、わざわざ自分でビルド設定を書かなくてもいい、というふうに解釈した。
とりあえず修正してみたのがこれ。
buildscript { repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.1.RELEASE") } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' jar { baseName = 'spring-boot-practice' version = '0.1.0' } sourceCompatibility = 1.8 version = '1.0' repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-web:1.2.1.RELEASE") testCompile("org.springframework.boot:spring-boot-starter-test:1.2.1.RELEASE") } sourceSets { main { java } test { java } }
gradle buildでビルドはできたし、gradle bootRunで作成中のアプリも起動したし、よしとする。
「Spring Bootで何ができるのかを学ぼう」を読む
ざっと読んだ感じ、Spring Bootは、よりビジネス要件にフォーカスし、インフラストラクチャを気にしないでもよくすると書いてあると解釈した。
例えば、
- Spring MVCを内包していて、それ単体だとコンテナーが必要だけれど、Spring Bootは組み込みTomcatで動くよ
- Tomcatが嫌な人はJettyでも動かせるよ
- Thymeleafが使いたければ、追加するだけで使えるよ(Thymeleafはテンプレートエンジンらしい)
Spring Bootは、automatic configurationで、設定を自動的に読み込むのでThymeleafにパスを通してあれば、自動的にSpringBootTemplateEngineとして使うが、もし独自にSpringBootTemplateEngineに値が設定されていれば、読み込まないらしい。
「シンプルなWebアプリケーションを作ってみる」を読む
このサンプルコードを読むと、Rest用のControllerとApplication起動用のクラスに分けて作ってある。前回作ったのは、起動とレスポンスを同時に行うクラスだったので、このコードに従って分けてみる。
HelloControllerを修正してみた。@RestControllerアノテーションを使うと、@Controllerアノテーションと@ResposeBodyアノテーションを使ったのと同じになるらしい。そして、@RequestMappingアノテーションでルーティングが決まるようだ。
package sample; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/") String index() { return "Hello World!"; } }
Spring Bootで起動させるクラスは別にした。Applicationだ。
package sample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import java.util.Arrays; @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); System.out.println("Let's inspect the beans provided by Spring Boot:"); String[] beanNames = context.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } } }
3つのアノテーションを使っている。が、説明によると、@SpringBootApplicationアノテーションをつけると全部やってくれるらしい。
以下は3つのアノテーションの説明を読んだ感じ。
- @Configuration
- アプリケーションコンテキストのbean定義を行う?なんとなくやってることはわかるがJavaの用語がわからないのでわからない。
- @EnableAutoConfiguration
- Spring Bootに対して、追加されたbeansを元に自動で設定する。
- @ComponentScan
- sampleパッケージ内のその他のコンポーネント、設定、サービスを読み取る。ここではHelloControllerが自動的に読み取られる。
あと、通常だと@EnableWebMvcも書くらしいのだが、Spring Bootなら自動で読み込んでくれるらしい。
とりあえず、@SpringBootApplicationでいいらしいのでそうしてみた。
package sample; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import java.util.Arrays; @SpringBootApplication public class Application { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); System.out.println("Let's inspect the beans provided by Spring Boot:"); String[] beanNames = context.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } } }
アノテーションが1つになって見やすくなった。
この状態でgradle bootRunを行い、http://localhost:8080にアクセスしたら、Hello World!が出た。
とりあえず今日はここまでとする。