官方: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。
让我们来测试一下
其他
关于【AtomicLong】
参考资料:java多线程--AtomicLong和LongAdder
Java并发编程札记-(三)JUC原子类-06JDK1.8新增:LongAdder、DoubleAdder、LongAccumulator、DoubleAccumulator