最近,棧長發現某些國内的開源項目都使用到了 Knife4j 技術,看名字就覺得很鋒利啊!
是不是這樣的縮寫呢:
Knife4j = Knife for Java ?
Java 匕首?
看起來很牛逼的樣子,當然,這是我簡單的猜測,從字面上并不能猜到它是幹嘛用的!
那麼它究竟是一個什麼樣的架構呢?
Knife4j 簡介
Knife4j 的前身是 swagger-bootstrap-ui,其實就是一個純 Swagger UI 的皮膚項目,用過 Swagger 的應該都知道,Swagger UI 是不怎麼好用的,并不太适合國人,是以 swagger-bootstrap-ui 項目就誕生了。
swagger-bootstrap-ui 後面為了滿足許多個性化的需求,又加入了許多豐富的服務端特性,不再僅僅隻是專注于前端 UI 皮膚了,是以又改名:knife4j。
取名 knife4j 是希望它能像一把匕首一樣小巧、輕量,并且功能強悍,更是希望它能成為 Swagger 接口文檔服務的通用性增強型解決方案。
Knife4j 由國人程式員蕭明于 2017 年開源,到現在已經 4 年多了,看了下 Star 數已經超過 4.7k+ 了:

Knife4j 還獲得了 GVP 項目稱号,即 Gitee 最有價值的開源項目,并且我發現現在越來越多的開源項目都在使用它,Swagger UI 可以扔掉了。。
官網位址:
https://doc.xiaominfo.com/knife4j/ 開源位址: https://gitee.com/xiaoym/knife4jKnife4j 界面賞鑒
Knife4j 采用了 Vue + And Design Vue 元件進行重寫,相關界面拿出來供大家賞鑒。
接口文檔顯示界面:
knife4j 果然非常強大,整個界面基于左右菜單式的布局方式,支援多标簽同時打開展示、切換,文檔和調試也更清晰,感覺更符合國人的操作習慣吧。。
Knife4j 實戰
knife4j 目前主要支援以 Java 開發為主,并且支援 Spring MVC、Spring Boot、Spring Cloud 架構的內建使用。
本文棧長就以 Spring Boot 為基礎實戰下吧:
Spring Boot 2.5.0
Knife4j 2.0.9
Maven 3.6.3
JDK 1.8
注意: 使用 Knife4j 2.0.6+ 版本,Spring Boot 的版本要求 2.2.x+
1、Knife4j 依賴引入
/**
* Knife4j 配置類
* 來源微信公衆号:Java技術棧
* 作者:棧長
*/
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
@Bean(value = "defaultDocket")
public Docket defaultDocket() {
// 聯系人資訊
Contact contact = new Contact("公衆号:Java技術棧", "https://www.javastack.cn", "[email protected]");
// 建立 Docket
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
.title("Knife4j 測試")
.description("Knife4j Test")
.termsOfServiceUrl("https://www.javastack.cn")
.contact(contact)
.version("1.0")
.build())
.groupName("1.x")
.select()
.apis(RequestHandlerSelectors.basePackage("cn.javastack.springboot.knife4j.api"))
.paths(PathSelectors.any())
.build();
return docket;
}
}
Spring Boot 基礎就不介紹了,送你一份《Spring Boot 學習筆記》,高清理論+實戰版,照着學習,沒有不會的,最新版正在努力更新中,可以持續關注公衆号 Java技術棧,會第一時間分享給大家。
3、新增測試接口
新增兩個測試接口,一個登入(POST),一個問好(GET)。
/**
* Knife4j 測試接口
* 來源微信公衆号:Java技術棧
* 作者:棧長
*/
@Api(tags = "測試子產品")
@RestController
public class Knife4jController {
/**
* Knife4j 測試接口問好
* 來源微信公衆号:Java技術棧
* 作者:棧長
*/
@ApiImplicitParam(name = "name", value = "名稱", required = true)
@ApiOperation(value = "公衆号Java技術棧向你問好!")
@ApiOperationSupport(order = 2, author = "棧長")
@GetMapping("/knife4j/hi")
public ResponseEntity<String> hello(@RequestParam(value = "name") String name) {
return ResponseEntity.ok("Hi:" + name);
}
/**
* Knife4j 測試接口登入
* 來源微信公衆号:Java技術棧
* 作者:棧長
*/
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "使用者名", required = true),
@ApiImplicitParam(name = "password", value = "密碼", required = true)
})
@ApiOperation(value = "接口登入!")
@ApiOperationSupport(order = 1, author = "棧長")
@PostMapping("/knife4j/login")
public ResponseEntity<String> login(@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password) {
if (StringUtils.isNotBlank(username) && "javastack".equals(password)) {
return ResponseEntity.ok("登入成功:" + username);
}
return ResponseEntity.ok("使用者名或者密碼有誤:" + username);
}
}
上面為了支援接口順序和接口作者,使用了 Knife4j 的 @ApiOperationSupport 注解,其他的均為 Swagger 自帶的注解,從該目錄下看還支援下面的注解:
更多可去官網進行學習。
完整的 Demo 代碼就不一一帖了,本節教程所有實戰源碼已上傳到這個倉庫:
https://github.com/javastacks/spring-boot-best-practice4、Knife4j 測試
啟動應用,打開 Knife4j 文檔頁:
http://localhost:8080/doc.html
首頁會顯示一些已經配置好的文檔參數及接口統計資訊,并且在首頁子產品菜單中也看到了我們的測試子產品的兩個接口。
接口文檔:
調試一下:
這裡棧長使用了接口排序、還有接口作者功能,另外還支援分組排序、自定義文檔、Swagger 資源保護、導出 Markdown、參數緩存等衆多強大功能,增強功能多達 29 項,有興趣的可以自行嘗試...
總結
好了,今天棧長給大家介紹了國人程式員開源的一款 Knife4j 項目,也就是 Swagger 的增強版,毫無疑問要比 Swagger UI 更強大,更好用,也符合國人的習慣!
如果你也在使用 Swagger,可以考慮使用 Knife4j,它不僅有更強大的 UI,更有多達 29 項的增強功能,它們并不是替代關系,就像 Mybatis Plus 和 Mybatis 的關系一樣,它能助你更進一步提高開發生産力。
如果你也在使用 Knife4j,歡迎留言分享哦!
本節教程所有實戰源碼已上傳到這個倉庫:
好了,今天的分享就到這裡了,後面棧長會分享更多好玩的 Java 技術和最新的技術資訊,關注公衆号Java技術棧第一時間推送,我也将主流 Java 面試題和參考答案都整理好了,在公衆号背景回複關鍵字 "面試" 進行刷題。
最後,覺得我的文章對你用收獲的話,動動小手,給個在看、轉發,原創不易,棧長需要你的鼓勵。