https://juejin.im/post/5bf4fc84f265da611b57f906 - AOP如何實現及實現原理(裏面附有源碼)
講到動態代理就不得不說代理模式了, 代理模式的定義:給某一個對象提供一個代理,並由代理對象控制對原對象的引用。代理模式包含如下角色:subject:抽象主題角色,是一個接口。該接口是對象和它的代理共用的接口; RealSubject:真實主題角色,是實現抽象主題接口的類; Proxy:代理角色,內部含有對真實對象RealSubject的引用,從而可以操作真實對象。代理對象提供與真實對象相同的接口,以便代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
建StuInvocationHandler類,實現InvocationHandler接口,這個類中持有一個被代理對象的實例target。InvocationHandler中有一個invoke方法,所有執行代理對象的方法都會被替換成執行invoke方法。
/**
* Created by Mapei on 2018/11/7
*/
public class StuInvocationHandler<T> implements InvocationHandler {
//invocationHandler持有的被代理對象
T target;
public StuInvocationHandler(T target) {
this.target = target;
}
/**
* proxy:代表動態代理對象
* method:代表正在執行的方法
* args:代表調用目標方法時傳入的實參
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理執行" +method.getName() + "方法");
Object result = method.invoke(target, args);
return result;
}
}
proxy、method、args謹記~
https://juejin.im/post/5b45bd715188251b3a1db54f - JAVA 註解的基本原理
沒錯,註解的本質就是一個繼承了 Annotation 接口的接口。有關這一點,你可以去反編譯任意一個註解類,你會得到結果的。
一個註解準確意義上來說,只不過是一種特殊的註釋而已,如果沒有解析它的代碼,它可能連註釋都不如。
而解析一個類或者方法的註解往往有兩種形式,一種是編譯期直接的掃描,一種是運行期反射。反射的事情我們待會說,而編譯器的掃描指的是編譯器在對 java 代碼編譯字節碼的過程中會檢測到某個類或者方法被一些註解修飾,這時它就會對於這些註解進行某些處理。
典型的就是註解 @Override,一旦編譯器檢測到某個方法被修飾了 @Override 註解,編譯器就會檢查當前方法的方法簽名是否真正重寫了父類的某個方法,也就是比較父類中是否具有一個同樣的方法簽名。
這一種情況只適用於那些編譯器已經熟知的註解類,比如 JDK 內置的幾個註解,而你自定義的註解,編譯器是不知道你這個註解的作用的,當然也不知道該如何處理,往往只是會根據該註解的作用範圍來選擇是否編譯進字節碼文件,僅此而已。
總結:尷尬的一批,前天面試面試官也問到了註解的原理,現在回想起來。真的有不少地方答錯了。
下面總結一下:註解其實就是一個特殊的註釋,當.java等文件被解釋成.class文件時,他和傳統的servlet寫法其實解析後的文件都差不多。只是寫法不同。更加簡單。註解,是在編譯期的,而動態代理,連接新的方法,其實在編譯期間就把這些方法加成接口等配置好,等到使用的時候,連接起來,分配內存以供運行。
爲什麼會有面向切面編程(AOP)?
我們知道Java是一個面向對象(OOP)的語言,但它有一些弊端,比如當我們需要爲多個不具有繼承關係的對象引入一個公共行爲,例如日誌、權限驗證、事務等功能時,只能在在每個對象裏引用公共行爲。這樣做不便於維護,而且有大量重複代碼。AOP的出現彌補了OOP的這點不足。
Spring AOP 中設計的一些核心知識,面試問題?
1、能說一下Spring AOP用的是哪種設計模式?
回答:代理模式。
2、 能簡單聊一下你對代理模式的理解嗎?
代理模式 balabala......,記住一些貼近日常的示例方便理解,如買火車票,Windows 裏面的快捷方式...
3、 知道JDK代理和Cglib代理有什麼區別?
我們不需要創建代理類,JDK 在運行時爲我們動態的來創建,JDK代理是接口 balabala
若目標類不存在接口,則使用Cglib生成代理,balabala
不管是JDK代理還是Cglib代理本質上都是對字節碼進行操作,balabala
4、讓你實現一個JDK實現動態代理?你的思路是什麼?
照葫蘆畫瓢,照貓畫虎。
Proxy: 定義一個自己的Proxy類
InvocationHandler:定義一個自己的InvocationHandler類
ClassLoad:自定義類加載器(方便加載我們自己指定的路徑下面的類)
SpringAOP的在實際應用中場景有哪些?
- Authentication 權限
- Caching 緩存
- Context passing 內容傳遞
- Error handling 錯誤處理
- Lazy loading 懶加載
- Debugging 調試
- logging,tracing,profiling and monitoring 記錄跟蹤 優化 校準
- Performance optimization 性能優化
- Persistence 持久化
- Resource pooling 資源池
- Synchronization 同步
- Transactions 事務
- Logging 日誌
昨天被面試官問到了aop應用場景,回答得還是不好。通過查閱資料把以上總結一下:
爲什麼會應用到這些場景,這就和aop的增強等功能,和添加擴展方法等功能相對應了。操作一個切點之前當前之後都可以使用aop的增強,擴展鏈接方法功能進行操作,例如寫日誌啊,記錄跟蹤,同步等等。。就是以上的應用場景。。爲什麼使用動態代理(aop)而不使用靜態代理呢?因爲如果爲每一個方法都使用靜態代理添加aop這些功能的話如寫日誌,記錄跟蹤,同步等。。,編譯期間就會把這些東西加載到內存中去,會消耗非常大的內存。而使用動態代理根據用戶請求分配新的內存。。可以說大大降低了壓力
https://blog.csdn.net/elim168/article/details/78216504 - Spring Aop(七)——基於XML配置的Spring Aop
注:介紹了aop的配置,可以看下這個博主的博客
刷面經~