Java面試題2.0--spring aop

 
 

歡迎關注《Java面試題2.0》合集發佈頁,持續更新中!

 
 
Spring中AOP的應用場景、Aop原理、好處?
 
答:面向切面編程;用來封裝橫切關注點,具體可以在下面的場景中使用:
 
Authentication 權限、Caching 緩存、Context passing 內容傳遞、Error handling 錯誤處理Lazy loading懶加載、Debugging調試、logging, tracing, profiling and monitoring 記錄跟蹤優化 校準、Performance optimization 性能優化、Persistence 持久化、Resource pooling 資源池、Synchronization 同步、Transactions 事務
 
原理:AOP是面向切面編程,是通過動態代理的方式爲程序添加統一功能,集中解決一些公共問題。
優點:1.各個步驟之間的良好隔離性耦合性大大降低
     2.源代碼無關性,再擴展功能的同時不對源碼進行修改操作
 
Aspect 切面
 
AOP核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個日誌模塊可以被稱作日誌的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。
 
在Spring AOP 中,關注點和橫切關注的區別是什麼?
 
關注點是應用中一個模塊的行爲,一個關注點可能會被定義成一個我們想實現的一個功能。
 
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用,比如日誌,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬於橫切關注點。
 
連接點
 
連接點代表一個應用程序的某個位置,在這個位置我們可以插入一個AOP切面,它實際上是個應用程序執行Spring AOP的位置。
 
通知
 
通知是個在方法執行前或執行後要做的動作,實際上是程序執行時要通過SpringAOP框架觸發的代碼段。
 
Spring切面可以應用五種類型的通知:
 
before:前置通知,在一個方法執行前被調用。
after:後置增強, 在方法執行之後調用的通知,無論方法執行是否成功。
after-returning: 返回增強,在目標方法正常返回後執行,出現異常則不會執行,可以獲取到返回值。
after-throwing: 異常增強,在方法拋出異常退出時執行的通知。
around:環繞通知, 在方法執行之前和之後調用的通知。
 
切點
 
切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
 
什麼是引入?
 
引入允許我們在已存在的類中增加新的方法和屬性。
 
aop原理
 
我們需要在切面類上標註@EnableAspectJAutoProxy註解
 
1)、@EnableAspectJAutoProxy 開啓AOP功能
2)、@EnableAspectJAutoProxy 會給容器中註冊一個組件
    AnnotationAwareAspectJAutoProxyCreator
3)、AnnotationAwareAspectJAutoProxyCreator是一個後置處理器;
4)、容器的創建流程:
     1)、registerBeanPostProcessors()註冊後置處理器;創建
         AnnotationAwareAspectJAutoProxyCreator對象
     2)、finishBeanFactoryInitialization()初始化剩下的單實例bean
           1)、創建業務邏輯組件和切面組件
           2)、AnnotationAwareAspectJAutoProxyCreator攔截組件的創建過程
           3)、組件創建完之後,判斷組件是否需要增強
              是:切面的通知方法,包裝成增強器(Advisor);給業務邏輯組件創建一個代理對象
             (cglib);
5)、執行目標方法:
     1)、代理對象執行目標方法
     2)、CglibAopProxy.intercept();
           1)、得到目標方法的攔截器鏈(增強器包裝成攔截器MethodInterceptor)
           2)、利用攔截器的鏈式機制,依次進入每一個攔截器進行執行;
           3)、效果:
              正常執行:前置通知-》目標方法-》後置通知-》返回通知
              出現異常:前置通知-》目標方法-》後置通知-》異常通知
 
兩種代理方式的區別:
 
Spring AOP 的底層使用的使用 動態代理;共有兩種方式來實現動態代理,一個是 JDK 的動態代理,一種是 CGLIB 的動態代理,
 
JDK 只能代理那些實現了接口的類,如果一個類沒有實現接口,則無法爲這些類創建代理。此時可以使用 CGLIB 來進行代理。
 
JDK 的動態代理是通過反射和攔截器的機制來實現的,它會爲代理的接口生成一個代理類。
 
CGLIB的動態代理則是通過繼承的方式來實現的,把代理類的class文件加載進來,通過修改其字節碼生成子類的方式來處理。
 
JDK 動態代理只能對實現了接口的類生成代理,而不能針對類。
 
CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法,但是因爲採用的是繼承, 所以 final 類或方法無法被代理。
 
Spring AOP 中,如果實現了接口,默認使用的是 JDK 代理,也可以強制使用 CGLIB 代理,如果要代理的類沒有實現任何接口,則會使用 CGLIB 進行代理,Spring 會進行自動的切換。
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章