spring aop概念以及jdk的動態代理
AOP(Aspect-Oriented Programming),又稱為面向切面程式設計。作為一種程式設計思想,AOP是 OOP(Object-Oriented Programing面向物件程式設計)一種 補充和完善。
AOP相關的術語
1.0 關注點
關注點就是所關注的與業務無關的公共服務或系統級服務,如日誌記錄,許可權檢查,事務管理等。關注點通常稱為橫切關注點,表示要做什麼。
2.0 連線點
連線點就是程式執行過程中明確的階段點,如方法的呼叫或異常的丟擲等。其實,關注點的功能就是新增到相應的連線點。因此,連線點表示在那裡做。在spring aop中,一個連線點總代表一個方法的執行。
3.0增強
增強就是在特定的連線點處所執行的處理邏輯,也就是面向連線點注入程式碼。增強通常有稱為增強處理,表示具體做什麼。
3.1.0 Before Advice 前置處理,在連線點執行前處理。
3.2.0 AfterReturning Advice後置增強,在連線點成功執行後呼叫。
3.3.0 AfterThrowing Advice,異常增強,在連線點丟擲異常後被呼叫。
3.4.0 Around Advice 環境增強,在連線點執行前與執行後被呼叫。
4.0 切入點
切入點就是可以插入增強的連線點。

image.png
Jdk的動態代理
AOP是基於代理實現的,代理分為2大類,靜態代理與動態代理。靜態代理是在編譯時候生成的,動態代理是在執行的時候生成的。
下面看一個jdk的動態代理的deom。
jdk動態代理需要一個介面,以及其實現類。
定義介面 UserService
package dflx; public interface UserService { public void add(); public void serach(); }
以及其實現類UserImpl,和jdk動態代理類MyJdkProxy
public class UserImpl implements UserService { @Override public void add() { System.out.println(" add user"); } @Override public void serach() { System.out.println("search user"); } } class MyJdkProxy implements InvocationHandler{ private UserService user; public MyJdkProxy(UserService user) { this.user=user; } public UserService createJDKProxy(){ return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("add")) { System.out.println("記錄日誌"); return method.invoke(user, args); }else { return method.invoke(user, args); } } }
測試類 MyJdkTest 如下
package dflx; import org.junit.Test; public class MyJdkTest { @Test public void test() { //代理物件 UserService user=new UserImpl(); //建立代理 MyJdkProxy myJdkProxy=new MyJdkProxy(user); UserService proxy=myJdkProxy.createJDKProxy(); proxy.add();//對add方法進行了增強 proxy.serach(); } }
對add方法,進行了增強。
結果如下
記錄日誌 add user search user