标簽 : github
線上後門與接口調試: 原先需要測試一個接口(如Dubbo、DAO), 或為線上留後門, 需要寫大量的Web層(Api、Servlet或Controller)代碼并在浏覽器觸發, 進而調用到實際想要執行的方法或想檢視的屬性, 而有了Touch後, 你可以專注于業務功能的實作, 而不需要再書寫這些跟業務無關的觸發代碼.
Touch的第一個釋出版本
接口映射最核心功能
基于Web.xml的配置: 類掃描Touch
<code>@Touch</code>的<code>touchPattern</code>屬性提供Touch别名
第一版<code>com.vdian.touch.converter.Converter</code>
<code>@TouchArg</code>注解擷取參數泛型類型
增加Switcher接口, 增加線上環境安全校驗
Converter 添加@TouchArg參數
增加Converter與Switcher的預設綁定
fix 空QueryString bug
fix 重載函數定位不準 bug
增加包掃描功能, 精簡web.xml内關于Touch的配置
增加ZookeeperSwitcher實作, 提供基于ZK叢集的Touch安全控制
增加<code>lists.do</code> 接口提供擷取touch context内容
fix fastjson循環引用 bug
0.3.0
删除<code>@TouchArg</code>注解, 動态擷取泛型參數類型
0.3.1 版本: 提高響應速度的同時降低記憶體占用
init時緩存方法參數名、參數類型、參數泛型類型, 加速參數映射速度
使用WeakHashMap替換HashMap存儲TouchContext, 占用的記憶體随GC而釋放, 再次調用時重新init.
3.2 版本
更新<code>Converter<T></code>接口, 添加<code>Type[] actualTypes</code>參數代表泛型真實類型, 非泛型參數為<code>null</code>;
0.4.0
将<code>@Touch</code>從annotation包内移出, 直接放在<code>com.vdian.touch</code>包下
棄用web.xml配置, 使用Servlet 3.0 api實作<code>OnTouchServlet</code>自動注冊(預設攔截<code>/touch/*</code>目錄URL).
将配置集中放入touch.xml(classpath下)中, 并新增touch.xsd限制(已經放如touch.jar包内), 書寫touch.xml可實作代碼提示.
更新<code>TouchSwitcher</code>接口, 添加<code>init(Map<String, String> config)</code>方法, 建立<code>TouchSwitcher</code>執行個體時調用(且隻調用一次), 将在touch.xml <code><switch> <config .../> <switch></code>标簽内容傳入<code>init()</code>.
更新<code>ZookeeperSwitcher</code>實作, 支援自定義指定ZK叢集.
fix Bean被AOP代理後找不到的Bug(但目前還不能支援Bean被JDK的同時對Bean Alias的情況).
fix jaxp-dom讀取注釋的bug
0.4.1
使用GuavaCache替換WeakHashMap, 使key在不活躍1小時後失效, 解決頻繁通路&頻繁GC的問題.
fix json字元串無法反序列化為String的問題
fix 應用占用lists.do(列印所有touchPattern)的問題
0.5.0
去掉<code>loadOnStartup</code>, Touch不再随應用啟動而初始化, 改為第一次通路時初始化;
将<code>@Touch</code>移植到<code>filed</code>上, 支援成員變量映射(預計12月中旬釋出);
fix 同名<code>touchPattern</code> bug;
接下來到2017年不會再有大版本的更新, 而緻力于使Touch更加穩定, 提供更高性能, 适用更多項目類型.
注意: touch.xml隻需放在項目classpath下即可, Touch會自動去到classpath目錄下掃描該檔案, 不必被Spring托管.
為想要touch的方法打上<code>@Touch</code>注解, 馬上她就屬于你啦:

這樣, 你就可以愉快的touch一把:
注: - 從0.4版本開始棄用web.xml配置, 啟用Servlet 3.0 api, OnTouchServlet自動注冊到Servlet容器内. - 從0.2版本開始Touch不再支援on_touch_class配置, 全面換成包掃描packages . - 使用Touch的Servlet自動注冊需要在項目中啟用Servlet 3.0(web.xml頭更新成如下即可, 否則還是需要像以前一樣手動注冊, 見注釋), 且保證項目内Servlet-api已達到3.0及以上版本(Touch的pom已經引入, 但要防止被其他配置沖掉).
<code>@Touch</code>注解内提供了<code>touchPattern</code>參數用于區分重載方法, 但要注意<code>touchPattern</code>要和浏覽器内的URI(如前面的<code>constumObject</code>)對應起來.
參數映射
我們預設使用json與方法參數一一映射, 外層json的key為方法參數名.
自定義Converter
<code>Converter</code>大部分情況下是不用配的, Touch預設為我們綁定了很多類型:
String -> 八種Java基礎及包裝類型
String -> String
String -> Date(“yyyy-MM-DD HH:MM:SS”)
String -> List
String -> Set
String -> Map
Touch開放了<code>TouchSwitcher</code>接口來提高touch接口的安全性:
如果想實作自己的安全過濾規則, 可參考<code>ZookeeperSwitcher</code>(基于Zookeeper).
在浏覽器通路:
即可映射&修改&擷取屬性值.
Touch目前版本擷取方法參數名是從JVM的MethodArea用javassist擷取, 其性能很難估計, 如果将來我們需要提升性能, 可以添加類似MyBatis的<code>@Param</code>注解, 但這種方式會增加使用者使用的負擔(畢竟需要多添加一個注解…).
在有了<code>@Param</code>注解後, 就可以可以參考Spring MVC的<code>@RequestParam</code>:
作出更強大的功能(如參數預設值、參數别名、類型校驗等).
我們的目标是将Touch做到完善、簡潔且高性能, 這樣就可以用作一個通用的RPC轉HTTP的工具, 我們隻需編寫業務代碼, 把想要開放http調用的方法前添加<code>@Touch</code>注解, 不需再使用Web層代碼對Service做一層包裝.
Javassist擷取位元組碼代碼主要參考一下兩篇文章:
<a href="http://lzxz1234.github.io/java/2014/07/25/Get-Method-Parameter-Names-With-Javassist.html">用 Javassist 擷取方法參數名</a>
<a href="http://www.cnblogs.com/hucn/p/3636912.html">Java動态程式設計初探——Javassist</a>
動态擷取泛型參數可以參考
<a href="http://blog.csdn.net/zjf280441589/article/details/50453776">Java 反射 (by 翡青)</a>