1. 程式人生 > 實用技巧 >Spring基礎AOP,代理模式(待更 )

Spring基礎AOP,代理模式(待更 )

一,代理模式

  為什麼要學習代理模式?因為這就是SpringAOP的底層!【Spring AOP 和SpringMVC】

  代理模式分類:

    靜態代理

    動態代理

那到底什麼是代理模式呢?

  看圖!

最佳理解(優點惡趣味):上圖的關係可以這麼理解(mybatis就是房東,servioce就是中介,controller就是客戶

            通俗點也可以看作是 入土,代理幫你火化

              

1.2靜態代理

  角色分析:

    抽象角色:一般會使用介面或抽象類來解決(相當於圖上的租房,即 真實角色和代理共同想做的事情)

    真實角色:被代理角色(真正想做事的人)

    代理角色:代理真實角色,代理真實角色後,一般會做一些附屬操作

    客戶:訪問代理物件的人

程式碼步驟

   1,介面(抽象角色)

//租房
public interface Rent {

    public void rent();

}

  

  2,真實角色

//房東
public class Host implements Rent{

    public void rent() {
        System.out.println("房東要出租房子!");
    }
}

  3,代理角色

package com.king.demo01;

public class
Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { seeHouse(); host.rent(); hetong(); fare(); } //看房 public void seeHouse(){ System.out.println(
"中介帶你看房"); } //合同 public void hetong(){ System.out.println("籤合同"); } //收中介費 public void fare(){ System.out.println("收中介費"); } }

  4,客戶

package com.king.demo01;

//客戶
public class Client {
    public static void main(String[] args) {
        Host host = new Host();

        //代理
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

  代理模式的好處:

    可以使真實角色的操作更加純粹!,不用關注一些公共業務!

    公共的業務交給代理角色幹!,實現了業務分工!

    公共業務發生擴充套件的時候,方便集中管理!

  缺點

    一個真實角色只會產生一個代理角色,程式碼量會翻倍,開發效率會變低

1.3,靜態代理模式加深理解  

  介面(抽象角色)

package com.king.demo02;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();

}

  

  真實角色

package com.king.demo02;

//真實物件
public class UserServiceImpl implements UserService {
    public void add() {

        System.out.println("增加一個使用者");
    }

    public void delete() {
        System.out.println("刪除一個使用者");
    }

    public void update() {
        System.out.println("修改一個使用者");
    }

    public void query() {
        System.out.println("查詢一個使用者");
    }
}

  代理角色

package com.king.demo02;

public class userServiceProxy implements UserService {
    private UserServiceImpl userService;

    //通過setter進行屬性注入符合Spring的ioc實現方法DI的底層
    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public void log(String msg){
        System.out.println("使用了"+msg+"方法");
    }

    public void add() {
        log("add");
        userService.add();
    }

    public void delete() {
        log("del");
        userService.delete();
    }

    public void update() {
        log("update");
        userService.update();
    }

    public void query() {
        log("query");
        userService.query();
    }
}

  客戶

package com.king.demo02;

//客戶
public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        //先走無參建立物件
        userServiceProxy proxy = new userServiceProxy();
        //再通過set方法,實現屬性注入,當然有參也能實現,原因:符合Spring依賴注入的方式
        proxy.setUserService(userService);

        proxy.add();

    }
}

小結:使用代理模式的目的就是為了保證業務層程式碼保持不變,可變性強的操作,再代理層實現

二,動態代理模式

  1,動態代理和靜態代理的角色一樣

  2,動態代理的代理類是動態生成的,不是我們直接寫好的!

  3,動態代理的實現分為兩大類:基於介面的動態代理,基於類的動態代理

    基於介面-----JDK動態代理【在這裡使用這個】

    基於類:cglib

    java位元組碼實現:javasist

    

  需要了解兩個類:Poxy,代理    InvocationHandler,呼叫處理程式