手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...

JavaGuide 2020-11-13 10:05:12
http 框架 一个 支持 sprng


https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架

距离上一次给小伙伴们汇报简易版的“Spring Boot”的完成情况已经有半个月了。时间过得是真特么快啊!

01

这半个月里,我的 HTTP 框架已经支持 AOP、拦截器(也是 AOP 的一种)、属性文件读取等功能了。

目前的话,整个 HTTP 框架基本已经具备我最初想要实现的全部功能了。也算是兑现了诺言,善始善终了。

功能具体的实现情况如下:

很多读者小伙伴可能感觉我写的比较容易。不过, 说实话,我中间写的过程中也遇到了很多问题。为了解决写这个框架遇到的一些问题,我熬了很多夜,也早起了很多次。

我不算是奋青。一般情况下,我平时都是晚上 9 点半之后玩几把王者荣耀,到了 12 点左右就睡觉了。早晨的话,我一般都是 8 点左右起床。几乎日日如此。

但是,写这个 HTTP 框架的时候,我记得有 3 次我熬夜到凌晨 2 点左右。有 2 个早晨,因为有“灵感”,我 5 点多久爬起来写代码了。

说这些,不是为了博同情让大家觉得我写的多辛苦,也不是表现我有多努力。

这些都是很平常的经历罢了!我觉得大部分程序员都经历过:

  • 夜深人静的时候,突然自己写的代码出了点问题,不解决就不想睡觉。
  • 某个早晨,突然惊醒,灵感爆棚,打开电脑开始写代码。

不过,我是真的不推荐大家熬夜!那我自己来说,每次熬夜就会导致我第二天甚至是第三天精神不振,严重影响效率。这还只是熬夜的短期影响,长期作息不健康的话,肯定对身体的摧残特别大。

道理都懂,不过,大部分都像我一样,还是会偶尔熬夜。

02

整个框架的目录结构如下:

  • 框架实现部分按照不同的功能模块进行组织,比较直观。
  • 提供了完整的框架使用示例,并且还为其编写了测试。

03

开源的魅力在于别人可以对你的项目进行反馈,并且,遇到对你的项目感兴趣的朋友,他们还会帮你一起完善和开发项目。

拿 jsoncat 来说。jsoncat 开源之后,一位叫做“hellohello-tom”的老哥便参与了进来帮忙开发。

tom 哥代码写的很不错,帮助 jsoncat 实现了很多功能!真的非常非常非常感谢!爱你哦!老哥!

我俩因为这个项目经常在微信上交流,或许这就是编程的魅力吧!哈哈哈!

我平时少在微信聊天的,但是因为这个开源项目和老哥聊了挺多的。

随便截了两张图:

我觉得一个项目开发是比较忌讳只有自己一个人的。每个人都会有思维局限,你很难发现你的代码需要某些改进的地方以及存在的问题。

这也解释了为什么 Code Review(代码审查)在软件开发过程中这么重要了。

通过 Code Review 可以非常有效提高代码的整体质量,因为它会帮助我们发现代码中的坏味道以及可能存在问题的地方。

04

其实,单纯实现功能的话费不了太多时间。大部分时间,我都花在了对现有代码的重构上。

毕竟我这个 HTTP 框架开源出来的主要目的之一是为了给需要的小伙伴学学习,我必须要保证我写的代码可读性。​

为此,我在写代码的过程中给自己定了以下原则:

  1. 一切从简 :能用最少的代码写清楚的功能就一定不多用一行代码。
  2. 不滥用设计模式 :我最初写代码的时候,特别喜欢滥用设计模式。自己学到了什么设计模式,就像立马用到自己的项目上去,即使这个设计模式在当前业务场景并不适合。这真的是一个不好的习惯,不过,在写这个 HTTP 框架的时候我刻意避免了这个问题。 目前的话,整个框架只用到了单例模式、工厂模式、策略模式以及责任链模式。
  3. 保持代码结构清晰 : 开源出来的代码是写给人看的,代码结构清晰可以大大减少其他人理解代码的难度。
  4. 谨慎抽取工具类 :最开始写这个框架的时候,我抽了很多工具类。到最后发现很多工具类中的方法,实际只在某一个地方用到,并且以后也只可能会在这一个地方用到。这个时候,我觉得最好的做法就是,将这些工具类方法放到唯一一个用到这个方法的类中。这样整体代码结构会更加清晰。
  5. 不秀技 :最开始写代码的时候,特别喜欢秀技。比如说 Java8 那会还没流行的时候,我写代码总想着用 Java 8 的 Lambda 表达式、函数式接口等新特性。那时候,和老师一起做项目的时候,其他同学还会觉得我写的特别牛逼,因为他们觉得自己很久才能看懂。但是,我现在觉得当时的做法其实有别软件开发/编程的本质,编程的本质不是说减少代码量,而是说写出他人易于理解的代码,写出更容易维护的系统。你写的代码不单纯是给你自己看的,你还要让别人看懂,减少别人的阅读学习成本。这个和我第一点说的一切从简是不矛盾的。

