1. 程式人生 > 其它 >17.Spring學習筆記_靜態代理再理解

17.Spring學習筆記_靜態代理再理解

代理:

代理即是將被代理物件進一步封裝後,隱藏被代理物件,在不修改被代理物件程式碼的前提下完成一些額外的處理。

靜態代理:

再來實際看一下日誌的部分的實際例子:

練習步驟:

  • 1、建立一個抽象角色,比如咋們平時做的使用者業務,抽象起來就是增刪改查!
//抽象角色:增刪改查業務
public interface UserService {
   void add();
   void delete();
   void update();
   void query();
}
  • 2、我們需要一個真實物件來完成這些增刪改查操作
//真實物件,完成增刪改查操作的人
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("查詢了一個使用者"); } }
  • 3、需求來了,現在我們需要增加一個日誌功能,怎麼實現!

  • 思路1 :在實現類上增加程式碼 【麻煩!】

  • 思路2:使用代理來做,能夠不改變原來的業務情況下,實現此功能就是最好的了!

  • 4、設定一個代理類來處理日誌!代理角色

//代理角色,在這裡面增加日誌的實現
public class UserServiceProxy implements UserService {
   private UserServiceImpl userService;
   //此處使用set方法
   public void setUserService
(UserServiceImpl userService) { this.userService = userService; } public void add() { log("add"); userService.add(); } public void delete() { log("delete"); userService.delete(); } public void update() { log("update"); userService.update(); } public void query() { log("query"); userService.query(); } public void log(String msg){ System.out.println("執行了"+msg+"方法"); } }

本次使用set方法實現;

  • 5、測試訪問類:
public class Client {
   public static void main(String[] args) {
       //真實業務
       UserServiceImpl userService = new UserServiceImpl();
       //代理類
       UserServiceProxy proxy = new UserServiceProxy();
       //使用代理類實現日誌功能!
       proxy.setUserService(userService);

       proxy.add();
  }
}

我們在不改變原來的程式碼的情況下,實現了對原有功能的增強,這是AOP中最核心的思想

聊聊AOP:縱向開發,橫向開發
在這裡插入圖片描述