最近在看spring-boot框架的源碼,看了源碼以後更是讓我感覺到了spring-boot功能的強大。並且使用了不少的設計模式,讓人在看的時候以爲有點難如下手。java
不過仔細瞭解了一段時候發現,其實他的原理是很簡單的,因此想要本身也動手實現一個功能相似的框架。一方面可讓本身在細節部分了解更深刻,另外一方面也能夠給其餘和我同樣想要了解spring-boot原理,可是卻被他複雜的設計模式嚇到的人提供一些參考。git
固然本身動手確實很難作到和spring-boot那樣強大的功能,並且也爲了不過於使用設計模式而形成代碼變得繁雜,我簡化了不少過程和功能,使得主要的實現思想更容易獲得理解。github
本文會一步步講解這個框架的實現過程,同時也會說起一些spring中經典的代碼或者問題。spring
框架代碼已經完成,若是不想看文章的話能夠直接看個人項目代碼,GitHub:doodle設計模式
主要實現功能:tomcat
咱們直接看一下完成以後的效果吧。服務器
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類似app
package com.sample;
import ...
public class App {
public static void main(String[] args) {
Doodle.run(App.class);
}
}
複製代碼
接下來幾篇就會講解這個框架是如何實現的。框架
本項目不只參考了spring-boot,同時還參考了:jsp
這些都是國人寫的更輕量並且也很優秀的框架,相比spring-boot來講閱讀源碼的難度會小一些。感謝這些框架給我提供學習的思路,同時給咱們更多的選擇。