1. 程式人生 > 其它 >Spring面試題

Spring面試題

1、Spring是什麼?

Spring是一個輕量級的IoC和AOP容器框架。是為Java應用程式提供基礎性服務的一套框架,目的是用於簡化企業應用程式的開發,它使得開發者只需要關心業務需求。
主要包括以下七個模組:

  • Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
  • Spring Core:核心類庫,所有功能都依賴於該類庫,提供IOC和DI服務;
  • Spring AOP:AOP服務;
  • Spring Web:提供了基本的面向Web的綜合特性,提供對常見框架如Struts2的支援,Spring能夠管理這些框架,將Spring的資源注入給框架,也能在這些框架的前後插入攔截器;
  • Spring MVC:提供面向Web應用的Model-View-Controller,即MVC實現。
  • Spring DAO:對JDBC的抽象封裝,簡化了資料訪問異常的處理,並能統一管理JDBC事務;
  • Spring ORM:對現有的ORM框架的支援;

2、Spring優缺點?

  優點:
    * Spring屬於低入侵式設計,程式碼汙染極低。
    * Spring的DI機制將程式之間的依賴關係交給框架管理,程式間耦合度降低。
    * Spring提供AOP技術,將通用功能,例如安全、事務、日誌、許可權等功能集中式處理,增加複用性。
    * Spring對於主流框架有很好的支援。
  缺點:
    * Spring體系過於龐大,學習門檻高週期長。
    * Spring系統啟動慢,不具備熱部署,完全依賴虛擬機器或WEB伺服器的熱部署。

3、IOC理解

1、IOC 意為控制反轉,簡單來說就是將建立物件的權利交給Spring框架,Spring根據配置檔案或註解進行建立物件和管理各個例項之間的依賴關係。(原理:Java反射建立物件)
DI意為注入,就是在程式執行時,依賴IOC容器動態注入物件所需要的依賴物件。

2、注入方式有三種:基於構造器注入,基於setter方法注入,基於註解注入。

4、AOP理解

AOP 意為面向切面程式設計,用於將程式中常用的公共功能抽取封裝為一個可重用模組,減少重複程式碼,降低程式間耦合度,提高程式的可維護性。(原理:代理模式)

5、Spring啟動流程

...

6、BeanFactory和ApplicationContext區別?

...

7、Spring Bean的生命週期

1、Spring工廠例項化Bean
2、對Bean屬性進行賦值
3、執行BeanPostProcessor的前置方法
4、執行afterPropertiesSet()初始化方法
5、執行BeanPostProcessor的後置方法
6、工廠關閉執行destory()方法

8、Spring Bean的作用域

(1)singleton:預設作用域,單例bean,每個容器中只有一個bean的例項。
(2)prototype:為每一個bean請求建立一個例項。
(3)request:為每一個request請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。
(4)session:與request範圍類似,同一個session會話共享一個例項,不同會話使用不同的例項。
(5)global-session:全域性作用域,所有會話共享一個例項。如果想要宣告讓所有會話共享的儲存變數的話,那麼這全域性變數需要儲存在global-session中。

9、Spring框架中的Bean是執行緒安全的麼?如果執行緒不安全,那麼如何處理?

Spring 中的Bean並不具備執行緒安全策略,因此不具備執行緒安全特性,但是還是要根據不同情況。
1、對於作用域為prototype的Bean,每次都會建立一個新的物件,因此執行緒間不存在Bean的共享,因此不會有執行緒安全問題。
2、對於作用域為singleton的Bean,所有執行緒共享單例例項的Bean,因此是存線上程安全問題的。但如果是一個無狀態的Bean,則是執行緒安全的。

*有狀態Bean(Stateful Bean) :就是有例項變數的物件,可以儲存資料,是非執行緒安全的。
*無狀態Bean(Stateless Bean):就是沒有例項變數的物件,不能儲存資料,是不變類,是執行緒安全的。

對於有狀態的Bean,如果想要保證執行緒安全,可以將Bean的作用域改為prototype。

也可以採用ThreadLocal解決執行緒安全問題,為每個執行緒提供一個獨立的變數副本,不同執行緒只操作自己執行緒的副本變數。

ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。同步機制採用了“時間換空間”的方式,僅提供一份變數,不同的執行緒在訪問前需要獲取鎖,沒獲得鎖的執行緒則需要排隊。而ThreadLocal採用了“空間換時間”的方式。ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每一個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了。

10、Spring基於XML注入的Bean的方式

  • setter注入
  • 構造器注入
  • 靜態工廠
  • 例項工廠

11、Spring如何解決迴圈依賴的問題?

...

12、Spring的自動裝配

在spring中,使用autowire來配置自動裝載模式,物件無需自己查詢或建立與其關聯的其他物件,由容器負責把需要相互協作的物件引用賦予各個物件。

(1)在Spring框架xml配置中共有5種自動裝配:
    no:預設的方式是不進行自動裝配的,通過手工設定ref屬性來進行裝配bean。
    byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配。 
    byType:通過引數的資料型別進行自動裝配。
    constructor:利用建構函式進行裝配,並且建構函式的引數通過byType進行裝配。
    autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
