徐昊 · TDD 项目实战 70 讲
徐昊
Thoughtworks 中国区 CTO
18159 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已完结/共 88 讲
实战项目二|RESTful开发框架:依赖注入容器 (24讲)
实战项目三|RESTful Web Services (44讲)
徐昊 · TDD 项目实战 70 讲
15
15
1.0x
00:00/00:00
登录|注册

38|RESTful Web Services(2):根据Spike的结果,要如何调整架构愿景?

你好,我是徐昊。今天我们继续使用 TDD 的方式实现 RESTful Web Services。
在上节课,我们通过 Spike 实现了一个非常简略的版本,可以通过 Root Resource 以及对应的方法处理请求,并使用 MessageBodyWriter 扩展点,将内容写入 Http 响应中。代码如下:
static class ResourceServlet extends HttpServlet {
private Application application;
private Providers providers;
public ResourceServlet(Application application, Providers providers) {
this.application = application;
this.providers = providers;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Stream<Class<?>> rootResources = application.getClasses().stream().filter(c -> c.isAnnotationPresent(Path.class));
Object result = dispatch(req, rootResources);
MessageBodyWriter<Object> writer = (MessageBodyWriter<Object>) providers.getMessageBodyWriter(result.getClass(), null, null, null);
writer.writeTo(result, null, null, null, null, null, resp.getOutputStream());
}
Object dispatch(HttpServletRequest req, Stream<Class<?>> rootResources) {
try {
Class<?> rootClass = rootResources.findFirst().get();
Object rootResource = rootClass.getConstructor().newInstance();
Method method = Arrays.stream(rootClass.getMethods()).filter(m -> m.isAnnotationPresent(GET.class)).findFirst().get();
return method.invoke(rootResource);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
在这个 Spike 的基础上,我们可以进一步细化架构的愿景:
通过结合 JAX-RS 的 Application 和 Providers,我们大致清楚了 ResourceServlet 如何使用 Application 和 Providers,以及大致在什么地方需要使用依赖注入容器。
说到依赖注入,在 JAX-RS 中存在两种依赖注入:对于 Application Scope 的 Inject 注入,以及对于 Request Scope 的 Context 注入。这仍然是不太清晰的部分,我们需要进一步 Spike:
00:00 / 00:00
    1.0x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00

    思考题

    根据 Spike 的结果,接下来要如何进一步调整架构愿景?
    欢迎把你的想法分享在留言区,也欢迎把你的项目代码分享出来。相信经过你的思考与实操,学习效果会更好!
    确认放弃笔记?
    放弃后所记笔记将不保留。
    新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
    批量公开的笔记不会为你同步至部落
    公开
    同步至部落
    取消
    完成
    0/2000
    荧光笔
    直线
    曲线
    笔记
    复制
    AI
    • 深入了解
    • 翻译
      • 英语
      • 中文简体
      • 中文繁体
      • 法语
      • 德语
      • 日语
      • 韩语
      • 俄语
      • 西班牙语
      • 阿拉伯语
    • 解释
    • 总结

    本文介绍了使用TDD的方式实现RESTful Web Services的过程。作者通过Spike实现了一个简略的版本,展示了如何通过Root Resource以及对应的方法处理请求,并使用MessageBodyWriter扩展点将内容写入Http响应中。在此基础上,作者进一步细化了架构的愿景,结合JAX-RS的Application和Providers,明确了ResourceServlet如何使用Application和Providers,以及在何处需要使用依赖注入容器。文章还提到了JAX-RS中存在的两种依赖注入:对于Application Scope的Inject注入,以及对于Request Scope的Context注入。作者鼓励读者根据Spike的结果,进一步调整架构愿景,并欢迎分享想法和项目代码。整体而言,本文通过实际代码和架构讨论,引导读者思考如何使用TDD和JAX-RS实现RESTful Web Services,并提供了进一步调整架构愿景的思路。

    仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
    《徐昊 · TDD 项目实战 70 讲》
    新⼈⾸单¥98
    立即购买
    登录 后留言

    全部留言(3)

    • 最新
    • 精选
    • aoe
      问题一:gradle 如何引入子模块 答:implementation(project(':container'))。参考专栏 《程序员的测试课》| 01 | 实战:实现一个 ToDo 的应用(上)中的项目 https://github.com/dreamhead/geektime-todo。在 GitHub 中打开后按.(句号)可以切换到在线 VsCode,方便查阅代码 问题二:之前 di-container 中没有这个方法 config.component(wirteClass, wirteClass) (视频 03:53)也没有之后出现的 config.from 方法。 答:35课,老师对代码做了重构,只贴了代码,没有视频。(感谢完美的红国王解答)
      2022-06-11
      2
    • 张铁林
      https://github.com/vfbiby/tdd-restful 把之前的代码移到restful子模块,再引用了前面一个兄弟的di container作为git submodule,直接完成了这一节,手册也在里面了。多次提交,如果不会子模块的,可以参考一下。
      2022-06-17
      1
    • 张铁林
      我再贡献一个情况,之前di-container项目没有加任何包名,就是放在java下面,在融合后,默认找不到ContextCofnig,给di-container加一个包名后,就能引入了。
      2022-06-17
      1
    收起评论
    显示
    设置
    留言
    3
    收藏
    沉浸
    阅读
    分享
    手机端
    快捷键
    回顶部