AOP之認識代理(靜態代理)

來源:互聯網
上載者:User

 

AOP 全名Aspect-oriented programming 中文翻譯為面向切面編稱.首先理解代理:        來看一個簡單的例子package com.yongping.aoptest;

import java.util.logging.Level;
import java.util.logging.Logger;

public class HelloWorld ...{
    
    private Logger log=Logger.getLogger(this.getClass().getName());
    
    public void hello(String name)...{
        //記錄方法執行開始
        log.log(Level.INFO, "hello method begin..");
        //程式核心邏輯
        System.out.println("Hello"+name);
        //記錄方法執行結束
        log.log(Level.INFO, "hello method end...");
        
    }

}

 

當執行hello()方法時,希望在核心邏輯過程執行前後加上記錄動作,最簡單的方法就是如上.對於HelloWorld來說,紀錄執行前後的動作並不是HelloWorld的業務邏輯,這樣就增加了代碼的冗餘,如果客戶要求更改紀錄執行時的輸出語句,那就得大動幹戈,逐個類進行修改.可以使用代理來解決這個問題,常用的有兩種代理方式    靜態代理(Static proxy)與動態代理(Dynamic proxy). 靜態代理:代理對象與被代理對象都必須實現同ㄧ個介面,在代理對象中可以實現日誌紀錄等操作,並在需要的時候掉用被代理對象,這樣的話被代理對象就只保留業務過程.(其實不用實現同一個介面也可以實現代理,但是在程式被調用的時候,掉用的是介面的引用,調用程式首先處理的是代理對象,由代理對象調用被代理的對象,展現給用戶的是在被代理對象的業務邏輯中添加了代碼.)在使用的時候順序是 先定義一個介面的引用,再創建一個代理的對象給介面引用,創見代理對象時注入邏輯實現的對象.這個過程很巧妙.調用者來說,我只調用介面類型,介面給了他一個代理,代理裡面封裝了邏輯對象,封裝外圍加入了非邏輯的log. 詳細過程如下: 介面:

package com.yongping.aoptest;

public interface IHello ...{
    
    public void hello(String name);

}

 

核心邏輯實現類: package com.yongping.aoptest.impl;

import com.yongping.aoptest.IHello;

public class StrHelloImpl implements IHello ...{

    public void hello(String name) ...{
    
        System.out.println("Hello,"+name);

    }

}

 

代理實現類: 

package com.yongping.aoptest.impl;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.yongping.aoptest.IHello;

public class ProxyHello implements IHello ...{
    private Logger log = Logger.getLogger(this.getClass().getName());
    
    public IHello helloObject;
    public ProxyHello(IHello helloObject)...{
        this.helloObject=helloObject;
    }

    public void hello(String name) ...{
        log.log(Level.INFO, "method star.........");
        helloObject.hello(name);
        log.log(Level.INFO, "method end..............");

    }

}

 

測試過程(使用junit4.0)package com.yongping.aoptest;

 

import org.junit.Test;

 

import com.yongping.aoptest.impl.ProxyHello;

import com.yongping.aoptest.impl.StrHelloImpl;

 

 

public class TestHello ...{

    @Test

    public void testHello()...{

        IHello helloworld;

        helloworld=new ProxyHello(new StrHelloImpl());

        helloworld.hello("guoguo");

        

    }

 

}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.