spring的面向方面編程

        上次的博文深刻淺出Spring(二) IoC詳解中,我爲你們簡單介紹了一下Spring框架核心內容中的IoC,接下來咱們繼續講解另外一個核心AOP(Aspect Oriented Programming),即面向切面編程。 java

一、OOP回顧

       在介紹AOP以前先來回顧一下你們都比較熟悉的OOP(Object Oriented Programming)。OOP主要是爲了實現編程的重用性、靈活性和擴展性。它的幾個特徵分別是繼承、封裝、多態和抽象。OOP重點體如今編程架構,強調的是類之間的層次關係。 編程

二、OOP缺陷

       爲了更好的說明OOP的概念,咱們接下來說一個OOP的實例,重點分析OOP存在哪些缺陷,以便更好的理解AOP的相關內容。 安全

       先看以下的一張圖: 架構

 

       上面這張圖有三個類:Dog,Cat和Duck,他們都有一個方法run。按照OOP的設計理念,咱們很容易就會想到抽象出一個Animal父類,同時讓這三個子類繼承Animal父類。這樣的設計能夠用以下的圖示表示: 框架

 

       在OOP思想中,咱們會使用大量的相似上圖的編程方式,對類進行抽象、繼承、封裝和多態來實現編程的重用性、靈活性和擴展性。可是這樣的編程仍然有必定的侷限性,有時候,OOP並不能很好解決咱們再實際開發中遇到的問題。爲了說明這個問題,看下面的圖示: 性能

 

       看到上面的圖,咱們暫時還不能發現有什麼問題。爲了你們便於理解,接下來我來給你們講解一下上面類圖的實現過程。描述以下:馬戲團有一條表演的小狗,這條小狗能夠跑和跳,可是它完成跑和跳兩個動做以前必須是在接到馴獸師發出的命令後,同時完成跑和跳的動做以後,馴獸師會給與響應的獎勵,好比一塊肉。 優化

       瞭解了實現過程以後,咱們在來看一下具體的代碼。  this

public class Dog {   
        public void run() {
            System.out.println("馴獸師發出命令!")
            System.out.println("小狗開始跑!");
            System.out.pringln("馴獸師給與獎勵");
        }  
        public void jump() {
            System.out.println("馴獸師發出命令!")
            System.out.println("小狗開始跳!");
            System.out.pringln("馴獸師給與獎勵");
        }
    }

spa

    仔細看上面的代碼,咱們能夠看出在run方法和jump方法中,存在一些相同的內容(馴獸師發出命令和給與獎勵),這些內容並不能徹底進行抽象,即不能按照OOP編程思想進行處理。相似這樣的狀況一樣會出如今咱們編程中的不少地方,例如:日誌記錄、性能統計、安全控制、事務處理、異常處理等等。可是這樣的狀況該如何解決呢?這就引入了AOP編程思想。

 

三、AOP簡介

       AOP爲Aspect Oriented Programming的縮寫,即面向切面編程(也叫面向方面),是一種能夠經過預編譯方式和運行期動態代理實如今不修改源代碼的狀況下給程序動態統一添加功能的一種技術。 .net

 

四、AOP實現實例

      爲了你們更好的理解AOP如何實現,接下來咱們優化一下上述代碼。

      首先是Dog類

public interface Animal {
        public void run();
        public void jump();
    }
    
    public class Dog implements Animal{
        public void run(){
            System.out.println("小狗開始跑!");
        }    
        public void jump(){
            System.out.println("小狗開始跳!");
        }        
    }

     對比以前的代碼咱們能夠明顯看出,咱們將關於馴獸師的相關內容從run和jump中進行了抽取,接下來,咱們如何在程序運行中將關於馴獸師的動做加入到程序中呢?這就是咱們此次用到的AOP實現的核心技術動態代理(Dynamic Proxy)。具體代碼以下:

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("馴獸師發出命令!");
        }
        
        private void award(){
            System.out.println("馴獸師給與獎勵!");
        }
    }

 上述代碼實現完成以後,咱們改如何調用呢?參考代碼以下: 
public class Client {
        public static void main(String[] args) {
            MyProxy hander = new MyProxy();
            Animal dog = (Animal)hander.createProxyInstance(new Dog());
            dog.run();
            dog.jump();
        }
    }
  執行結果以下:

 

       關於AOP編程的實例演示就完成了,接下來從新回顧一下AOP與OOP的相關概念。

 

五、AOP與OOP的關係

       OOP針對業務處理過程的實體(Dog、Cat、Duck)及其屬性和行爲(run)進行抽象封裝,以得到更加清晰高效的邏輯單元劃分。而AOP則是針對業務處理過程當中(run或jump)的切面(command和award)進行提取,它所面對的是處理過程當中的某個步驟或階段,以得到邏輯過程當中各部分之間低耦合性的隔離效果。這兩種設計思想在目標上有着本質的差別。

       本篇文章到此爲止基本上對AOP的概念就講解完畢了,至於在Spring中如何使用AOP,我會在從此的博文中針對一個實例進行講解,另外本次關於AOP咱們並無講完,還有不少的概念一樣我會在之後的博文中進行講解!敬請期待!

轉載請註明出處:http://www.cnblogs.com/zs234/
相關文章
相關標籤/搜索