国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

AOP詳解

2019-11-09 20:09:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

AOP詳解

  上次的博文深入淺出SPRing(二) IoC詳解中,我為大家簡(jiǎn)單介紹了一下Spring框架核心內(nèi)容中的IoC,接下來(lái)我們繼續(xù)講解另一個(gè)核心AOP(aspect Oriented Programming),即面向切面編程。

1、OOP回顧

       在介紹AOP之前先來(lái)回顧一下大家都比較熟悉的OOP(Object Oriented Programming)。OOP主要是為了實(shí)現(xiàn)編程的重用性、靈活性和擴(kuò)展性。它的幾個(gè)特征分別是繼承、封裝、多態(tài)和抽象。OOP重點(diǎn)體現(xiàn)在編程架構(gòu),強(qiáng)調(diào)的是類(lèi)之間的層次關(guān)系。

2、OOP缺陷

       為了更好的說(shuō)明OOP的概念,我們接下來(lái)講一個(gè)OOP的實(shí)例,重點(diǎn)分析OOP存在哪些缺陷,以便更好的理解AOP的相關(guān)內(nèi)容。

       先看如下的一張圖:

 

       上面這張圖有三個(gè)類(lèi):Dog,Cat和Duck,他們都有一個(gè)方法run。按照OOP的設(shè)計(jì)理念,我們很容易就會(huì)想到抽象出一個(gè)Animal父類(lèi),同時(shí)讓這三個(gè)子類(lèi)繼承Animal父類(lèi)。這樣的設(shè)計(jì)可以用如下的圖示表示:

 

       在OOP思想中,我們會(huì)使用大量的類(lèi)似上圖的編程方式,對(duì)類(lèi)進(jìn)行抽象、繼承、封裝和多態(tài)來(lái)實(shí)現(xiàn)編程的重用性、靈活性和擴(kuò)展性。但是這樣的編程仍然有一定的局限性,有時(shí)候,OOP并不能很好解決我們?cè)賹?shí)際開(kāi)發(fā)中遇到的問(wèn)題。為了說(shuō)明這個(gè)問(wèn)題,看下面的圖示:

 

       看到上面的圖,我們暫時(shí)還不能發(fā)現(xiàn)有什么問(wèn)題。為了大家便于理解,接下來(lái)我來(lái)給大家講解一下上面類(lèi)圖的實(shí)現(xiàn)過(guò)程。描述如下:馬戲團(tuán)有一條表演的小狗,這條小狗可以跑和跳,但是它完成跑和跳兩個(gè)動(dòng)作之前必須是在接到馴獸師發(fā)出的命令后,同時(shí)完成跑和跳的動(dòng)作之后,馴獸師會(huì)給與響應(yīng)的獎(jiǎng)勵(lì),比如一塊肉。

       了解了實(shí)現(xiàn)過(guò)程之后,我們?cè)趤?lái)看一下具體的代碼。 

復(fù)制代碼復(fù)制代碼
    public class Dog {           public void run() {            System.out.println("馴獸師發(fā)出命令!")            System.out.println("小狗開(kāi)始跑!");            System.out.pringln("馴獸師給與獎(jiǎng)勵(lì)");        }          public void jump() {            System.out.println("馴獸師發(fā)出命令!")            System.out.println("小狗開(kāi)始跳!");            System.out.pringln("馴獸師給與獎(jiǎng)勵(lì)");        }    }復(fù)制代碼復(fù)制代碼
    仔細(xì)看上面的代碼,我們可以看出在run方法和jump方法中,存在一些相同的內(nèi)容(馴獸師發(fā)出命令和給與獎(jiǎng)勵(lì)),這些內(nèi)容并不能完全進(jìn)行抽象,即不能按照OOP編程思想進(jìn)行處理。類(lèi)似這樣的情況同樣會(huì)出現(xiàn)在我們編程中的很多地方,例如:日志記錄、性能統(tǒng)計(jì)、安全控制、事務(wù)處理、異常處理等等。但是這樣的情況該如何解決呢?這就引入了AOP編程思想。

 

3、AOP簡(jiǎn)介

       AOP為Aspect Oriented Programming的縮寫(xiě),即面向切面編程(也叫面向方面),是一種可以通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù)。

 