(2)基於註解的自動裝配方式:
    使用@Autowired、@Resource註解來自動裝配指定的bean。在使用@Autowired註解之前需要在Spring配置檔案進行配置。在啟動spring IoC時,容器
    自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,
    當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性。在使用@Autowired時,
    首先在容器中查詢對應型別的bean:
  如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料;
  如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢;
  如果上述查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false。

@Autowired可用於:建構函式、成員變數、Setter方法
注:@Autowired和@Resource之間的區別:
(1) @Autowired預設是按照型別裝配注入的,預設情況下它要求依賴物件必須存在(可以設定它required屬性為false)。
(2) @Resource預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來裝配注入。

13、Spring 事務的實現方式和原理

Spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。
Spring只提供統一事務管理介面,具體實現都是由各資料庫自己實現,Spring會在事務開始時,
根據當前環境中設定的隔離級別,調整資料庫隔離級別,由此保持一致。
一、Spring 事務的種類:
  Spring 支援程式設計式事務和宣告式事務兩種
  > 程式設計式事務管理使用TransactionTemplate
  > 宣告式事務是基於AOP之上,就是通過對目標方法進行攔截植入事務相關程式碼實現事務功能。

宣告式事務最大的優點就是不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告或通過@Transactional註解的方式,便可以將事務規則應用到業務邏輯中,
減少業務程式碼的汙染。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像程式設計式事務那樣可以作用到程式碼塊級別。

二、事務傳播機制
  Spring 事務傳播機制說的是,當存在多個事務時,Spring 如何處理。事務傳播機制是使用ThreadLocal 實現的,當呼叫的方法是新執行緒呼叫的,事務傳播會失效。

① PROPAGATION_REQUIRED:(預設傳播行為)如果當前沒有事務,就建立一個新事務;如果當前存在事務,就加入該事務。
② PROPAGATION_REQUIRES_NEW:無論當前存不存在事務,都建立新事務進行執行。
③ PROPAGATION_SUPPORTS:如果當前存在事務,就加入該事務;如果當前不存在事務,就以非事務執行。
④ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
⑤ PROPAGATION_NESTED:如果當前存在事務,則在巢狀事務內執行;如果當前沒有事務,則按REQUIRED屬性執行。
⑥ PROPAGATION_MANDATORY:如果當前存在事務,就加入該事務;如果當前不存在事務,就丟擲異常。
⑦ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。

三、事務的隔離級別

① ISOLATION_DEFAULT:這是個 PlatfromTransactionManager 預設的隔離級別,使用資料庫預設的事務隔離級別。
② ISOLATION_READ_UNCOMMITTED:讀未提交,允許事務在執行過程中,讀取其他事務未提交的資料。
③ ISOLATION_READ_COMMITTED:讀已提交,允許事務在執行過程中,讀取其他事務已經提交的資料。
④ ISOLATION_REPEATABLE_READ:可重複讀,在同一個事務內,任意時刻的查詢結果都是一致的。
⑤ ISOLATION_SERIALIZABLE:所有事務逐個依次執行。

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

1、工廠模式:Spring通過工廠模式,通過BeanFactory和ApplicationContext建立物件。
2、單例模式:Spring Bean預設為單例模式。
3、策略模式:例如Resource的實現類,針對不同的資原始檔,實現了不同方式的資源獲取策略
4、代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB位元組碼生成技術
5、模板方法:可以將相同部分的程式碼放在父類中,而將不同的程式碼放入不同的子類中,用來解決程式碼重複的問題。比如RestTemplate, JmsTemplate, JpaTemplate
6、介面卡模式:Spring AOP的增強或通知(Advice)使用到了介面卡模式,Spring MVC中也是用到了介面卡模式適配Controller
7、觀察者模式:Spring事件驅動模型就是觀察者模式的一個經典應用。
8、橋接模式:可以根據客戶的需求能夠動態切換不同的資料來源。比如我們的專案需要連線多個數據庫,客戶在每次訪問中根據需要會去訪問不同的資料庫

15、Spring框架中有哪些不同型別的事件?

Spring 提供了以下5種標準的事件:
(1)上下文更新事件(ContextRefreshedEvent):在呼叫ConfigurableApplicationContext 介面中的refresh()方法時被觸發。
(2)上下文開始事件(ContextStartedEvent):當容器呼叫ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
(3)上下文停止事件(ContextStoppedEvent):當容器呼叫ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
(4)上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷燬。
(5)請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
     如果一個bean實現了ApplicationListener介面,當一個ApplicationEvent 被髮布以後,bean會自動被通知。

16、BeanFactory和FactoryBean的區別?

BeanFactory是Spring核心介面,功能複雜。 
而FactoryBean是一個Bean,當我們想要構建一個簡單的Bean而不希望實現繁多的方法時,我們就可以用FactoryBean進行建立。