<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      AOP面向切面編程

      基本信息

      Aspect Oriented Programming(AOP),面向切面編程,是一個(gè)比較熱門的話題。AOP主要實(shí)現(xiàn)的目的是針對(duì)業(yè)務(wù)處理過程中的切面進(jìn)行提取,它所面對(duì)的是處理過程中的某個(gè)步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。 比如我們最常見的就是日志記錄了,舉個(gè)例子,我們現(xiàn)在提供一個(gè)服務(wù)查詢學(xué)生信息的,但是我們希望記錄有誰進(jìn)行了這個(gè)查詢。如果按照傳統(tǒng)的OOP的實(shí)現(xiàn)的話,那我們實(shí)現(xiàn)了一個(gè)查詢學(xué)生信息的服務(wù)接口(StudentInfoService)和其實(shí)現(xiàn)類(StudentInfoServiceImpl.java),同時(shí)為了要進(jìn)行記錄的話,那我們?cè)趯?shí)現(xiàn)類(StudentInfoServiceImpl.java)中要添加其實(shí)現(xiàn)記錄的過程。這樣的話,假如我們要實(shí)現(xiàn)的服務(wù)有多個(gè)呢?那就要在每個(gè)實(shí)現(xiàn)的類都添加這些記錄過程。這樣做的話就會(huì)有點(diǎn)繁瑣,而且每個(gè)實(shí)現(xiàn)類都與記錄服務(wù)日志的行為緊耦合,違反了面向?qū)ο?/a>的規(guī)則。那么怎樣才能把記錄服務(wù)的行為與業(yè)務(wù)處理過程中分離出來呢?看起來好像就是查詢學(xué)生的服務(wù)自己在進(jìn)行,但卻是背后日志記錄對(duì)這些行為進(jìn)行記錄,并且查詢學(xué)生的服務(wù)不知道存在這些記錄過程,這就是我們要討論AOP的目的所在。AOP的編程,好像就是把我們?cè)谀硞€(gè)方面的功能提出來與一批對(duì)象進(jìn)行隔離,這樣與一批對(duì)象之間降低了耦合性,可以就某個(gè)功能進(jìn)行編程。

      折疊編輯本段代碼分析

      我們直接從代碼入手吧,要實(shí)現(xiàn)以上的目標(biāo),我們可以使用一個(gè)動(dòng)態(tài)代理類(Proxy),通過攔截一個(gè)對(duì)象的行為并添加我們需要的功能來完成。Java中的java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口為我們實(shí)現(xiàn)動(dòng)態(tài)代理類提供了一個(gè)方案,但是該方案針對(duì)的對(duì)象要實(shí)現(xiàn)某些接口;如果針對(duì)的目的是類的話,cglib為我們提供了另外一個(gè)實(shí)現(xiàn)方案。等下會(huì)說明兩者的區(qū)別。

      折疊接口實(shí)現(xiàn)方案

      1)首先編寫我們的業(yè)務(wù)接口(StudentInfoService.java):

      及其實(shí)現(xiàn)類(StudentInfoServiceImpl.java):

      2)現(xiàn)在我們需要一個(gè)日志功能,在findInfo行為之前執(zhí)行并記錄其行為,那么我們就首先要攔截該行為。在實(shí)際執(zhí)行的過程中用一個(gè)代理類來替我們完成。Java中為我們提供了實(shí)現(xiàn)動(dòng)態(tài)代理類的方案:

      1'處理攔截目的的類(MyHandler.java)

      2'我們實(shí)現(xiàn)一個(gè)工廠,為了方便我們使用該攔截類(AOPFactory.java):

      3)基本的攔截與其工廠我們都實(shí)現(xiàn)了,現(xiàn)在測(cè)試(ClientTest.java):

      輸出結(jié)果(看你的log4j設(shè)置):

      調(diào)用log日志方法findInfo

      你目前輸入的名字是:阿飛

      這樣我們需要的效果就出來了,業(yè)務(wù)處理自己在進(jìn)行,但是我們實(shí)現(xiàn)了日志功能,而業(yè)務(wù)處理(StudentInfoService)根本不知道存在該行為的。但是Java中提供的動(dòng)態(tài)代理類的實(shí)現(xiàn)是針對(duì)實(shí)現(xiàn)了某些接口的類,如果沒有實(shí)現(xiàn)接口的話,不能創(chuàng)建代理類,看以上部分:

      看到了沒有?obj.getClass().getInterfaces()要求實(shí)現(xiàn)了某些接口。以下提供哪些沒有實(shí)現(xiàn)接口的實(shí)現(xiàn)方案:

      折疊子類實(shí)現(xiàn)方案

      首先,請(qǐng)上網(wǎng)下CGLib的包。設(shè)置好classpath路徑,CGLib與java標(biāo)準(zhǔn)庫(kù)提供的實(shí)現(xiàn)方案不同,cglib主要是基于實(shí)現(xiàn)類(如StudentInfoServiceImpl.java)擴(kuò)展一個(gè)子類來實(shí)現(xiàn)。與Dynamic Proxy中的Proxy和InvocationHandler相對(duì)應(yīng),net.sf.cglib.proxy.Enhancer和MethodInterceptor在CGLib中負(fù)責(zé)完成代理對(duì)象創(chuàng)建和方法截獲處理,產(chǎn)生的是目標(biāo)類的子類而不是通過接口來實(shí)現(xiàn)方法攔截的,Enhancer主要是用于構(gòu)造動(dòng)態(tài)代理子類來實(shí)現(xiàn)攔截,MethodInterceptor(擴(kuò)展了Callback接口)主要用于實(shí)現(xiàn)around advice(AOP中的概念):

      1)我們的業(yè)務(wù)處理(StudentInfoServiceImpl.java):

      2)實(shí)行一個(gè)工具來處理日志功能(AOPInstrumenter.java):

      3)我們來測(cè)試一下(AOPTest.java):

      輸出結(jié)果與以上相同。

      CGLib中為實(shí)現(xiàn)以上目的,主要提供的類

      1)Enhancer:setCallback(Callback) ,setSuperclass(Class) ,create()返回動(dòng)態(tài)子類Object

      2)MethodInterceptor必須實(shí)現(xiàn)的接口:intercept(Object,Method,Object[],MethodProxy)返回的是原方法調(diào)用的結(jié)果。和Proxy原理一樣。

      折疊AOP基本概念

      1)aspect(切面):實(shí)現(xiàn)了cross-cutting功能,是針對(duì)切面的模塊。最常見的是logging模塊,這樣,程序按功能被分為好幾層,如果按傳統(tǒng)的繼承的話,商業(yè)模型繼承日志模塊的話根本沒有什么意義,而通過創(chuàng)建一個(gè)logging切面就可以使用AOP來實(shí)現(xiàn)相同的功能了。

      2)jointpoint(連接點(diǎn)):連接點(diǎn)是切面插入應(yīng)用程序的地方,該點(diǎn)能被方法調(diào)用,而且也會(huì)被拋出意外。連接點(diǎn)是應(yīng)用程序提供給切面插入的地方,可以添加新的方法。比如以上我們的切點(diǎn)可以認(rèn)為是findInfo(String)方法。

      3)advice(處理邏輯):advice是我們切面功能的實(shí)現(xiàn),它通知程序新的行為。如在logging里,logging advice包括logging的實(shí)現(xiàn)代碼,比如像寫日志到一個(gè)文件中。advice在jointpoint處插入到應(yīng)用程序中。以上我們?cè)贛yHandler.java中實(shí)現(xiàn)了advice的功能

      4)pointcut(切點(diǎn)):pointcut可以控制你把哪些advice應(yīng)用于jointpoint上去,通常你使用pointcuts通過正則表達(dá)式來把明顯的名字和模式進(jìn)行匹配應(yīng)用。決定了那個(gè)jointpoint會(huì)獲得通知。

      5)introduction:允許添加新的方法和屬性到類中。

      6)target(目標(biāo)類):是指那些將使用advice的類,一般是指獨(dú)立的那些商務(wù)模型。比如以上的StudentInfoServiceImpl.

      7)proxy(代理類):使用了proxy的模式。是指應(yīng)用了advice的對(duì)象,看起來和target對(duì)象很相似。

      8)weaving(插入):是指應(yīng)用aspects到一個(gè)target對(duì)象創(chuàng)建proxy對(duì)象的過程:complie time,classload time,runtime

      posted @ 2018-12-25 09:47  獨(dú)孤天狼  閱讀(140)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 午夜精品亚洲一区二区三区| 亚洲性日韩精品一区二区| 人人爽人人澡人人人妻| 久久精品国产亚洲av天海翼| 中国美女a级毛片| 怡春院久久国语视频免费| 色综合网天天综合色中文| 99久热在线精品视频| 99久久激情国产精品| 91精品国产自产在线蜜臀| 久久久亚洲欧洲日产国码606| 久久综合亚洲色一区二区三区| 枣强县| 精品国产粉嫩一区二区三区| 中国熟妇毛多多裸交视频| 精品人妻av区乱码| 日韩女同一区二区三区久久| 一区二区中文字幕久久| 日本一二三区视频在线| 亚洲一区二区无码影院| 亚洲一区二区中文字幕| 吴旗县| 一个色综合亚洲热色综合| 欧美日韩精品一区二区三区不卡| 国产女人在线视频| 国产精品色内内在线播放| 久久亚洲精品中文字幕波多野结衣| 色综合天天综合天天综| 中文字幕av一区二区三区 | 免费无码一区无码东京热| 国产一区二区日韩在线| 少妇太爽了在线观看免费视频| 午夜高清福利在线观看| 亚洲av综合色区在线观看 | 插插射啊爱视频日a级| 美女又黄又免费的视频| 精品熟女少妇免费久久| 久久国产精品伊人青青草| 亚洲av第一区二区三区| 亚洲韩国精品无码一区二区三区| 国产av综合一区二区三区|