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 参与。
最后贴下项目地址: