探祕AOP實現原理
阿新 • • 發佈:2018-11-10
可以這麼說,AOP是基於動態代理實現的。
那麼,這個過程是怎樣的?
首先,我們有這樣的一個Service類,它是被作為切面的一個類:
public class Service implements User {
public void addUser(){
System.err.println("模擬增加使用者");
}
}
它實現了User介面,因為我們要使用JDK動態代理來實現這個過程,所以必須要實現這樣一個介面。
然後,我們生成一個代理物件:
var service=(User)Proxy.newProxyInstance(Service.class.getClassLoader(), new Class[]{User.class}, new Handler(new Service()));
這裡需要實現一個handler:
public class Handler implements InvocationHandler { private User target; public Handler(User target) { this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.err.println("模擬日誌記錄"); return method.invoke(target,args); } }
這個handler的作用是負責方法呼叫前的邏輯處理,
我們執行一下:
service.addUser();
可以看到會在addUser方法呼叫前執行日誌記錄,那麼我們在Service類中增加一個方法:
public void delUser(){
System.err.println("模擬刪除使用者");
}
也可以看到日誌記錄是正常工作的,那麼我們梳理一下AOP的實現過程:使用動態代理生成一個目標物件的代理物件,然後這個代理物件在呼叫目標物件之前總會執行特定的方法呼叫前邏輯。