[英]spring aop proxy object
我現在正在讀一本用韓語寫的春季書,我的英語很差。 請理解。
在本書中,它表示如果Spring使用接口,則使用動態代理啟動Spring,並且在不使用接口的情況下使用CGLIB啟動類。 我不清楚它是什么意思。 你能幫我理解它的深層含義嗎?
我不知道這個問題是不是很愚蠢。 但我只是好奇THX。
代理本質上是客戶端和對象之間的中介,以便它實現對象的非最終方法。 代理接口是相對簡單的,因為接口只是需要實現的方法列表,便於攔截方法調用。
Java中的Proxy類是一個實現運行時指定的接口列表的類。 然后,代理具有與之關聯的InvocationHandler ,它將在代理上進行的方法調用委托給被代理的對象。 它充當間接層,因此不會在對象本身上調用方法,而是在其代理上調用方法。 InvocationHandler
只有一個需要實現的方法:
public Object invoke(Object proxy, Method method, Object[] args)
同時,調用該方法的客戶端無法區分代理與其底層對象表示之間的區別,也不應該關注它。
動態地代理類而不是接口,並不是那么簡單。 雖然Java的Proxy
僅僅是一個運行時實現的接口或一組接口,對象沒有實現一個接口。 因此,代理類需要字節碼生成,這是cglib等庫發揮作用的地方。 cglib為代理類提供支持,因為它可以動態生成字節碼(即類文件),這意味着它可以在運行時以Java的Proxy
可以在運行時實現接口的方式擴展類。
代理有很多用途。 一種這樣的用途是延遲加載。 延遲加載允許僅在需要時加載對象圖中的對象。 而不是將它們全部加載到內存中,這可能是昂貴且資源密集的,我們可以在需要訪問它們時即時加載它們,例如迭代對象集合。 我們只需一次加載一小組,而不是加載整個集合。 這可以通過代理來實現。 代理表示延遲加載的對象。 在代理上調用方法之前,不會加載可能從數據庫加載的對象本身。 攔截方法調用的代理然后將對象加載到內存中並將方法調用委托給它。
以下是延遲加載實現的示例:
public abstract class LazilyLoadedObject implements InvocationHandler {
private Object target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (target == null) {
target = loadObject();
}
return method.invoke(target, args);
}
/**
* Loads the proxied object. This might be an expensive operation
* or loading lots of objects could consume a lot of memory, so
* we only load the object when it's needed.
*/
protected abstract Object loadObject();
}
上面的InvocationHandler
將被傳遞給代理,以便InvocationHandler
處理在代理上InvocationHandler
。 處理程序檢查對象是否已加載。 如果沒有,它將調用loadObject()
,這可能是某種檢索對象的數據庫查詢。
代理非常強大,因為它們允許攔截方法調用。 AOP就屬於這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.