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 开源项目集合).

我是 Guide 哥,一 Java 后端开发,会一点前端,自由的少年。我们下期再见!微信搜“JavaGuide”回复“面试突击”领取我整理的 4 本原创PDF

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

  1. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  2. AOP框架Dora.Interception 3.0 [3]: 拦截器设计

    对于所有的AOP框架来说,多个拦截器最终会应用到某个方法上.这些拦截器按照指定的顺序构成一个管道,管道的另一端就是针对目标方法的调用.从设计角度来将,拦截器和中间件本质是一样的,那么我们可以按照类似的 ...

  3. 99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!

    罗曼罗兰说过:世界上只有一种英雄主义,就是看清生活的真相之后依然热爱生活. 对于 Lombok 我相信大部分人都不陌生,但对于它的实现原理以及缺点却鲜为人知,而本文将会从 Lombok 的原理出发,手 ...

  4. java框架之SpringMVC(2)-补充及拦截器

    高级参数绑定 package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; i ...

  5. SpringMVC框架学习笔记(6)——拦截器

    SpringMVC拦截器需要实现接口HandlerInterceptor 有3个方法,分别在请求处理前.请求处理后和在DispatcherServlet处理后执行 实现代码: package inte ...

  6. 手撸了一个starter,同事直夸我666~

    Spring Boot starter原理 Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!st ...

  7. .NET MVC 插件化框架支持原生MVC的Area和路由特性

    前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribute等路由特性标签,按照先前的做法,无法解析插件的路由特性和Are ...

  8. 《Mybatis 手撸专栏》第9章:细化XML语句构建器,完善静态SQL解析

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你只是在解释过程,而他是在阐述高度! 如果不是长时间的沉淀.积累和储备,我一定也没有 ...

  9. 手把手写框架入门(一) | 核心拦截器DispatchFilter实现

    前言 1Filter实现框架拦截 1配置自定义Filter 2创建一个Filter 3创建一个ActionMapping 4创建一个ActionMapper 5创建一个WebExecutor 6创建测 ...

随机推荐

  1. hystrix文档翻译之如何使用

    Hello World! 使用HystrixCommand实现“Hello World”. public class CommandHelloWorld extends HystrixCommand& ...

  2. 2.Scala安装配置和使用

  3. OOCSS是什么,该如何用?

    1 OOCSS的定义: Object Oriented css(面向对象css)的缩写,是一种用最简单的方式编写的CSS代码,从而使代码 重用性,可维护性和可扩展性更好的书写方法.   2 OOCSS ...

  4. 搜索引擎学习(一)初识Lucene

    一.Lucene相关基础概念 定义:一个简易的工具包,实现文件搜索的功能,支持中文,关键字,多条件查询,凡是文件名或文件内容包含的都查出来. 数据分类:结构化数据(固定格式或有限长度的数据)和非结构化 ...

  5. 渗透测试方法论(qf总结)

    渗透测试(penetration testing , pentest)是实施安全评估(即审计)的具体手段.方法论是在指定.实施信息安全审计方案时,需要遵循的规则.惯例和过程.人们在评估网路.应用.系统 ...

  6. 基础篇:JAVA内部类的使用介绍

    目录 1 四种内部类 2 内部类的使用场景和优点 3 成员内部类 4 成员内部类的访问范围详解 5 静态内部类 6 局部内部类 7 匿名内部类 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 四 ...

  7. Python-获取等差数列

    获取等差数列思路 1. 通过range步长 2. 通过切片步长 # 通过 range series = [i for i in range(1, 101, 2)] print(series) # 通过 ...

  8. 《kubernetes + .net core 》dev ops部分

    目录 1.kubernetes 预备知识 1.1 集群资源 1.1.1 role 1.1.2 namespace 1.1.3 node 1.1.4 persistent volume 1.1.5 st ...

  9. 开源 C#工作流管理平台

    { font-family: 宋体; panose-1: 2 1 6 0 3 1 1 1 1 1 } @font-face { font-family: "Cambria Math" ...

  10. 网站搭建-云服务器ECS-镜像管理

    学习笔记: 快照,系统盘可创建镜像,数据盘不可以. 实例可以直接创建镜像,包括系统盘和数据盘 复制镜像: 新购服务器,选择镜像(又买). 共享镜像: 账号ID就是UID 云市场获取镜像; 1. 创建新 ...