亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

AOP原理及在架構(gòu)設(shè)計(jì)中的應(yīng)用(一)

系統(tǒng) 2389 0

AOP 原理及應(yīng)用

?

【摘要】 面向方面的編程(AOP)技術(shù)已在Java領(lǐng)域產(chǎn)生多年,它為傳統(tǒng)的編程模式帶來了一種新的思維和方式。AOP本身為程序結(jié)構(gòu)帶來的靈活性,在JavaEE架構(gòu)設(shè)計(jì)上也能發(fā)揮極大的作用。本文對(duì)AOP原理,Spring AOP基本編碼方式進(jìn)行了簡明,清晰的介紹,還對(duì)公司項(xiàng)目實(shí)踐中AOP的基本應(yīng)用模式進(jìn)行了歸納,整理, 有更貼近實(shí)踐的指導(dǎo)意義。

?

【關(guān)鍵詞】AOP? JavaEE 架構(gòu)設(shè)計(jì)

?

1. ?????? AOP 原理

1.1. ??? AOP 是什么

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

???? AOP 技術(shù)使得應(yīng)用開發(fā)者僅僅關(guān)注于業(yè)務(wù)邏輯本身的開發(fā),而不用糾纏于那些諸如安全、事務(wù)、日志等和業(yè)務(wù)邏輯無關(guān)但又是系統(tǒng)有效地執(zhí)行業(yè)務(wù)邏輯所必須的通用性功能。 AOP 以“動(dòng)態(tài)織入”的方式大大提高應(yīng)用開發(fā)效率,有效地降低軟件的復(fù)雜性,代碼的清晰性、模塊化、可測(cè)試性方面也會(huì)取得很好的提升。

?

1.2. ??? AOP 產(chǎn)品

???? 經(jīng)過多年的發(fā)展,目前 Java 領(lǐng)域的 AOP 實(shí)現(xiàn)有多種方案,主要包括:

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

???? 2 )動(dòng)態(tài)代理 AOP :使用 JDK 提供的動(dòng)態(tài)代理 API 或字節(jié)碼 Bytecode 處理技術(shù)來實(shí)現(xiàn)。

???? 基于動(dòng)態(tài)代理 API 的具體項(xiàng)目有: ? JBoss ?4.0? JBoss ?4.0 服務(wù)器
???? 3
)基于字節(jié)碼的 AOP ,例如: ?
Aspectwerkz ,  CGlib , Spring 等。

??????

1.3. ??? AOP 原理

1.3.1. 基本概念

AOP 技術(shù)中將這些通用性功能稱為方面( Aspect )或切面( Pointcut , Advicor )。 ?? JDK 提供的動(dòng)態(tài)代理 AOP CGLib 等字節(jié)碼的 AOP 中,方面通過攔截器 (Interceptor) 來實(shí)現(xiàn)。

???? 具體解釋就是,在對(duì) Java 方法調(diào)用時(shí), AOP 機(jī)制能自動(dòng)進(jìn)行方法攔截,允許你在方法調(diào)用前,調(diào)用后,以及執(zhí)行異常時(shí)添加特定的代碼,來完成需要的功能。

???? 例如:調(diào)用 User 類的 sayHello 方法的基本過程如下圖:

?

public ? class ?User ? {

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

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

}

}

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

?

??????

1.3.2. 方法攔截器

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

?

public Object intercept

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

??? 日志攔截器的開發(fā)者,可以實(shí)現(xiàn)該接口,對(duì)被攔截的方法,例如: sayHello 進(jìn)行處理,在方法實(shí)際執(zhí)行前,打印日志。

?

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 !" );

??????? // 實(shí)際執(zhí)行方法

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

??? }

}

?

??? 原方式下, user 的調(diào)用方式為

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

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

?

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

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

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

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

?

1.3.3. 細(xì)化的攔截器

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

MethodBeforeAdvice ,

AfterReturningAdvice ,

ThrowsAdvice ,

???? 攔截器開發(fā)者只需實(shí)現(xiàn)自己關(guān)注的階段,上面的日志攔截器在 Spring 框架下可以如下實(shí)現(xiàn):

?

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. 攔截器串

?????? 通常,系統(tǒng)關(guān)注的功能有很多,例如:日志,事務(wù),緩存等等,因此,實(shí)際系統(tǒng)中,通常是多個(gè)攔截器同時(shí)工作,形成一個(gè)攔截器串,各自關(guān)注相應(yīng)特定的功能 。

?

???????? 攔截器串協(xié)同 工作的基本方式為

???? 1 )串行執(zhí)行,即幾個(gè)攔截器,按順序依次執(zhí)行。

???? 但在有些系統(tǒng)中還存在特殊需求:

???? 2) 忽略執(zhí)行

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

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) 跳出執(zhí)行

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

?

public class SecurityInterceptor implements MethodInterceptor { ?

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

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

??????????? return 管理員,你好! ; // 實(shí)際執(zhí)行方法

??????? else

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

??? }

}

?

?

?

1.3.5. AOP 適用的方面

?????? 由于 AOP 技術(shù)本身的插件式特點(diǎn),采用這種機(jī)制進(jìn)行系統(tǒng)設(shè)計(jì)和程序開發(fā)能夠?yàn)檐浖順O大的靈活性和擴(kuò)展性。目前,運(yùn)用 AOP 對(duì)系統(tǒng)進(jìn)行功能擴(kuò)展主要關(guān)注的方面是:

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

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

