Spring は様々なフレームワークを提供する、Java のプロジェクト群です。Spring Batch、Spring Security、Spring Loaded といったプロジェクトがあります。Spring Boot は、これら Spring フレームワークを内部的に利用するフレームワークです。効率的なアプリケーション開発が可能になります。環境構築の手順を把握できるサンプルコードをまとめます。一通り把握できたら、次回以降は雛形を Spring Initializr で生成して、以下の公式ドキュメントを参考にしつつ開発できます。
ディレクトリを以下のように作成します。
mkdir -p src/main/java/hello
mkdir -p src/test/java/hello
ビルドスクリプトを作成します。特に Gradle の場合は以下のようになります。
touch build.gradle
build.gradle
buildscript {
ext {
springBootVersion = '1.5.3.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
jar {
baseName = 'gs-spring-boot'
version = '0.1.0'
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
// Tomcat の代わりに Jetty を使用してみます。
compile('org.springframework.boot:spring-boot-starter-web') {
exclude module: 'spring-boot-starter-tomcat'
}
compile('org.springframework.boot:spring-boot-starter-jetty')
// '/health' エンドポイントなどを自動で追加するライブラリです。
// https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html
compile('org.springframework.boot:spring-boot-starter-actuator')
// Spring Test を利用できるように設定します。
testCompile('org.springframework.boot:spring-boot-starter-test')
}
項目 | 概要 |
---|---|
buildscript |
文字通りビルドスクリプト build.gradle の設定を行います。 |
ext |
extra properties を設定します。properties タスクで表示できる項目に加えて、独自定数を追加します。 |
repositories |
依存するレポジトリを設定します。buildscript ブロック内であれば、ビルドスクリプトが依存するレポジトリになります。buildscript ブロック外であれば、プロジェクトが依存するレポジトリになります。mavenCentral() は The Central Repository です。jcenter() レポジトリも有名です。社内に独自レポジトリが存在する場合もここで設定します。 |
dependencies |
依存するレポジトリ内のうち、使用するライブラリを指定します。 |
apply plugin |
ビルドスクリプト build.gradle で必要になるプラグインを設定します。 |
jar |
成果物 JAR ファイルの名称を設定します。 |
sourceCompatibility |
コンパイル時に必要になる Java のバージョンを指定します。例えば 1.8 を指定している場合は、実際には Java 1.7 ではコンパイルできるようなソースコードであっても、コンパイルに失敗するように設定したことになります。Java 8 で追加された記法を使用している場合などは、設定しておいたほうが親切です。 |
targetCompatibility |
コンパイルしたクラスファイルを動作させる想定の JVM のバージョンを指定します。sourceCompatibility と同じ値が既定値になります。 |
compile |
プロジェクトが実行時に依存するライブラリを指定します。 |
testCompile |
プロジェクトがテスト実行時に依存するライブラリを指定します。 |
touch src/main/java/hello/Application.java
touch src/main/java/hello/HelloController.java
touch src/test/java/hello/HelloControllerTest.java
touch src/test/java/hello/HelloControllerIT.java
gradle wrapper
./gradlew build
java -jar build/libs/gs-spring-boot-0.1.0.jar
curl 実行例
$ curl http://localhost:8080/
Greetings from Spring Boot!
$ curl -s http://localhost:8080/health | jq .
{
"status": "UP"
}
src/main/java/hello/Application.java
package hello;
import java.util.Arrays;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName); // 定義された Bean 名を出力します。`commandLineRunner` も含まれます。
}
};
}
}
項目 | 概要 |
---|---|
@SpringBootApplication |
@Configuration , @EnableAutoConfiguration , @ComponentScan を統合したアノテーションです。 |
@Bean |
@Configuration が設定されたクラスのメソッドに対して設定できます。@Bean 設定されたメソッドはインスタンスを返します。これは設定値をもつシングルトンとして、アプリケーション全体で利用できます。CommandLineRunner を返す Bean 定義は特殊で、アプリケーション起動時に実行される処理を設定できます。 |
src/main/java/hello/HelloController.java
package hello;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}
項目 | 概要 |
---|---|
@RestController |
@Controller と @ResponseBody を統合したアノテーションです。View ではなくテキストをそのまま返すコントローラとして設定されます。 |
@RequestMapping("/") |
設定したパスのアクションとしてメソッド index() が設定されます。 |
src/test/java/hello/HelloControllerTest.java
Mock を利用したテスト
package hello;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}
src/test/java/hello/HelloControllerIT.java
Mock を利用しない Integration テスト
package hello;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import java.net.URL;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
@Before
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
}
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}
Spring プロジェクト向けにカスタマイズされた Eclipse が存在します。こちらのページからダウンロードして利用できます。