「造个轮子」——cicada 源码分析(下)

简介: 本文就目前的 v1.0.1 版本来一起分析分析。
public interface Param extends Map<String, Object> {
    /**
     * get String
     * @param param
     * @return
     */
    String getString(String param);
    /**
     * get Integer
     * @param param
     * @return
     */
    Integer getInteger(String param);
    /**
     * get Long
     * @param param
     * @return
     */
    Long getLong(String param);
    /**
     * get Double
     * @param param
     * @return
     */
    Double getDouble(String param);
    /**
     * get Float
     * @param param
     * @return
     */
    Float getFloat(String param);
    /**
     * get Boolean
     * @param param
     * @return
     */
    Boolean getBoolean(String param) ;
}


其中封装了几种基本类型的获取方式。


同时在 buildParamMap() 方法中,将接口中的参数封装到这个 Map 中。


Param paramMap = buildParamMap(queryStringDecoder);



业务执行


最后只需要执行业务即可;由于在上文已经获取到业务类的类类型,所以这里通过反射即可调用。


同时也定义了一个业务类需要实现的一个通用接口 WorkAction,想要实现具体业务只要实现它就行。



而这里的方法参数自然就是刚才定义的参数接口 Param


由于所有的业务类都是实现了 WorkAction,所以在反射时都可以定义为 WorkAction 对象。


WorkAction action = (WorkAction) actionClazz.newInstance();
WorkRes execute = action.execute(paramMap);


最后将构建好的参数 map 传入即可。


响应返回


有了请求那自然也得有响应,观察刚才定义的 WorkAction 接口可以发现其实定义了一个 WorkRes 响应类。


所有的响应数据都需要封装到这个对象中。



这个没啥好说的,都是一些基本数据。


最后在 responseMsg() 方法中将响应数据编码为 JSON 输出即可。



拦截器设计


拦截器也是一个框架基本的功能,用处非常多。


cicada 的实现原理非常简单,就是在 WorkAction 接口执行业务逻辑之前调用一个方法、执行完毕之后调用另一个方法。


也是同样的思路需要定义一个接口 CicadaInterceptor,其中有两个方法。



看方法名字自然也能看出具体作用。



同时在这两个方法中执行具体的调用。


这里重点要看看 interceptorBefore 方法。



其中也是加入了一个缓存,尽量的减少反射操作。


适配器


就这样的拦截器接口是够用了,但并不是所有的业务都需要实现两个接口。


因此也提供了一个适配器 AbstractCicadaInterceptorAdapter



它作为一个抽象类实现了 CicadaInterceptor 接口,这样后续的拦截业务也可继承该接口选择性的实现方法即可。


类似于这样:



总结


v1.0.1 版本的 cicada 就介绍完毕了,其中的原理和源码都比较简单。


大量使用了反射和一些设计模式、多态等应用,这方面经验较少的朋友可以参考下。


同时也有很多不足;比如传参后续会考虑更加优雅的方式、拦截器目前写的比较死,后续会利用动态代理实现自定义拦截。


其实 cicada 只是利用周末两天时间做的,bug 肯定少不了;也欢迎大家在 GitHub 上提 issue 参与。


最后贴下项目地址:


github.com/TogetherOS/…



相关文章
|
5月前
|
前端开发 JavaScript 数据安全/隐私保护
我为什么还要造一个前端轮子?
该文档介绍了一个新的前端框架,创建原因是现有框架多关注技术实现,缺乏具体业务场景的应用。此框架基于vue-element-admin,采用VUE和ElementUI,提供了如账号密码登录、手机短信登录、注册、找回密码等实际业务功能模块。还包括图形验证码、机构选择等组件,支持子模块集成。附有截图预览,并提供了演示地址:[VUE前端开发框架演示](http://vue-template.dayuan.link/),用户可以体验完整功能,后端接口可替换。
面试官:小伙子我们先来唠唠并发编程的几大核心知识点
并发编程算是Java的一个难点,经常做业务相关的程序员基本上用不到juc的包,但是这些知识点十分重要,所以不管在哪里,时刻保持学习真的很重要。
|
存储 缓存 Java
面试官:让你设计一套图片加载框架,你会怎么设计?
很多同学在面试中都会被问到图片加载这块的知识。
|
消息中间件 运维 Dubbo
源码阅读的方法、误区以及三种境界
源码阅读的方法、误区以及三种境界
|
XML JSON 缓存
「造个轮子」——cicada 源码分析(上)
本文就目前的 v1.0.1 版本来一起分析分析。
|
缓存 Java API
「造个轮子」——cicada 设计一个配置模块(上)
在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。
|
缓存 容器
「造个轮子」——cicada 设计一个配置模块(下)
在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。
|
程序员 计算机视觉
造个‘’轮子‘’!只要掌握了这几点,你也可以撸一个写在简历上的轮子(附手撸过程)
我给我的独木轮命名为:SweetCode,意味着你每天写代码就和吃Sugar一样甜蜜,哎呀妈呀,简直不要不要的。他的官方文档长这样,目前我就写了一个模块,都是自己在工作中常用到的一些小工具类,自己整理起来也是方便自己以后复用。
756 0
造个‘’轮子‘’!只要掌握了这几点,你也可以撸一个写在简历上的轮子(附手撸过程)
|
设计模式 SQL 开发框架
学完这篇依赖注入,与面试官扯皮就没有问题了。
控制反转是一种在软件工程中解耦合的思想,调用方依赖接口或抽象类,减少了耦合,控制权交给了服务容器,由容器维护注册项,并将具体的实现动态注入到调用方。 有些人会把控制反转和依赖注入等同,实际上有本质区别: 控制反转是一种思想; 依赖注入是一种设计模式。 依赖注入是实现控制反转的一种方式,但是控制反转还有其他实现方式,例如说ServiceLocator,所以不能将控制反转和依赖注入等同。 在运行时,框架会解析依赖树、依赖图,通过反射在运行期生成对象。 阅读更多
学完这篇依赖注入,与面试官扯皮就没有问题了。
|
设计模式 Java
从头捋一遍Java项目中的五大设计原则,就不信你学不会!(中)
从头捋一遍Java项目中的五大设计原则,就不信你学不会!(中)
从头捋一遍Java项目中的五大设计原则,就不信你学不会!(中)