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

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

目前我在写一个简单的 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • 框架
    47 引用 • 346 回帖 • 1 关注
  • 反射
    18 引用 • 29 回帖
  • Q&A

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

    6541 引用 • 29403 回帖 • 245 关注

相关帖子

欢迎来到这里!

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

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

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

  • 其他回帖
  • wuhongxu

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

  • Ever
    作者

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

  • 88250

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

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

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

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

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

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

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

    2 回复
  • 查看全部回帖

推荐标签 标签

  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 28 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    27 引用 • 66 回帖
  • 开源

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

    396 引用 • 3416 回帖
  • ZeroNet

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

    1 引用 • 21 回帖 • 590 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • abitmean

    有点意思就行了

    22 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 684 关注
  • 阿里云

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

    89 引用 • 345 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 426 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 8 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 93 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1425 引用 • 10043 回帖 • 469 关注
  • Kubernetes

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

    108 引用 • 54 回帖 • 1 关注
  • InfluxDB

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

    2 引用 • 55 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 449 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖 • 2 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 350 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 460 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 21 关注
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    60 引用 • 287 回帖
  • 爬虫

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

    106 引用 • 275 回帖
  • Markdown

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

    163 引用 • 1450 回帖