前言
最近在看spring-boot框架的原始碼,看了原始碼之後更是讓我感受到了spring-boot功能的強大。而且使用了很多的設計模式,讓人在看的時候覺得有點難以下手。
不過仔細瞭解了一段時候發現,其實他的原理是很簡單的,所以想要自己也動手實現一個功能類似的框架。一方面可以讓自己在細節部分了解更深入,另一方面也可以給其他和我一樣想要了解spring-boot原理,但是卻被他複雜的設計模式嚇到的人提供一些參考。
當然自己動手確實很難做到和spring-boot那樣強大的功能,而且也為了避免過於使用設計模式而造成程式碼變得繁雜,我簡化了很多過程和功能,使得主要的實現思想更容易得到理解。
本文會一步步講解這個框架的實現過程,同時也會提及一些spring中經典的程式碼或者問題。
框架程式碼已經完成,如果不想看文章的話可以直接看我的專案程式碼,GitHub:doodle
主要實現功能:
- Bean容器
- IOC
- AOP
- MVC
目錄
- 從零開始實現一個簡易的Java MVC框架(一)--前言
- 從零開始實現一個簡易的Java MVC框架(二)--實現Bean容器
- 從零開始實現一個簡易的Java MVC框架(三)--實現IOC
- 從零開始實現一個簡易的Java MVC框架(四)--實現AOP
- 從零開始實現一個簡易的Java MVC框架(五)--引入aspectj實現AOP切點
- 從零開始實現一個簡易的Java MVC框架(六)--加強AOP功能
- 從零開始實現一個簡易的Java MVC框架(七)--實現MVC
- 從零開始實現一個簡易的Java MVC框架(八)--製作Starter
- 從零開始實現一個簡易的Java MVC框架(九)--優化MVC程式碼
框架成果
我們直接看一下完成之後的效果吧。
package com.sample.controller;
import ...
@Controller
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ModelAndView getUserList() {
List<User> list = userService.getUser();
return new ModelAndView().setView("user_list.jsp").addObject("list", list);
}
@RequestMapping(value = "/detail", method = RequestMethod.GET)
public ModelAndView getUser(@RequestParam(value = "id") long id) {
User user = userService.getUserById(id);
return new ModelAndView().setView("user_detail.jsp").addObject("user", user);
}
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
public Result<User> addUser(@RequestParam(value = "name") String name) {
User user = userService.addUser(name);
return new Result<>(user, 0, "");
}
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public Result<String> deleteUser(@RequestParam(value = "id") long id) {
userService.deleteUser(id);
return new Result<>("success", 0, "");
}
}
複製程式碼
看UserController這個類不知道的以為這是一個spring-boot專案,但是這個確實沒有引用spring,而是自己實現的框架。再通過我們的starter就可以啟動內建的tomcat的伺服器,訪問我們的網站了。這一切都和spring-boot相似
package com.sample;
import ...
public class App {
public static void main(String[] args) {
Doodle.run(App.class);
}
}
複製程式碼
接下來幾篇就會講解這個框架是如何實現的。
結語
本專案不僅參考了spring-boot,同時還參考了:
這些都是國人寫的更輕量而且也很優秀的框架,相比spring-boot來說閱讀原始碼的難度會小一些。感謝這些框架給我提供學習的思路,同時給我們更多的選擇。