聊一下簡易版的“Spring Boot”寫的咋樣了
本文轉載自微信公眾號「JavaGuide」,作者Guide哥 。轉載本文請聯系JavaGuide公眾號。
昨天早上,6 點多一點就起來寫代碼了,前天晚上和朋友一起吃晚飯回來之后也搞到很晚,有時候想盡快把某些東西寫完的時候確實是會這樣。
但是,說實話效率會降低很多,不推薦這樣做。像我之前寫guide-rpc-framework[1] 的時候,經常周末不出門,一坐就是一天。到了晚上整個人一臉油,眼睛還很酸,效率低了太多。
目前的話,已經把 Spring MVC 相關常用的注解比如@GetMapping 、@PostMapping 、@PathVariable 寫完了。
整個項目的目錄結構如下,還算比較清晰。我也已經將項目開源出來了,地址:https://github.com/Snailclimb/jsoncat 。原創開源不易,覺得不錯的話,歡迎給良心作者 1 個 star 鼓勵一下!
介紹
jsoncat 是我(Guide 哥,Gai 的哥)模仿 Spring Boot 寫的一個輕量級的 HTTP 框架。
jsoncat 內置由 Netty 編寫 HTTP 服務器,無需額外依賴 Tomcat 之類的 web 服務器。使用 Netty 幾十行代碼即可實現一個簡易的 HTTP 服務,性能高且輕量。
為什么要寫?
寫這個東西只是自己個人的興趣愛好使然,也不是說非要拿到項目上實際去使用,主要目的還是為了提高自己的編碼能力。推薦小伙伴們也要盡量能夠將自己的想法付諸于行動。
理論知識固然重要,但是脫離于實踐的理論并不可靠。相比于 CRUD ,自己造個輪子,肯定是更有意思,也更能鍛煉自己的編程能力和解決問題的能力。
特點
1.內置由 Netty 編寫 HTTP 服務器,無需額外依賴 Tomcat 之類的 web 服務
2.代碼簡潔,可讀性好
3.支持 Spring MVC 常用的注解,用法也和 Spring MVC 一樣
4.后端只返回 json 數據給前端
5.集成了 checkstyle 、spotbugs、pmd 并設置了 commit 鉤子來保證代碼質量
框架基本情況和代辦
功能實現上,沒有太去模仿參考 Spring 的源碼,那樣的話沒太大必要,完全就是按照自己的想法寫的,會借鑒一些 Spring 源碼的思想。
功能其實寫的挺快的,大部分時間都在重構。講真, 我已經很盡力地保證代碼的可讀性了。盡量使用最少的代碼實現功能, 并且不影響可讀性。
目前,我還不是特別滿意,歡迎小伙伴們一起來完善啊!人多力量大!
功能演示
User.java :用戶實體類
- @Data
- @AllArgsConstructor
- public class User {
- private String name;
- private String des;
- private Integer age;
- }
UserDto.java : 創建用戶的傳輸對象
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class UserDto {
- private String name;
- private String des;
- private Integer age;
- }
UserController.java:用戶層 controller
- @RestController("/user")
- public class UserController {
- private static HashMap<Integer, User> users;
- private static Integer id;
- static {
- users = new HashMap<>();
- users.put(1, new User("蓋倫", "德瑪西亞", 22));
- id = 2;
- }
- @GetMapping
- public User get(@RequestParam("name") String name, @RequestParam("des") String des, @RequestParam("age") Integer age) {
- return new User(name, des, age);
- }
- @GetMapping("/{id}")
- public User get(@PathVariable("id") Integer id) {
- return users.get(id);
- }
- @PostMapping
- public List<User> create(@RequestBody UserDto userDto) {
- users.put(id++, new User(userDto.getName(), userDto.getDes(), userDto.getAge()));
- return new ArrayList<>(users.values());
- }
- }
Get 請求:@PathVariable傳參
Get 請求:@RequestParam傳參
Post 請求
請求錯誤的處理情況
當傳入的參數類型不正確時:
當指定的參數未傳遞時:
References
[1] guide-rpc-framework: https://github.com/Snailclimb/guide-rpc-framework