吃透動態代理,解密spring AOP源碼(一)

首先講講代理模式。什麼是靜態代理,爲何須要動態代理?設計模式

代理模式:

定義:給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。
目的:1.經過引入代理對象來間接訪問目標對象,防止直接訪問目標對象給系統帶來的沒必要要複雜性;2.經過代理對象對原有的業務加強。ide

如圖代理模式類圖:測試

clipboard.png

簡單看了下圖解就開始上代碼吧
1.先定義一個抽象對象即公共接口類this

/**
 * 負責生產男性用品
 */
public interface ManToolFactory {  
    public void saleManTool(String size);
}

2.真實對象spa

/**
 * A工廠負責生產男性用品
 */
  public class AManFactory implements ManToolFactory {

    @Override
    public void saleManTool(String size) {
        System.out.println("A工廠出售男性用品,大小爲" + size );
    }

}

3.代理對象設計

/**
 * 靜態代理類
 */
public class StaticProxy implements ManToolFactory {

    // 代理的真實對象,多個的話考慮公用object也就是動態代理的實現
    private ManToolFactory manFactory;// 相似搬運工,代理真實對象的方法

    public StaticProxy(ManToolFactory manFactory) {
        this.manFactory= manFactory;
    }

    @Override
    public void saleManTool(String size) {
        dosomeThingBefore();//前置加強
        manFactory.saleManTool(size);
        dosomeThingAfter();//後置加強
    }

    public void dosomeThingBefore() {
        System.out.println("售前服務,負責產品的調研工做");
    }

    public void dosomeThingAfter() {
        System.out.println("售後服務,送門服務,三包等");
    }
}

測試類:代理

public class StaticProxyTest {

    public static void main(String[] args) {
        // 真實對象:A工廠生產男性用品
        ManToolFactory manToolFactory = new AManFactory();
        // 代理對象:負責代購男性用品
        StaticProxy staticProxy = new StaticProxy(manToolFactory);
        // 代理對象完成代購
        staticProxy.saleManTool("100");
    }
}
  • 由代理模式可加強原有業務。 問題來了,現在代理不單單幫忙代購男性用品,也要代購女性用品,那一樣的咱們就再定義一個接口。
/**
 * 負責生產女性用品的抽象對象
 */
public interface WomanToolFactory {

    public void saleWomanTool(Double length);
}
/**
 * B工廠專門負責生產男性用品(真實對象)
 */
public class BWomanFactory implements WomanToolFactory {

    @Override
    public void saleWomanTool(Double length) {
        System.out.println("B工廠生產女性用品,長度" + length);
    }

}
此時代理類須要修改,開始思路以下


public class StaticProxy implements ManToolFactory,WomanToolFactory  {

    private ManToolFactory manFactory;
    private WomanToolFactory womanFactory;
     @Override
    public void saleManTool(String size) {
      //TODO
    }
     @Override
    public void saleWomanTool(Double length) {
      //TODO
    }

那若是再多一個業務,代購點別的產品,那是否是又要再實現一個接口,這樣就違背了設計模式的原則:開閉原則,擴展能力差,可維護性差.
所以動態代理就出現了。動態代理請看下節code

相關文章
相關標籤/搜索