huruyosi’s blog

プログラミングとかインフラとかのメモです。

spring boot その1 - プロジェクト作成

実装したソースは https://github.com/huruyosiathatena/springboot/tree/f885430ac57db879e58cf281c75bec85a6dedac1 にあります。

Hello world

web アプリケーションを作成して hello world を目指します。

ほぼ、コピペです。

qiita.com

作成したプロジェクトは https://github.com/maakiyama/springboot にあります。

eclipseでプロジェクト作成

mavenプラグインを利用できる状態になっているeclipseで「Mavenプロジェクト」を作成します。 アーティファクトIDは「maven-archetype-quickstart」を選択します。

pom.xml を編集

http://docs.spring.io/spring-boot/docs/1.2.5.RELEASE/reference/htmlsingle/#getting-started-maven-installation を参考にしてプロジェクト作成後の pom.xml を編集します。ついでに2点変更します。

  • java のバージョンが8であることを明記する。
  • junitを追加します。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hatenablog.huruyosi</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot</name>
    <url>http://huruyosi.hatenablog.com/archive/category/spring%20boot</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compile.source>1.8</maven.compile.source>
        <maven.compile.target>1.8</maven.compile.target>
        <java.version>1.8</java.version>
    </properties>

    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Add typical dependencies for a web application -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version><!--$NO-MVN-MAN-VER$-->
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

JDKのバージョンを 8にする

pom.xmlJDKのバージョンを明示しているので、eclipseのプロジェクトのプロパティにある「Javaのビルドバス」の「ライブラリ」タブにある「JRE システムライブラリ」をJDK8にします。

コントローラーを作成

ここで利用するアノテーション * @Controller - SpringにControllerと識別させる。 * @RequestMapping("/hello") - Webリソースのマッピングを行う。 * @ResponseBody - メソッドの返り値がそのままレスポンスボディとする。(この場合文字列。)

package com.hatenablog.huruyosi.springboot.controllers;

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

@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello world";
    }
}

mainクラスを編集

プロジェクト作成時に生成された App.java を編集します。

  • @ComponentScan - 定義パッケージ以下のSpringコンポーネントをスキャンする。
  • @EnableAutoConfiguration - Springの自動設定を有効にする。
package com.hatenablog.huruyosi.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

/**
 * Hello world!
 * 
 */
@ComponentScan
@EnableAutoConfiguration
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

実行

App.java を右クリックして「実行」-> 「Javaアプリケーション」で実行します。 組み込みのtomcatが起動され、8080番ポートでリスニングするので webブラウザから http://localhost:8080/hello にアクセスすると、「hello world」と表示されます。

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

2015-07-26 00:15:21.377  INFO 3868 --- [           main] com.hatenablog.huruyosi.springboot.App   : Starting App on masahiro-PC with PID 3868 (E:\eclipse\pleiades-e4.3-java-32bit-jre_20130626\workspace-springboot\springboot\target\classes started by masahiro in E:\eclipse\pleiades-e4.3-java-32bit-jre_20130626\workspace-springboot\springboot)
2015-07-26 00:15:21.432  INFO 3868 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@25af5db5: startup date [Sun Jul 26 00:15:21 JST 2015]; root of context hierarchy
2015-07-26 00:15:22.066  INFO 3868 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-07-26 00:15:23.786  INFO 3868 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2015-07-26 00:15:24.630  INFO 3868 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2015-07-26 00:15:24.631  INFO 3868 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.23
2015-07-26 00:15:24.781  INFO 3868 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2015-07-26 00:15:24.782  INFO 3868 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3353 ms
2015-07-26 00:15:25.699  INFO 3868 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-07-26 00:15:25.704  INFO 3868 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-07-26 00:15:25.705  INFO 3868 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-07-26 00:15:26.230  INFO 3868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@25af5db5: startup date [Sun Jul 26 00:15:21 JST 2015]; root of context hierarchy
2015-07-26 00:15:26.293  INFO 3868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto public java.lang.String com.hatenablog.huruyosi.springboot.controllers.HelloController.hello()
2015-07-26 00:15:26.295  INFO 3868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2015-07-26 00:15:26.296  INFO 3868 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2015-07-26 00:15:26.320  INFO 3868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-26 00:15:26.320  INFO 3868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-26 00:15:26.361  INFO 3868 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2015-07-26 00:15:26.448  INFO 3868 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2015-07-26 00:15:26.593  INFO 3868 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2015-07-26 00:15:26.595  INFO 3868 --- [           main] com.hatenablog.huruyosi.springboot.App   : Started App in 6.067 seconds (JVM running for 7.094)
2015-07-26 00:16:00.393  INFO 3868 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2015-07-26 00:16:00.394  INFO 3868 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2015-07-26 00:16:00.418  INFO 3868 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 24 ms