4、AOP實(shí)現(xiàn)實(shí)例

      為了大家更好的理解AOP如何實(shí)現(xiàn),接下來(lái)我們優(yōu)化一下上述代碼。

      首先是Dog類(lèi)

復(fù)制代碼復(fù)制代碼
    public interface Animal {        public void run();        public void jump();    }        public class Dog implements Animal{        public void run(){            System.out.println("小狗開(kāi)始跑!");        }            public void jump(){            System.out.println("小狗開(kāi)始跳!");        }            }復(fù)制代碼復(fù)制代碼

     對(duì)比之前的代碼我們可以明顯看出,我們將關(guān)于馴獸師的相關(guān)內(nèi)容從run和jump中進(jìn)行了抽取,接下來(lái),我們?nèi)绾卧诔绦蜻\(yùn)行中將關(guān)于馴獸師的動(dòng)作加入到程序中呢?這就是我們這次用到的AOP實(shí)現(xiàn)的核心技術(shù)動(dòng)態(tài)代理(Dynamic Proxy)。具體代碼如下:

復(fù)制代碼復(fù)制代碼
    public class MyProxy  implements InvocationHandler{        private Object targetObject;                public Object createProxyInstance(Object targetObject) {            this.targetObject = targetObject;            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),                                    targetObject.getClass().getInterfaces(),                                    this);        }                public Object invoke(Object proxy, Method method, Object[] args)                throws Throwable {            command();                    Object ret = method.invoke(targetObject, args);            award();            return ret;        }                private void command() {            System.out.println("馴獸師發(fā)出命令!");        }                private void award(){            System.out.println("馴獸師給與獎(jiǎng)勵(lì)!");        }    }復(fù)制代碼復(fù)制代碼
  上述代碼實(shí)現(xiàn)完成之后,我們改如何調(diào)用呢?參考代碼如下:復(fù)制代碼復(fù)制代碼
    public class Client {        public static void main(String[] args) {            MyProxy hander = new MyProxy();            Animal dog = (Animal)hander.createProxyInstance(new Dog());            dog.run();            dog.jump();        }    }復(fù)制代碼復(fù)制代碼
  執(zhí)行結(jié)果如下:

 

       關(guān)于AOP編程的實(shí)例演示就完成了,接下來(lái)重新回顧一下AOP與OOP的相關(guān)概念。

 

5、AOP與OOP的關(guān)系

       OOP針對(duì)業(yè)務(wù)處理過(guò)程的實(shí)體(Dog、Cat、Duck)及其屬性和行為(run)進(jìn)行抽象封裝,以獲得更加清晰高效的邏輯單元?jiǎng)澐帧6鳤OP則是針對(duì)業(yè)務(wù)處理過(guò)程中(run或jump)的切面(command和award)進(jìn)行提取,它所面對(duì)的是處理過(guò)程中的某個(gè)步驟或階段,以獲得邏輯過(guò)程中各部分之間低耦合性的隔離效果。這兩種設(shè)計(jì)思想在目標(biāo)上有著本質(zhì)的差異。       本篇文章到此為止基本上對(duì)AOP的概念就講解完畢了,至于在Spring中如何使用AOP,我會(huì)在今后的博文中針對(duì)一個(gè)實(shí)例進(jìn)行講解,另外本次關(guān)于AOP我們并沒(méi)有講完,還有很多的概念同樣我會(huì)在以后的博文中進(jìn)行講解!敬請(qǐng)期待!


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 德惠市| 双流县| 伊吾县| 寿宁县| 威信县| 河北区| 铜山县| 上杭县| 迭部县| 淮阳县| 万年县| 称多县| 邵阳市| 柘城县| 林芝县| 盐城市| 阿坝县| 阿拉尔市| 昔阳县| 天等县| 兰坪| 故城县| 抚顺县| 余姚市| 溧水县| 固安县| 太保市| 马公市| 丘北县| 开化县| 莎车县| 南华县| 凉山| 曲阳县| 阿拉尔市| 满城县| 鄱阳县| 金堂县| 南雄市| 仙桃市| 连江县|