通過面試題學Spring

準備面試複習Spring的時候詳細的看了一下Spring理論知識,結合網上的面試題,寫了這篇博客。如果需要更詳細的內容,推薦我的另一篇文章詳解Spring

爲什麼使用Spring(優缺點)?

  1. spring屬於低侵入式設計,代碼的污染極低;
  2. IoC容器往往是輕量級的,特別是與EJB容器相比。這是有利於在有限的內存和CPU資源的計算機上開發和部署應用程序。
  3. spring的**DI(依賴注入)**機制將對象之間的依賴關係交由框架處理,減低組件的耦合性;
  4. Spring提供了AOP技術,支持將一些通用任務,如安全、事務、日誌、權限等進行集中式管理,從而提供更好的複用。
  5. 在Spring測試應用程序很簡單,因爲依賴環境的代碼被移入到框架本身。此外,通過使用JavaBean-style pojo方式,使用依賴注入注入測試數據變得更容易。
  6. Spring提供了一致的事務管理界面,可以管理小到一個本地事務(例如,使用一個數據庫)和大到全局事務(例如,使用JTA)
  7. spring對於主流的應用框架提供了集成支持(Spring不排斥各種優秀的開源框架如Struts,Hibernate)
  8. Spring的web框架是一個設計良好的web MVC框架,它可以很好的替代其它web框架如struts或者其它web框架。

Spring的IoC理解:

  • DI依賴注入,和控制反轉(IoC)是同一個概念的不同角度的描述,即 應用程序在運行時依賴IoC容器來動態注入對象需要的外部資源。
  • IoC(Inverse of Control:控制反轉)是一種設計思想,就是將原本在程序中手動創建對象的控制權,交由Spring容器來管理。容器根據配置文件去創建實例和管理各個實例之間的依賴關係,對象與對象之間鬆散耦合,利於功能的複用。
  • Spring的DI有三種注入方式 :構造器注入、setter方法注入、根據註解注入。

之前某個類引用另一個類時,需要在類中new一個對象,現在通過IOC將這一過程交給Spring容器來執行。Spring使用java的反射機制和配置文件去創建實例和管理各個實例之間的依賴關係,運行時通過DI動態注入對象需要的外部資源。

IoC讓相互協作的組件保持鬆散的耦合

什麼是控制反轉(Inversion of Control)與依賴注入(Dependency Injection)?

  1. 控制反轉:是指將創建對象的功能交給Spring容器,在我們需要使用對象的時候不需要自己創建,可以直接從容器中獲取。
  2. 依賴注入:動態的向某個對象提供它所依賴的其他對象

BeanFactory和ApplicationContext有什麼區別?

  • 表面上看,applicationContext和BeanFactory是一樣。同樣加載bean定義,將bean連接在一起,分發bean。
  • 但applicationContext還增加了企業所需要的功能,比如,從屬性文件中解析文本信息和將事件傳遞給所指定的監聽器。ApplicationContext 包含BeanFactory 所有的功能,一般情況下,相對於BeanFactory,ApplicationContext會更加優秀。
  • 在資源寶貴的移動設備或者基於 applet 的應用當中, BeanFactory 會被優先選擇。

三個常用的ApplicationContext實現是:
在這裏插入圖片描述

AOP理解

概念
將那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任(例如事務處理、日誌管理、權限控制等)封裝起來,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可拓展性和可維護性。
AOP的實現

Spring AOP 和 AspectJ AOP 有什麼區別?

  • Spring AOP 屬於運行時增強,而 AspectJ 是編譯時增強。 Spring AOP 基於代理(Proxying),而 AspectJ 基於字節碼操作(Bytecode Manipulation)。

  • Spring AOP 已經集成了 AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。AspectJ 相比於 Spring AOP 功能更加強大,但是 Spring AOP 相對來說更簡單,

  • 如果我們的切面比較少,那麼兩者性能差異不大。但是,當切面太多的話,最好選擇 AspectJ ,它比Spring AOP 快很多。

Bean的理解

定義
bean 是一個被實例化,組裝,並通過 Spring IoC 容器所管理的對象。這些 bean 是由用容器提供的配置元數據創建的。

Spring支持的幾種bean的作用域?

Spring容器中的bean可以分爲5個範圍:

  • global-session: 全局session作用域,僅僅在基於portlet的web應用中才有意義,Spring5已經沒有了。Portlet是能夠生成語義代碼(例如:HTML)片段的小型Java Web插件。它們基於portlet容器,可以像servlet一樣處理HTTP請求。但是,與 servlet 不同,每個 portlet 都有不同的會話

Spring Bean的生命週期?

1.Spring 容器根據配置中的 bean 定義中實例化 bean。
2. Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置。
3. 如果 bean 實現 BeanNameAware 接口,則工廠通過傳遞 bean 的 ID 來調用 setBeanName()。
4. 如果 bean 實現 BeanFactoryAware 接口,工廠通過傳遞自身的實例來調用 setBeanFactory()。
5. 如果存在與 bean 關聯的任何 BeanPostProcessors,則調用 postProcessBeforeInitialization() 方法。
6. 如果爲 bean 指定了 init 方法( 的 init-method 屬性),那麼將調用它。
7. 最後,如果存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。
8. 如果 bean 實現 DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。
9. 如果爲 bean 指定了 destroy 方法( 的 destroy-method 屬性),那麼將調用它。

在這裏插入圖片描述

Spring框架中的單例Beans是線程安全的麼?

Spring框架並沒有對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和併發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更爲“prototype”。

Spring如何處理線程併發問題?

在一般情況下,只有無狀態的Bean纔可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明爲singleton作用域,因爲Spring對一些Bean中非線程安全狀態採用ThreadLocal進行處理,解決線程安全問題。

ThreadLocal和線程同步機制都是爲了解決多線程中相同變量的訪問衝突問題。同步機制採用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal採用了“空間換時間”的方式。

ThreadLocal會爲每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問衝突。因爲每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal

Spring MVC

流程?

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Spring 框架中都用到了哪些設計模式?

  1. 工廠模式:BeanFactory就是簡單工廠模式的體現,用來創建對象的實例;
  2. 單例模式:Bean默認爲單例模式。
  3. 代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術;
  4. 模板方法:用來解決代碼重複的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。
  5. 觀察者模式:Spring 事件驅動模型就是觀察者模式很經典的一個應用。定義對象鍵一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會得到通知被制動更新,如Spring中listener的實現–ApplicationListener。
  6. 適配器模式 :Spring AOP 的增強或通知(Advice)使用到了適配器模式、spring MVC 中也是用到了適配器模式適配Controller。

Spring 事務

實現方式與原理?

Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。

Spring 管理事務的方式有幾種?

  1. 編程式事務,在代碼中硬編碼TransactionTemplate。(不推薦使用)

  2. 聲明式事務,在配置文件中配置(推薦使用)

    聲明式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前後進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務

    • 基於XML的聲明式事務
    • 基於註解的聲明式事務
      聲明式事務最大的優點就是不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明或通過@Transactional註解的方式,便可以將事務規則應用到業務邏輯中。

聲明式事務管理要優於編程式事務管理,這正是spring倡導的非侵入式的開發方式,使業務代碼不受污染,只要加上註解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。

Spring 事務中的隔離級別有哪幾種?

在這裏插入圖片描述

spring的事務傳播行爲?

spring事務的傳播行爲說的是,當多個事務同時存在的時候,spring如何處理這些事務的行爲。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章