本文主要記錄搭建RESTful API標(biāo)準(zhǔn)工程,包含比較推薦的工程結(jié)構(gòu),掌握一些基本注解,并引入Swagger
新建一個(gè)項(xiàng)目
通過(guò)Spring Initializr創(chuàng)建工程,選擇所需要的jar包,如下圖:

工程結(jié)構(gòu)
Spring Boot框架對(duì)工程結(jié)構(gòu)并沒(méi)有什么特殊的限制,我這邊基本按照網(wǎng)上主流和自己一些喜好進(jìn)行劃分,供參考:
代碼層結(jié)構(gòu)
- 前端控制器(Controller): com.xxx.controller
- 數(shù)據(jù)服務(wù)層(Service): com.xxx.service
- 實(shí)體(Entity)與數(shù)據(jù)訪問(wèn)層(Repository):com.xxx.domain
- 公共方法及工具類: com.xxx.common
資源文件的結(jié)構(gòu)
- 配置文件: src/main/resources/config
- 靜態(tài)文件: src/main/resources/static
- 模板: src/main/resources/templates

編寫第一個(gè)服務(wù)
在controller下新建類HelloController,相關(guān)代碼做了簡(jiǎn)單的注釋,如下:
//相當(dāng)于 @Controller + @ResponseBody
//該注解 方法method 返回類型是String時(shí)候則返回string,返回對(duì)象時(shí)候則講json_encode 該對(duì)象的json字符串
@RestController
public class HelloController {
//該注解mapping指定路由
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String SayHello() {
return "Hello Spring Boot";
}
}
編寫到這里,已經(jīng)可以直接編譯運(yùn)行了,這里值得注意的是被@SpringBootApplication注解的啟動(dòng)類一定要放在所有的RestController的根路徑的package下,@SpringBootApplication只會(huì)掃描@SpringBootApplication注解標(biāo)記類包下及其子包的類,如果不放在根路徑下,可以指定下:@SpringBootApplication(scanBasePackages = "com.example.api_demo")
無(wú)需配置Tomcat,直接啟動(dòng),輸入對(duì)應(yīng)的地址可看到結(jié)果:


增加service層
在搭建了基礎(chǔ)應(yīng)用的基礎(chǔ)上,我們?cè)黾觭ervice層抽離控制層和業(yè)務(wù)層代碼。
在service下新增HelloService和HelloServiceImpl兩個(gè)類,代碼如下:
//業(yè)務(wù)層接口:HelloService
public interface HelloService {
public String sayHello();
}
//接口實(shí)現(xiàn):HelloServiceImpl
@Service
public class HelloServiceImpl implements HelloService{
@Override
public String sayHello()
{
return "Hello Spring Boot";
}
}
修改對(duì)應(yīng)的controller代碼:
@Autowired
private HelloService helloService;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String sayHello()
{
return helloService.sayHello();
}
這樣,簡(jiǎn)單的拆分就完成了。
引入Swagger
Swagger是什么大家自行百度,對(duì)于Restful API來(lái)說(shuō),Swagger絕對(duì)是它的好基友。
首先引入對(duì)應(yīng)的jar包,在pom.xml加入:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
新增類Swagger2.java,代碼如下:
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.api_demo.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("測(cè)試文檔")
.description("這里是一段描述")
.termsOfServiceUrl("http://www.bug2048.com/")
.version("1.0")
.build();
}
}
到這里,Swagger就算配置完成了,接下來(lái)就是要添加文檔內(nèi)容了,修改之前的HelloController之后,直接編譯運(yùn)行,通過(guò)/swagger-ui.html就能看到效果
@ApiOperation(value="增加Service層輸出Hello", notes="這是第二個(gè)demo")
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String sayHello()
{
return helloService.sayHello();
}


至此,簡(jiǎn)單的框架算是完成了,后面就可以逐步完善,包括接入日志,數(shù)據(jù)庫(kù)等等,后面會(huì)持續(xù)更新。
總結(jié)
基于Spring Boot構(gòu)建RESTful API相對(duì)來(lái)說(shuō)還是比較便捷的,其中注解使得代碼更加簡(jiǎn)潔,本次用到注解再匯總下,有時(shí)間的話可以深入理解下其背后的原理:
- @SpringBootApplication: 申明讓spring boot自動(dòng)給程序進(jìn)行必要的配置。
- @RestController:REST風(fēng)格的控制器
- @RequestMapping:提供路由信息,負(fù)責(zé)URL到Controller中的具體函數(shù)的映射
- @Service:一般用于修飾service層的組件
- @Autowired: 自動(dòng)導(dǎo)入依賴的bean