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

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

目前我在写一个简单的 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

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

    8117 引用 • 37019 回帖 • 160 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • Ever
    作者

    感谢 d 大的回复, ₍₍ ◝(・ω・)◟ ⁾⁾大致的功能和实现思路我都有的,就是有些地方细节想自己封装好,你说的这些我都明白的。

  • 其他回帖
  • Eddie

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

    1 回复
  • wuhongxu

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

  • 88250

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

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

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

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

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

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

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

    2 回复
  • 查看全部回帖

推荐标签 标签

  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖
  • OnlyOffice
    4 引用 • 3 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 48 关注
  • Mobi.css

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

    1 引用 • 6 回帖 • 733 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    77 引用 • 390 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 633 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • Kubernetes

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

    110 引用 • 54 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖 • 1 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1513 回帖
  • 开源

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

    408 引用 • 3574 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    222 引用 • 473 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    26 引用 • 84 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    90 引用 • 899 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 629 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 641 关注