SpringBoot_01_Building a RESTful Web Service

官方:http://spring.io/guides/gs/rest-service/


POM

 Spring Boot Maven plugin 提供以下功能:

1. 打包jar或者war,或者其他的。

2. 搜寻main入口方法。

3. 提供一个自动匹配springboot版本的依赖解析器,但是我暂时不知道有什么用。

实现的目标

我们创建了一个springboot的web项目,并且引入了依赖。

我们实现一个接受get请求,返回一个json。接受一个带参数的get请求,返回一个json。返回的json大致如下:

{ "id": 1, "content": "Hello, World!"}

首先我们手动的创建一个pojo对象类:

package com.springbootexamples.restfulwebservice.hello;

public class Greeting {

    private final long id;

    private final Stringcontent;

    public Greeting(long id, String content) {

        this.id = id;

        this.content = content;

    }

    public long getId() {

        return id;

    }

    public StringgetContent() {

        return content;

    }

}

创建Controller

被@RestController注解的类,即可成为一个controller

package com.springbootexamples.restfulwebservice.hello;

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

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.atomic.AtomicLong;

@RestController

public class GreetingController {

    private static final String template = "Hello, %s!";

    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")

    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {

        return new Greeting(counter.incrementAndGet(),

                String.format(template, name));

    }

}

这是一个很简单的controller,在spring引擎下还有很多事,下面我们一步一步分析他。

这个例子并没有展示出get、post、put之间的区别,因为RequestMapping默认会包含所有请求方法映射,可以使用@RequestMapping(method=GET)缩小范围。

如果路由会将请求定位到greeting()方法,@RequestParam注解会查询url请求中的name参数的值。

如果参数name对应的值是缺省的,那么会用默认的World来代替。

这个方法体的实施是创造并且返回一个新的Greeting对象,这个对象包含一个id和一个content,id会在计数器的作用下不断增加,string的format方法会将name参数按照template 的格则整理。

传统的MVCController和Restful的Controller一个明显区别是,传统mvc是将视图渲染为html进行返回,但是restful会将对象转换成json返回。

这一篇的代码,使用Spring4中的新的@RestController注解,这个类作为一个Controller存在,作用是,在每个方法中返回一个domainObject(一个实体类,或者可以理解为其他人经常说的pojo对象),而代替view,他是@Controller 和@ResponseBody组合在一起的缩写。

Greeting对象必须转换为json,由于Spring的HTTp消息转化支持,不需要去自己做json的转换,因为Jackson2在我们的类路径里面,Spring的MappingJackson2HttpMessageConverter会自动的将Greeting转化为json。

让这个应用变成可执行的

即使我们可能将服务器作为传统的war包部署在外部的服务器中,但是下面利用了一个更加简单的方法创建了一个独立的应用程序,我们将所有的东西打包在一个单独的可执行的jar中,通过java的main方法驱动,接着,你可以将Spring支持的TomcatServlet打包到jar作为程序的运行环境,而不是部署到外部的服务器实例。

让我们看下面的main方法:

package com.springbootexamples.restfulwebservice;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class RestfulwebserviceApplication {

    public static void main(String[] args) {

        SpringApplication.run(RestfulwebserviceApplication.class, args);

    }

}

@SpringBootApplication的作用:

@SpringBootApplication这个注解包含了三个注解的作用,分别是:(默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan,下面分别解释:

1. @Configuration:提到@Configuration就要提到他的搭档@Bean。使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。


相当于:


@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

2. @EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

3.@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

另外,我们发现整个工程没有web.xml也没有其他的xml。

打包成为可执行jar

如果我们用的maven,./mvnw spring-boot:run命令来运行,./mvnw clean package打包一个jar。

然后使用下面的语句运行jar:

java -jar target/gs-rest-service-0.1.0.jar

当然,我们也可以打war。

让我们来测试一下


无参数


有参数,并且计数器加1


其他

关于【AtomicLong】

参考资料:java多线程--AtomicLong和LongAdder

Java并发编程札记-(三)JUC原子类-06JDK1.8新增:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator

你可能感兴趣的:(SpringBoot_01_Building a RESTful Web Service)