欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

AOP原理及在架構設計中的應用(一)

系統 2486 0

AOP 原理及應用

?

【摘要】 面向方面的編程(AOP)技術已在Java領域產生多年,它為傳統的編程模式帶來了一種新的思維和方式。AOP本身為程序結構帶來的靈活性,在JavaEE架構設計上也能發揮極大的作用。本文對AOP原理,Spring AOP基本編碼方式進行了簡明,清晰的介紹,還對公司項目實踐中AOP的基本應用模式進行了歸納,整理, 有更貼近實踐的指導意義。

?

【關鍵詞】AOP? JavaEE 架構設計

?

1. ?????? AOP 原理

1.1. ??? AOP 是什么

??? AOP(Aspect-Oriented Programming) 就是面向方面的編程,這一概念最初由 Xerox PARC 研究中心提出。

???? AOP 技術使得應用開發者僅僅關注于業務邏輯本身的開發,而不用糾纏于那些諸如安全、事務、日志等和業務邏輯無關但又是系統有效地執行業務邏輯所必須的通用性功能。 AOP 以“動態織入”的方式大大提高應用開發效率,有效地降低軟件的復雜性,代碼的清晰性、模塊化、可測試性方面也會取得很好的提升。

?

1.2. ??? AOP 產品

???? 經過多年的發展,目前 Java 領域的 AOP 實現有多種方案,主要包括:

???? 1 AspectJ ?(TM) : 創建于 Xerox?PARC.? 有近十年歷史,技術成熟。但其過于復雜;破壞封裝;而且需要專門的 Java 編譯器,易用性較差。

???? 2 )動態代理 AOP :使用 JDK 提供的動態代理 API 或字節碼 Bytecode 處理技術來實現。

???? 基于動態代理 API 的具體項目有: ? JBoss ?4.0? JBoss ?4.0 服務器
???? 3
)基于字節碼的 AOP ,例如: ?
Aspectwerkz ,  CGlib Spring 等。

??????

1.3. ??? AOP 原理

1.3.1. 基本概念

AOP 技術中將這些通用性功能稱為方面( Aspect )或切面( Pointcut , Advicor )。 ?? JDK 提供的動態代理 AOP CGLib 等字節碼的 AOP 中,方面通過攔截器 (Interceptor) 來實現。

???? 具體解釋就是,在對 Java 方法調用時, AOP 機制能自動進行方法攔截,允許你在方法調用前,調用后,以及執行異常時添加特定的代碼,來完成需要的功能。

???? 例如:調用 User 類的 sayHello 方法的基本過程如下圖:

?

public ? class ?User ? {

public ? void ? sayHello (String?name)? {????

System.out.println ( "Hello?"?+?name);?

}

}

??? 如果想在調用前打印一條日志, AOP 下的做法是為 User 類添加一個日志攔截器(如下圖所示),而原有 User 類的代碼無需任何修改。

?

??????

1.3.2. 方法攔截器

??? 不同廠商提供的方法攔截器規格不同,但基本原理類似。 CGLib 提供的攔截器接口: MethodInterceptor ,僅提供了一個 intercept 接口( AOPAppliance 提供類似的 invoke 方法)。

?

public Object intercept

(Object obj , Method method , Object[] args , MethodProxy proxy) throws Throwable

??? 日志攔截器的開發者,可以實現該接口,對被攔截的方法,例如: sayHello 進行處理,在方法實際執行前,打印日志。

?

public class LogInterceptor implements MethodInterceptor { ??

public Object intercept(Object obj , Method method , Object[] args , MethodProxy proxy) throws Throwable {?????

??????? System. out .println ( "invoke method(Before) sayHello !" );

??????? // 實際執行方法

??????? return proxy.invokeSuper ( obj , args );

??? }

}

?

??? 原方式下, user 的調用方式為

???? User user = new User( );

???? user.sayHello ( “張三” );

?

???? 但要讓 User sayHello 方法被記錄日志, user 的創建方式有所不同。在 Spring 下,提供了一種最為簡化的創建方法,

???? User user = (User) beanFactory.getBean ( beanName )

???? user.sayHello ( “張三” );

??? 其中 beanName 是在 Spring 配置文件中為 User 配置的 bean ID

?

1.3.3. 細化的攔截器