今天就简单聊聊这些吧!时间也不早了!

我的开源项目推荐

  1. JavaGuide :「Java学习+面试指南」一份涵盖大部分Java程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
  2. guide-rpc-framework :A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基于 Netty+Kyro+Zookeeper 实现的自定义 RPC 框架-附详细实现过程和相关教程)
  3. jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架
  4. programmer-advancement :程序员应该有的一些好习惯+面试必知事项!
  5. springboot-guide :Not only Spring Boot but also important knowledge of Spring(不只是SpringBoot还有Spring重要知识点)
  6. awesome-java :Collection of awesome Java project on Github(Github 上非常棒的 Java 开源项目集合).
版权声明
本文为[JavaGuide]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_34337272/article/details/109234843

  1. [front end -- JavaScript] knowledge point (IV) -- memory leakage in the project (I)
  2. This mechanism in JS
  3. Vue 3.0 source code learning 1 --- rendering process of components
  4. Learning the realization of canvas and simple drawing
  5. gin里获取http请求过来的参数
  6. vue3的新特性
  7. Get the parameters from HTTP request in gin
  8. New features of vue3
  9. vue-cli 引入腾讯地图(最新 api,rocketmq原理面试
  10. Vue 学习笔记(3,免费Java高级工程师学习资源
  11. Vue 学习笔记(2,Java编程视频教程
  12. Vue cli introduces Tencent maps (the latest API, rocketmq)
  13. Vue learning notes (3, free Java senior engineer learning resources)
  14. Vue learning notes (2, Java programming video tutorial)
  15. 【Vue】—props属性
  16. 【Vue】—创建组件
  17. [Vue] - props attribute
  18. [Vue] - create component
  19. 浅谈vue响应式原理及发布订阅模式和观察者模式
  20. On Vue responsive principle, publish subscribe mode and observer mode
  21. 浅谈vue响应式原理及发布订阅模式和观察者模式
  22. On Vue responsive principle, publish subscribe mode and observer mode
  23. Xiaobai can understand it. It only takes 4 steps to solve the problem of Vue keep alive cache component
  24. Publish, subscribe and observer of design patterns
  25. Summary of common content added in ES6 + (II)
  26. No.8 Vue element admin learning (III) vuex learning and login method analysis
  27. Write a mini webpack project construction tool
  28. Shopping cart (front-end static page preparation)
  29. Introduction to the fluent platform
  30. Webpack5 cache
  31. The difference between drop-down box select option and datalist
  32. CSS review (III)
  33. Node.js学习笔记【七】
  34. Node.js learning notes [VII]
  35. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  36. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  37. 【JQuery框架,Java编程教程视频下载
  38. [jQuery framework, Java programming tutorial video download
  39. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  40. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  41. 【Vue,阿里P8大佬亲自教你
  42. 【Vue基础知识总结 5,字节跳动算法工程师面试经验
  43. [Vue, Ali P8 teaches you personally
  44. [Vue basic knowledge summary 5. Interview experience of byte beating Algorithm Engineer
  45. 【问题记录】- 谷歌浏览器 Html生成PDF
  46. [problem record] - PDF generated by Google browser HTML
  47. 【问题记录】- 谷歌浏览器 Html生成PDF
  48. [problem record] - PDF generated by Google browser HTML
  49. 【JavaScript】查漏补缺 —数组中reduce()方法
  50. [JavaScript] leak checking and defect filling - reduce() method in array
  51. 【重识 HTML (3),350道Java面试真题分享
  52. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  53. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  54. [re recognize HTML (3) and share 350 real Java interview questions
  55. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  56. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  57. 【重识 HTML ,nginx面试题阿里
  58. 【重识 HTML (4),ELK原来这么简单
  59. [re recognize HTML, nginx interview questions]
  60. [re recognize HTML (4). Elk is so simple