最近在看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類似服務器
package com.sample; import ... public class App { public static void main(String[] args) { Doodle.run(App.class); } }
接下來幾篇就會講解這個框架是如何實現的。app
本項目不只參考了spring-boot,同時還參考了:框架
這些都是國人寫的更輕量並且也很優秀的框架,相比spring-boot來講閱讀源碼的難度會小一些。感謝這些框架給我提供學習的思路,同時給咱們更多的選擇。jsp