AOP即面向切面編程。AOP是基於代理模式的。
代理模式:
當我們需要修改一個類,在類中加入代碼時,為了不破壞這個類的封裝性。可以使用代理模式,建立一個代理類。
比如:修改需求,在調用UserController類的saveUser()方法之前要判斷用戶是否有權限,普通的辦法我們可以直接修改類中的saveUser()方法。用代理模式就是,建立一個代理類,在調用saveUser()方法之前再加入鑒權的方法,以后調用時我們調用代理類,而不直接調用UserController類了。
class UserControllerProxy {
private UserController userController;
public void saveUser() {
checkAuth();
userController.saveUser();
}
}
不過這只是靜態代理,AOP的一個重要應用是Spring AOP,它是基於動態代理的,道理和靜態代理差不多。對於實現了接口的,Spring AOP會使用JDK Proxy,去創建代理對象,后面直接調用代理對象,而對於沒有實現接口而是繼承了類的對象,Spring AOP會使用Cglib,生成一個被代理對象的子類,后面直接調用子類。
不過Spring AOP是在程序運行的過程中織入的,是動態織入。還有一種面向切面的是AspectJ,它是基於靜態織入的。靜態織入是指在編譯時期就織入,即編譯出來的class文件,字節碼就已經被織入了。官方文檔的一張圖:
AOP相關概念:
將多個類共有的功能抽象出來,形成一個新的類,這個類就叫做切面,或者切片(Aspect),在我們需要用到這個功能的時候就調用這個切面類中的方法,依靠依賴注入DI將功能注入進去。
例如上面的添加鑒權功能,就可以建立一個鑒權的切面類,在需要用到的地方切進去,這個切入的地方就叫做切入點(Joinpoint)。類似的功能就是攔截器(Intercepter)。攔截這個概念是AOP的一種實現策略,在某個方法被執行時,攔截器可以攔截下來,在方法執行之前執行別的方法,比如鑒權。也可以在方法執行之后再執行別的方法,攔截器就是一個動態攔截Action調用的對象。他提供了中機制是開發者可以在一個Action執行之前或執行之后插入需要的代碼。
————————————————
版權聲明:本文為CSDN博主「藤原豆腐店-」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wanderlustLee/article/details/80457698