Spring面試題


一、SpringAOP的原理(參考1)

AOP(面向切面)面向對象編程更多的操作是在縱向部分(即繼承,接口實現之類),這就導致一些需要在橫向上(即業務代碼方法中的前后)嵌入的非核心代碼得在每一個方法上都要去寫(比如日志,權限,異常處理等--》AOP的應用)。它們散布在各方法的橫切面上,造成代碼重復,也不利於各個模塊的重用(畢竟,不同方法還是有所區別)。 AOP就是為了解決這種難題而生的 從AOP這個英文縮寫來看就好。。。A是一把刀,把P的突出部分切出來(類比於圍繞方法設定的日志,權限等需求,它們都是屬於核心方法外的通用服務),它們有一個共性----圓溜溜的(就像一個工具箱中的扳手,鉗子,螺絲刀之類的),所以能把它們集合成一塊兒(它們都具有’工具‘的屬性),就是中間的O。重新給接回去的時候,就着不同的需求,用O中不同的工具就好(通過不同的方法或注解指明)。

概念陳列: 目標對象,AOP代理對象,連接點,切入點,攔截器,通知,織入。

假設有一個對象A(目標對象),外部的請求人B要想訪問到A,需要通過一個安檢過程(連接點,比如驗證權限m1,登錄密碼m2,身份識別m3等)。B開始訪問后,首先得經過第一層的安檢(准備走誰(introductionInterceptor)的哪一層安檢(PointCut--》指定到具體的安檢流程),由你定義的interceptor攔截器決定),即權限驗證m1(切入點)。通過這一層后,監控整個訪問過程的你可以決定是否要向大家伙兒通報外部請求的訪問情況【像:B那孫子進來啦 OR B那孫子帶着貪玩藍月系來嘞 OR B那小子是渣渣輝的部下】(在訪問開始前,還是結束后,還是全程播報---->這就是’通知‘)。於A而言,他覺得直接跟B接觸可能不太安全,所以A把自己的一些權限給到了代理對象Proxy_A,並讓Proxy_A去正面’剛(也即織入,A間接的給自己加持了一副鎧甲)‘B(或許是來者不善乜)。Proxy_A是怎樣產生的呢?這就是AOP動態代理的輔助了。簡單來講,不論你是什么代理---》Proxy_某個目標對象,只要是通過JDK或者CGLib的代理副本傳送門(類比於抽象)進入到剛B的’對戰場景‘中,那么,他都算是A(或者其他目標對象)的代言人。

項目springAOP的應用

  1. 日志 (最下面有日志注解)
  2. 權限
  3. spring注解事務,框架自帶的

二、Spring事務

  • 什么是事務?(參考2)

事務是邏輯上的一組操作,組成這組操作的各個邏輯單元,要么一起成功,要么一起失敗。

(例:一個Service方法中調用了多個dao方法,要么一起成功,要么一起失敗!)

  • 事務的特性(ACID)

原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要么全部完成,要么完全不起作用。

一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處於一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。

隔離性(Isolation):可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。

持久性(Durability):一旦事務完成,無論發生什么系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。

  • Spring進行事務操作的方式

  • 編程式事務管理

  • 聲明式事務管理

    • 基於xml配置文件方式
    • 基於注解方式(@Transactional)
  • spring事務失效場景(參考3)(參考4)

  1. (異常類型亂配置)異常類型錯誤,默認是runtimeException才回滾(異常拋出類型不對)
  2. (異常被狗吃了)異常被catch住,忘記拋出,記住必須拋異常才回滾(異常被吃)
  3. (配置手殘黨)spring忘記配置掃描包,bean不在spring容器管理下
  4. (經典失效場景)是否發生自調用問題(自身調用)
  5. 注解所在方法是否為public修飾
  6. (配置手殘黨)數據源沒有配置事務管理器
  7. 不支持事務的DB,如MyISAM


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM