日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Aspectj 实现Method条件运行

發布時間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Aspectj 实现Method条件运行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 最近我花了半個小時實現了一個Method的按自定義條件運行的pluginCondition-Run 。實現場景是由于我所工作的客戶經常會是在同一個代碼集上實現多個Brand,所以有些功能只會限制是幾個brand調用,而其他的調用則不該調用。還有因為持續交互,我們會不停的release新的功能得到快速的反饋,在這前提下我們會經常遇見在我們剛開發完一個brand的產品代碼,就要面臨release,所以我們希望其不該對其他的brand產生影響。

? 面對這樣的需求初級程序員有些人肯定會覺得沒什么了不起的啊,不就是幾個if/else或者switch/case。我和我的團隊對代碼有一種天生的潔癖,對于太多復雜的if/elseswitch/case,以及將來會被移除的臨時非產品代碼分布在各處,有一種抵觸心理。

對于有一定工作經驗的程序員來說這樣的需求肯定也不是什么問題,不就是AOP(面向切面編程),對,這就是我們所期望的解決方案,把處理的邏輯集中,和產品代碼的分離。

知道了用AOP,也許你只對了一半,在AOP的世界里,有兩種實現方式靜態植入和動態代理,最早了AOP實現采用的是靜態植入,然后由于IOC之類的框架的興起,動態代理的實現方式也逐漸興起,取代了靜態植入的方式。但并不是說靜態植入的方式就不再有用武之地的,在這里我們所采用的AOP框架Aspectj就是一個靜態注入的框架,我們并沒有和spring結合,動態代理的方式有個基本的問題就是你不能直接new這個對象這需要交給框架處理,如果是spring框架的話,這要求你必須是一個springbean,以及動態代理會有一些性能的損失。這對于該場景的限制太多,并不是我所期望的。

靜態植入的框架在我以前的博客中也提到不少,如果感興趣請移步 《IOC/AOP隨筆目錄》。在java世界里Aspectj.net世界里PostSharp(博客中靜態植入原理分析篇《MSBuild + MSILInect實現編譯時AOP之預覽》)就是這類框架。

? ?回到主題,對于 condition-run如何使用請移步github文檔。

這里簡述如何實現:

1 對于AOP第一步是匹配規則,所以定義一個標記:

@Retention(RUNTIME)@Target({METHOD})public @interface ConditionRun {Class<? extends Runner> value();}

?

其指向一個實現Runner接口的類型。

2:有了匹配規則,我們就可以找到切入點進行AOP邏輯的處理,

?

@Aspectpublic class ConditionRunAspect {@Around("methodsToBeConditionRun(conditionRun)")public Object profile(ProceedingJoinPoint pjp, ConditionRun conditionRun) throws Throwable {final Result result = isExec(pjp, conditionRun);if (result.isExec()) {return pjp.proceed();}return result.getDefaultValue();}private Result isExec(ProceedingJoinPoint pjp, ConditionRun conditionRun) {try {final Runner runner = conditionRun.value().newInstance();final MethodSignature signature = (MethodSignature) pjp.getSignature();return runner.exec(signature, pjp.getArgs());} catch (Exception e) {throw new RuntimeException("Runner must be empty constructor and make sure the config is ok.", e);}}@Pointcut(value = "@annotation(conditionRun)")public void methodsToBeConditionRun(ConditionRun conditionRun) {}}

?

? 這里在切入方法調用之前,new了一個配置的Runner類型(注意必須午餐構造),并調用其exec方法獲取是否運行該方法,如果不運行則返回什么默認值。

Runner runner = conditionRun.value().newInstance();final MethodSignature signature = (MethodSignature) pjp.getSignature();return runner.exec(signature, pjp.getArgs());

?

exec的參數簽名為方法簽名信息和方法運行時參數。

? ? 一切都這么簡單,現在你可以任意的框架Runner去做適合你的場景業務了。可以參照項目下得sample實例,該實例展示了一個當出入參數為3的時候執行,部位3則返回默認值1.

? ?想想還有那些場景,你是否遇見過某類單元測試我只希望運行在某種固定的場景下?假設在開發圖形應用的時候,我們希望調用一些不同平臺的特定api,雖然我們代碼設計封裝做得很好,但是我們希望有固定的集成測試去cover這部分邏輯,讓我們的測試只運行是固定平臺。

轉載于:https://www.cnblogs.com/whitewolf/p/3175902.html

總結

以上是生活随笔為你收集整理的Aspectj 实现Method条件运行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: a网站在线观看 | 成年人免费毛片 | 亚洲经典一区二区三区 | 外国一级片 | 国产精品999999 | 婷婷久久综合网 | 性做久久久久久久免费看 | 我的丝袜美腿尤物麻麻 | 思思在线视频 | 久久aaaa片一区二区 | 亚洲精品国产精品国自产观看 | 成人3d动漫一区二区三区91 | 男人插入女人下面的视频 | 黄色一级生活片 | 日日操网站 | 波多野结衣电车 | 日韩精品在线一区二区 | 一级的大片 | 窝窝视频在线观看 | 韩国成人免费视频 | 国产视频精品免费 | 色久在线| 91视频麻豆| 国产91嫩草| 国产欧美一区二区三区在线 | 亚洲午夜精品一区二区三区 | 老头av| 亚洲一区欧美 | 曰本无码人妻丰满熟妇啪啪 | 亚洲高h| 91性高潮久久久久久久 | 欧美视频在线观看一区二区三区 | 国产成人午夜高潮毛片 | 婷婷激情丁香 | 亚洲啊v | 精品国产一二区 | 国产农村妇女毛片精品 | 蜜桃精品噜噜噜成人av | 欧美高清 | www国产黄色 | 热久久最新 | 日韩久久中文字幕 | 日本美女高潮 | 久草资源 | 涩涩天堂 | 日韩一级不卡 | 草色噜噜噜av在线观看香蕉 | 99久久国产热无码精品免费 | 高清日韩一区 | 久久一区二区三区视频 | 日韩精品在线观看一区二区 | 欧洲一区二区在线观看 | 午夜精品久久久久久久久久久久 | 日韩国产精品一区 | 久久精品第一页 | 超碰国产一区二区三区 | 干爹你真棒插曲免费 | 日本一本久草 | 97精品国产97久久久久久粉红 | 色com| 西野翔之公侵犯中文字幕 | 亚洲一区欧美二区 | 国产欧美一区二区三区在线看蜜臀 | 国产51自产区 | 波多野结衣小视频 | 蜜臀久久精品久久久用户群体 | 国产av精国产传媒 | 可以看的av网址 | 日本免费黄网站 | 最新国产拍偷乱偷精品 | a视频免费在线观看 | 三级黄色在线视频 | 欧美 日韩 国产 一区二区三区 | 日韩第一区 | 韩国黄色视屏 | 一本色道久久综合亚洲精品酒店 | 一区www| 欧美日韩少妇精品 | 色噜av | 啪视频网站 | 91美女精品网站 | 99九九久久| 成人亚洲一区二区 | 国产av一区二区三区 | 成人免费高清在线播放 | 一级黄色录象 | 成人在线视频免费看 | 日韩av综合网站 | 欧美爱爱网站 | 日本美女三级 | 国产成人精品久久二区二区91 | 亚洲午夜精品视频 | 欧美日韩久久婷婷 | av手机版 | 在线免费观看av网 | 国产精品视频在线观看免费 | 美女脱光内衣内裤 | 最新日韩在线视频 | 久久久久99精品 |