天天看點

Touch 方法&屬性 映射工具Touch 方法&屬性 映射工具(0.5 版本)

标簽 : 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&lt;T&gt;</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&lt;String, String&gt; config)</code>方法, 建立<code>TouchSwitcher</code>執行個體時調用(且隻調用一次), 将在touch.xml <code>&lt;switch&gt; &lt;config .../&gt; &lt;switch&gt;</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小時後失效, 解決頻繁通路&amp;頻繁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 方法&amp;amp;屬性 映射工具Touch 方法&amp;屬性 映射工具(0.5 版本)

這樣, 你就可以愉快的touch一把:

Touch 方法&amp;amp;屬性 映射工具Touch 方法&amp;屬性 映射工具(0.5 版本)
注: - 從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 -&gt; 八種Java基礎及包裝類型

String -&gt; String

String -&gt; Date(“yyyy-MM-DD HH:MM:SS”)

String -&gt; List

String -&gt; Set

String -&gt; Map

Touch開放了<code>TouchSwitcher</code>接口來提高touch接口的安全性:

如果想實作自己的安全過濾規則, 可參考<code>ZookeeperSwitcher</code>(基于Zookeeper).

在浏覽器通路:

即可映射&amp;修改&amp;擷取屬性值.

Touch目前版本擷取方法參數名是從JVM的MethodArea用javassist擷取, 其性能很難估計, 如果将來我們需要提升性能, 可以添加類似MyBatis的<code>@Param</code>注解, 但這種方式會增加使用者使用的負擔(畢竟需要多添加一個注解…).

在有了<code>@Param</code>注解後, 就可以可以參考Spring MVC的<code>@RequestParam</code>:

Touch 方法&amp;amp;屬性 映射工具Touch 方法&amp;屬性 映射工具(0.5 版本)

作出更強大的功能(如參數預設值、參數别名、類型校驗等).

我們的目标是将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>