写框架的时候遇到的一个问题

本贴最后更新于 2132 天前,其中的信息可能已经时过境迁

目前我在写一个简单的 mvc 框架,然后因为想实现的好玩一点,就参考了 biezhi 大哥的 blade,注册路由的操作可以是这样的

public class ExampleApplication {
    public static void main(String[] args) {
        Reverie.up()
                .get("/get", ctx -> { ctx.response().end("你好"); })
        .start(ExampleApplication.class, args);
    }
}

因为用的 Vertx,所以注册路由的操作比较简单:

public void get(String path, RouteHandler routeHandler) {
     Vertx  vertx = Vertx.vertx();
     Router route = Router.router(vertx);
     //这一步就是注册路由的操作,routeHandler就是上面启动函数中的ctx
     route.route(HttpMethod.GET, path).handler(routeHandler);
     vertx.createHttpServer().requestHandler(route::accept).listen(8080);
}

目前我想做的就是,这个注册路由时的 handler 方法,传入的参数是 Handler,这个 RoutingContext 就是启动函数中的 ctx,我想自己重新定义一个 RouteContext,定义我自己的 api,比如,如果使用 RoutingContext,那么在 main 函数中返回一串文本就要这样写:

//RoutingContext
get("/get", ctx -> { ctx.response().end("你好"); })
//RouteContext,我自己定义的api为
get("/get", ctx -> { ctx.text("你好"); })

这是 RouteHandler 接口

@FunctionalInterface
public interface RouteHandler extends Handler<RoutingContext> {
    void handle(RoutingContext routingContext);
}

如果修改为:

@FunctionalInterface
public interface RouteHandler extends Handler<RouteContext> {
    void handle(RouteContext routingContext);
}

但是在注册路由处理器的时候,出现:

I96NKY40Y_D555ODHTX4Gpng
类型不匹配这种,我尝试过继承或者实现 RoutingContext,都没有效果,
handle 方法的入参要去为 Handler<RoutingContext> 类型的,试过不同办法,不知道该咋办了。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 框架
    47 引用 • 348 回帖 • 1 关注
  • 反射
    19 引用 • 29 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8128 引用 • 37051 回帖 • 160 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wuhongxu

    赞同,很可惜,没人这么教我,我花了几年时间才明白这个道理

  • 其他回帖
  • wuhongxu

    啊,我之前写 ioc 也是啊!话了好长时间用图来搞 ioc 的依赖模型。。。发现,还是 tm 的硬编码舒服,简单粗暴可定制型高,气哭惹

  • Eddie

    我记得大学的时候用树来做词法分析器,最后做好了,但是有些要求没有达到,被老师骂了一顿,他不管你有什么创新的地方,只管结果,原话是:我允许别人抄代码完成,只要说得通原理,你这连要求都没有达到,我怎么评分。

    1 回复
  • 88250

    可以考虑包装路由分发,内部实现还是 Vert.x,但这样做的话工作量可能有点大,相当于基于它包了一层。

    MVC 轮子有一部分很有意思的活儿就是路由分发,主要是:

    • API 设计:注解声明式、编程式,目标是平滑优美
    • 路由算法:性能
    • 中间件:迭代处理,分组,目标是易扩展
    • 错误处理:应用代码报错、内部报错等

    网络通信实现可以参考 Blade 用 Netty,也可以考虑向 Latke 那样包装 Servlet 模型。

    造轮子最有意思的情况是挖坑给自己跳,很多时候蹩脚的实现跑两天以后会推到重来。之前我写了个通过树结构来优化路由性能的算法,结果测试发现还没有看上去傻傻的硬编码快,一天后删了改用硬编码方式。路由算法这部分绕不开一个现实问题:查找 HTTP 方法 +URI 模板是 O(nm) 复杂度,如果一个应用注册了上千个 Controller,没有一个好的路由算法的话性能问题会很显著。

    我们造的 MVC 框架轮子说起来其实也很简单,因为真正的脏活累活或者有技术难度的部分都有其他开源项目来实现了,我们做的仅仅是非常贴近应用层的 API 堆砌。虽然如此,但其中还是很有乐趣的,因为轮子可以按自己期望的样子来,可以充分发挥想象力或者玩新酷的语言特性。

    扯远了。总之,希望你的轮子能早日落地跑起来 ❤️

    2 回复
  • 查看全部回帖

推荐标签 标签

  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    352 引用 • 1815 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 73 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 9 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3574 回帖 • 1 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 2 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 339 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 4 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖 • 3 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    179 引用 • 995 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 195 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 638 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 629 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 474 关注