??? Spring 框架對 AOP 的方面進行了細化處理,將每一次的方法攔截細分為 before after throwing( 異常 ) 三個過程,并定義了三個 advice 接口

MethodBeforeAdvice ,

AfterReturningAdvice ,

ThrowsAdvice ,

???? 攔截器開發者只需實現自己關注的階段,上面的日志攔截器在 Spring 框架下可以如下實現:

?

public class LogAdvisor extends MethodBeforeAdvice {

private static Log log = LogFactory.getLog ( LogAdvisor.class );

public void before(Method method , Object[] args , Object target) throws Throwable {

??????? if( log.isDebugEnabled ())

??????????? log.debug (" 記錄日志 ( ):" + target +", 方法 :" + method.getName ());

}

?

??????

1.3.4. 攔截器串

?????? 通常,系統關注的功能有很多,例如:日志,事務,緩存等等,因此,實際系統中,通常是多個攔截器同時工作,形成一個攔截器串,各自關注相應特定的功能

?

???????? 攔截器串協同 工作的基本方式為

???? 1 )串行執行,即幾個攔截器,按順序依次執行。

???? 但在有些系統中還存在特殊需求:

???? 2) 忽略執行

???? 在某些情況下,例如: sayHello 的參數是“ Admin ”時,不記錄日志,只開啟事務和緩存功能, 那么 Log 攔截器的日志記錄功能需要被忽略。這種情況通常在 LogAdvisor 內部,對參數進行判斷來實現。

public class LogAdvisor extends MethodBeforeAdvice {

private static Log log = LogFactory. getLog ( LogAdvisor. class );

public void before(Method method , Object[] args , Object target) throws Throwable {

??????? if( Admin .equals ( args [0]))

??????????? if ( log .isDebugEnabled ())

??????????????? log .debug ( " 記錄日志 ( ):" + target + ", 方法 :" + method.getName ());

}

??? 3) 跳出執行

???? ? 在某些情況下,要求終止被攔截的方法的實際執行,不再繼續執行下一攔截器,而直接返回特定的結果,例如: sayHello 的參數是“ Admin ”時,讓該方法返回固定的值“管理員,你好!”。

?

public class SecurityInterceptor implements MethodInterceptor { ?

public Object intercept(Object obj , Method method , Object[] args , MethodProxy proxy) throws Throwable {?????

??????? if ( Admin .equals ( args [0]))

??????????? return 管理員,你好! ; // 實際執行方法

??????? else

??????????? return proxy.invokeSuper ( obj , args );

??? }

}

?

?

?

1.3.5. AOP 適用的方面

?????? 由于 AOP 技術本身的插件式特點,采用這種機制進行系統設計和程序開發能夠為軟件帶來極大的靈活性和擴展性。目前,運用 AOP 對系統進行功能擴展主要關注的方面是:

???? Transactions 事務,例如 Spring 就利用 AOP 提供了通用性的事務管理器。

???? Logging, 日志,還包括 Tracing 等;

???? Profiling and Monitoring 性能分析和監控。

???? Authentication 權限,包括鑒權,安全控制等;

???? Caching 緩存, ????

???? Error handling 錯誤處理

???? Lazy loading 懶加載

???? Debugging?? 調試 ???

???? Performance optimization 性能優化

???? 等等。

??????

2. ?????? 架構設計中 AOP 的運用

2.1. ??? 運用方式

??? 架構采用了 JavaEE 規范中經典的三層架構:表示層、業務層、持久層,如下圖所示:

?

???

????? 與一般的 JavaEE 架構不同, 該架構通過 Factory 模式在各層之前進行搭橋,通過對應的 Factory 類來創建下層對象。

???? 工廠機制運用了 Spring AOP 技術,上層對象在請求下層資源時,可以通過代理機制切入若干功能,使得可以靈活擴展系統功能,而又使各層著重關注本職核心功能。值得注意的是,表示層采用的是 Struts2 框架,而它本身就是基于 AOP 原理進行設計的。如下圖所示:

??????

???? 由于運用了 Spring AOP 技術,方面( Aspect )的開發就變成攔截器( Spring 稱為 Advisor )的開發。該架構將 Spring AOP 規范定義的 before after throwing 三個階段,和 CGLib 定義的 invoke 階段整合為了一個抽象類 : AbstractAdvisor , 方便設計人員開發新的攔截器。

