17.Spring學習筆記_靜態代理再理解
阿新 • • 發佈:2021-05-12
代理:
代理即是將被代理物件進一步封裝後,隱藏被代理物件,在不修改被代理物件程式碼的前提下完成一些額外的處理。
靜態代理:
再來實際看一下日誌的部分的實際例子:
練習步驟:
- 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:縱向開發,橫向開發