???? Profiling and Monitoring 性能分析和監(jiān)控。

???? Authentication 權(quán)限,包括鑒權(quán),安全控制等;

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

???? Error handling 錯(cuò)誤處理

???? Lazy loading 懶加載

???? Debugging?? 調(diào)試 ???

???? Performance optimization 性能優(yōu)化

???? 等等。

??????

2. ?????? 架構(gòu)設(shè)計(jì)中 AOP 的運(yùn)用

2.1. ??? 運(yùn)用方式

??? 架構(gòu)采用了 JavaEE 規(guī)范中經(jīng)典的三層架構(gòu):表示層、業(yè)務(wù)層、持久層,如下圖所示:

?

???

????? 與一般的 JavaEE 架構(gòu)不同, 該架構(gòu)通過 Factory 模式在各層之前進(jìn)行搭橋,通過對(duì)應(yīng)的 Factory 類來創(chuàng)建下層對(duì)象。

???? 工廠機(jī)制運(yùn)用了 Spring AOP 技術(shù),上層對(duì)象在請(qǐng)求下層資源時(shí),可以通過代理機(jī)制切入若干功能,使得可以靈活擴(kuò)展系統(tǒng)功能,而又使各層著重關(guān)注本職核心功能。值得注意的是,表示層采用的是 Struts2 框架,而它本身就是基于 AOP 原理進(jìn)行設(shè)計(jì)的。如下圖所示:

??????

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

???

??? 并且 Spring 通過 AOP 機(jī)制已經(jīng)提供通用的事務(wù)( Transaction )控制,調(diào)試 (Debug) ,類加載分析,并發(fā)控制,簡單的性能監(jiān)控等基礎(chǔ)性功能。

2.2. ??? AOP 應(yīng)用舉例

2.2.1. 基本功能

1. ?????? 業(yè)務(wù)日志(工單)

?????? 凡是基于數(shù)據(jù)庫的系統(tǒng),本質(zhì)上都是對(duì) 庫表記錄 的增刪改查。而從業(yè)務(wù)層面看,很多時(shí)候,用戶需要對(duì)數(shù)據(jù)的操作留下痕跡,即業(yè)務(wù)日志,以便審計(jì)。

???????? 在公司項(xiàng)目的 J2EE 架構(gòu)中設(shè)計(jì)了業(yè)務(wù)日志攔截器,并切入對(duì) BO 的操作,完成對(duì)業(yè)務(wù)操作的記錄。用戶可以通過專門的界面對(duì)業(yè)務(wù)日志進(jìn)行查詢和分析。

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

???????? 業(yè)務(wù)日志的基本數(shù)據(jù)格式為:

???????? ? 操作時(shí)間 , 來源 IP, 操作工號(hào) , 操作狀態(tài) , 操作動(dòng)作 , 操作類型 , 失敗原因 , 數(shù)據(jù)

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

?

public class BusinessLogAdvisor extends AbstractAdvisor ? {

?

public Object invoke( MethodInvocation invocation) throws Throwable {

???? // 準(zhǔn)備參數(shù)

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

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

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

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

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

???? ……

???? try {

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

???????? // 以下執(zhí)行記錄日志的操作

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

???? } catch (Exception e) {

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

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

???? }

}

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

?

2. ?????? 性能監(jiān)控

?????? Spring 本身提供了一個(gè)監(jiān)控?cái)r截器,但功能不是很完善。公司項(xiàng)目架構(gòu)中設(shè)計(jì)了一套 Monitor 框架,其功能包含:性能監(jiān)控 (Profiling , Monitoring) ,訪問分析 (Analyzing) 兩個(gè)方面。

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

¨ ????????? 按安模塊和功能分析性能指標(biāo)

¨ ????????? 實(shí)時(shí)流量監(jiān)控

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

¨

AOP原理及在架構(gòu)設(shè)計(jì)中的應(yīng)用(一)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 四虎影视在线看免费 720p | 天天操夜夜拍 | 香蕉人精品视频多人免费永久视频 | 伊人网综合在线视频 | 台湾成人性视频免费播放 | 亚洲精品中文字幕字幕 | 99久久精品免费看国产 | 久久久精品2021免费观看 | 欧美性视频在线激情 | 亚洲精品中文字幕在线 | 一本清高清dvd日本播放器 | 正在播放久久 | 国内视频一区 | 99综合网 | 97最新| 久久激情视频 | 国产成人精品视频频 | 日韩在线视频网址 | 五月天婷亚洲天综合网精品偷 | 一级aa免费视频毛片 | 苦瓜se影院在线视频网站 | 青青操夜夜操 | 中文字幕不卡在线高清 | 91精品国产人成网站 | 国产免费一区二区三区香蕉精 | 免费久久精品视频 | 色综合久久一本首久久 | er久99久热只有精品国产 | 99视频福利| 久久麻豆视频 | 欧美福利在线视频 | 成人四虎影院 | 日产一二三四五六七区麻豆 | 国产成人精品免费大全 | 美女黄色免费在线观看 | 波多野结衣一区二区三区四区 | 久久久精品一区二区三区 | 天天干天天干天天插 | 热99在线 | 国产一级强片在线观看 | 欧美一级毛片在线一看 |