???

??? 并且 Spring 通過 AOP 機制已經提供通用的事務( Transaction )控制,調試 (Debug) ,類加載分析,并發控制,簡單的性能監控等基礎性功能。

2.2. ??? AOP 應用舉例

2.2.1. 基本功能

1. ?????? 業務日志(工單)

?????? 凡是基于數據庫的系統,本質上都是對 庫表記錄 的增刪改查。而從業務層面看,很多時候,用戶需要對數據的操作留下痕跡,即業務日志,以便審計。

???????? 在公司項目的 J2EE 架構中設計了業務日志攔截器,并切入對 BO 的操作,完成對業務操作的記錄。用戶可以通過專門的界面對業務日志進行查詢和分析。

???????? 工作原理

???????? 業務日志的基本數據格式為:

???????? ? 操作時間 , 來源 IP, 操作工號 , 操作狀態 , 操作動作 , 操作類型 , 失敗原因 , 數據

???????? 日志按操作類型分:增加,刪除,修改(查詢暫不記錄), 操作成功,失敗時都要記錄。記錄業務日志的主要依據是被攔截的對象和方法信息,。在執行方法本體后,即業務方法成功執行后,記錄成功日志;在方法本體拋出異常時,記錄失敗日志。主要代碼見下:

?

public class BusinessLogAdvisor extends AbstractAdvisor ? {

?

public Object invoke( MethodInvocation invocation) throws Throwable {

???? // 準備參數

???? Object result = null ;?????

???? Object object = invocation.getThis (); // 被攔截的對象

???? Method method = invocation.getMethod (); // 被攔截的方法

???? Object[] args = invocation.getArguments (); // 參數

???? //before, 之前必要的檢查

???? ……

???? try {

???????? result = invocation.proceed ();

???????? // 以下執行記錄日志的操作

???????? doLog ( object, method, args , target, BusinessLog. STATE_SUCCESS , null );

???? } catch (Exception e) {

???????? // 以下記錄失敗日志

???????? doLog ( object, method, args , target , BusinessLog. STATE_FAIL ,failcause );

???? }

}

???????? 其中 doLog 方法將信息保存到庫表中。 ( 出于性能考慮,可以采用異步方式保存業務日志到數據庫 )

?

2. ?????? 性能監控

?????? Spring 本身提供了一個監控攔截器,但功能不是很完善。公司項目架構中設計了一套 Monitor 框架,其功能包含:性能監控 (Profiling , Monitoring) ,訪問分析 (Analyzing) 兩個方面。

???????? Monitor 可切入表示層,業務層 BO ,持久層 DAO 三層。 Monitor 包括以下功能:

¨ ????????? 按安模塊和功能分析性能指標

¨ ????????? 實時流量監控

¨ ????????? 按模塊和功能分析流量

¨

AOP原理及在架構設計中的應用(一)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 曰韩精品| 欧美日韩一区二区在线 | 欧美日韩亚洲一区二区 | 毛片1级 | 91精品国产综合久久久久久 | 精品视频久久 | 国产成人精品在线观看 | 在线免费观看毛片 | 亚洲精品一区国产 | 99国产在线视频有精品视频 | 亚洲影院在线观看 | 精一区二区 | www.天天草 | 看片一区 | 亚洲精品久久久久久国产精华液 | 亚洲好视频| 日韩亚洲欧美中文高清在线 | 中文字幕久久精品 | 春色www在线视频观看 | 久久99国产精一区二区三区 | 日本最色网站 | 污在线视频 | 欧美成人网在线综合视频 | 另类视频在线观看 | 九色网址 | 亚洲一区二区视频在线观看 | 久久精品亚洲精品国产欧美kt∨ | 久久天堂 | 99re热精品视频 | 精品一区二区三区四区五区六区 | 亚洲欧美一区二区三区在线 | 欧美一级黄视频 | 色综合色狠狠天天久久婷婷基地 | 成人在线视频网 | 日韩欧美一区二区三区久久 | 亚洲在线观看网站 | 一级aaaaaa毛片免费 | 亚洲国产日产韩国欧美综合 | 97国产精品视频人人做人人爱 | 婷婷亚洲综合五月天小说 | 国内一级一级毛片a免费 |