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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

容器+AOP实现动态部署(四)

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 容器+AOP实现动态部署(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?上篇咱們介紹了容器和AOP的結合,結合后怎樣將對象增強服務并沒有過多的說明,這里將詳細說明怎樣將對象 進行增強 ,達到一個一對多多對多的增強方式

先從簡單的方式說起

/** *JDK代理類,實現動態調用對象方法 */ public class JDKDynamicProxy implements InvocationHandler { /***……省略方法*//***回調使用方法,運行選擇的方法*/ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(target, args); after(); return result; } private void before() { System.out.println("Before"); } private void after() { System.out.println("After"); } }

以上代碼轉為圖形為

?

我們將詳細的顆粒固定在 AOP中。這樣一來,若再想添加服務顆粒可得修改代碼,這不是一種非常好的解決方案。為了更好更好的將服務與AOP解耦,我們將服務咱們裝載到了一個服務容器中。

這樣就有了先前的版本號

?

?

基本是我們須要的。通過截取業務顆粒。將服務顆粒,關系集合一起傳遞到AOP中,AOP進行解析。若是有多個服務顆粒呢,于是我們有了變更版本號



將右側的服務顆粒放在了一個容器中,多個服務顆粒同一時候為一個業務對象服務。

若有多個服務顆粒,想要這寫服務同一時候為全部業務顆粒提供支持,就成了例如以下圖了

?

?1 首先通過構造函數將所須要的參數傳遞進來

private Map<String, Object> aspectBeans; // 服務容器private Map<String, Object> businessBeans;// 業務容器private Map<String, Object> relationBeans;// 關系容器/**** * @param target* 被代理對象* @param aspectBeans* 切容器* @param businessBeans* 業務容器* @param relationBeans* 關系集合*/public JDKDynamicProxy(Object target, Map<String, Object> aspectBeans,Map<String, Object> businessBeans, Map<String, Object> relationBeans) {this.target = target;this.aspectBeans = aspectBeans;this.businessBeans = businessBeans;this.relationBeans = relationBeans;}


2 ?在回調函數中 調用解析關系xml方法。進行方法調用

?

// 回調注冊切入對象方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {List beforeList = (List) relationBeans.get("aspectbefore");// 獲取關系容器中的關系invokeAspectName(beforeList, method, args);// 調用切面類中匹配方法Object result = method.invoke(target, args);// 調用 被代理類本身方法return result;}/*** * @Title: getAllMethod * @Description: 運行某個服務類中的全部方法,* @param @param clazz 服務類* @param @param aspectClass aop關系集合中設定運行 攔截的方法* @param @param args 被攔截對象的參數* @return void 返回類型 * @throws*/public void getAllMethod(Class clazz, String aspectClass, Object[] args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException, NoSuchMethodException, SecurityException {// 獲取服務類中的全部公共方法Method[] methods = clazz.getDeclaredMethods();for (int j = 0; j < methods.length; j++) {// 反射獲取服務類中每一個方法名稱,獲取該服務類方法Method jinectmethod = clazz.getMethod(methods[j].getName(), Object.class);// 反射調用服務類中方法jinectmethod.invoke(aspectBeans.get(aspectClass),args == null ? new Object[1] : args);}}

?

?小結:

? 以上就是對AOP關系的基本解釋,一步步逐漸演變,也不是一蹴而就的。所以回到學習上,也不是一次學習就能夠全然的,要不斷重復的思考和總結。詳細的源代碼點擊連接

轉載于:https://www.cnblogs.com/blfshiye/p/5383295.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的容器+AOP实现动态部署(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

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