Java最全面試題之Spring篇

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是JavaEE面試題系列的第三篇,主要總結了Spring相關的問題,在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

談談你對 Spring 的理解?

Spring 是一個開源框架,爲簡化企業級應用開發而生。Spring 能夠是使簡單的 JavaBean 實現之前只有 EJB 才能實現的功能。Spring 是一個 IOC 和 AOP 容器框架。
Spring 容器的主要核心是:web

  • 控制反轉(IOC),傳統的 java 開發模式中,當須要一個對象時,咱們會本身使用 new 或者 getInstance 等直接或者間接調用構造方法建立一個對象。而在 spring 開發模式中,spring 容器使用了工廠模式爲咱們建立了所須要的對象,不須要咱們本身建立了,直接調用 spring 提供的對象就能夠了,這是控制反轉的思想。
  • 依賴注入(DI),spring 使用 javaBean 對象的 set 方法或者帶參數的構造方法爲咱們在建立所需對象時將其屬性自動設置所須要的值的過程,就是依賴注入的思想。
  • 面向切面編程(AOP),在面向對象編程(oop)思想中,咱們將事物縱向抽成一個個的對象。而在面向切面編程中,咱們將一個個的對象某些相似的方面橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日誌等。公用操做處理的過程就是面向切面編程的思想。AOP 底層是動態代理,若是是接口採用 JDK 動態代理,若是是類採用CGLIB 方式實現動態代理。

Spring 中的設計模式有哪些?

工廠模式:
BeanFactory就是簡單工廠模式的體現,用來建立對象的實例;面試

單例模式:
Bean默認爲單例模式。spring

代理模式:
Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術;數據庫

模板方法:
用來解決代碼重複的問題。好比. RestTemplate, JmsTemplate, JpaTemplate。編程

觀察者模式:
定義對象鍵一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都會獲得通知被制動更新,如Spring中listener的實現ApplicationListener。設計模式

Spring 的經常使用註解?

@Required:該註解應用於設值方法
@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變量。
@Qualifier:該註解和@Autowired 搭配使用,用於消除特定 bean 自動裝配的歧義緩存

Spring bean 的生命週期?

  • bean 定義:在配置文件裏面用<bean></bean>來進行定義。
  • bean 初始化:有兩種方式初始化:

①在配置文件中經過指定 init-method 屬性來完成
②實現 org.springframwork.beans.factory.InitializingBean 接口安全

  • bean 調用:有三種方式能夠獲得 bean 實例,並進行調用
  • bean 銷燬:銷燬有兩種方式

①使用配置文件指定的 destroy-method 屬性
②實現 org.springframwork.bean.factory.DisposeableBean 接口session

Spring 管理事務的方式?

  • 編程式事務,在代碼中硬編碼。
  • 聲明式事務,在配置文件中配置

聲明式事務又分爲:
①基於XML的聲明式事務
②基於註解的聲明式事務

Spring的事務傳播行爲有哪些?

一、PROPAGATION_REQUIRED:若是當前沒有事務,就建立一個新事務,若是當前存在事務,就加入該事務,該設置是最經常使用的設置。
二、PROPAGATION_SUPPORTS:支持當前事務,若是當前存在事務,就加入該事務,若是當前不存在事務,就以非事務執行。
三、PROPAGATION_MANDATORY:支持當前事務,若是當前存在事務,就加入該事務,若是當前不存在事務,就拋出異常。
四、PROPAGATION_REQUIRES_NEW:建立新事務,不管當前存不存在事務,都建立新事務。
五、PROPAGATION_NOT_SUPPORTED:以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
六、PROPAGATION_NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。
七、PROPAGATION_NESTED:若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則按REQUIRED屬性執行。

Spring事務的隔離級別?

一、ISOLATION_DEFAULT:這是個 PlatfromTransactionManager 默認的隔離級別,使用數據庫默認的事務隔離級別。
二、ISOLATION_READ_UNCOMMITTED:讀未提交,容許另一個事務能夠看到這個事務未提交的數據。
三、ISOLATION_READ_COMMITTED:讀已提交,保證一個事務修改的數據提交後才能被另外一事務讀取,並且能看到該事務對已有記錄的更新。
四、ISOLATION_REPEATABLE_READ:可重複讀,保證一個事務修改的數據提交後才能被另外一事務讀取,可是不能看到該事務對已有記錄的更新。
五、ISOLATION_SERIALIZABLE:一個事務在執行的過程當中徹底看不到其餘事務對數據庫所作的更新。

Spring 的通知是什麼?有哪幾種類型?

通知是個在方法執行前或執行後要作的動做,其實是程序執行時要經過 SpringAOP 框架觸發的代碼段。
Spring 切面能夠應用五種類型的通知:

  • before:前置通知,在一個方法執行前被調用。
  • after: 在方法執行以後調用的通知,不管方法執行是否成功。
  • after-returning: 僅當方法成功完成後執行的通知。
  • after-throwing: 在方法拋出異常退出時執行的通知。
  • around: 在方法執行以前和以後調用的通知。

什麼是 Spring IOC?IOC的優勢是什麼?

IOC
控制反轉,Spring IOC 負責建立對象,管理對象。經過依賴注入(DI),裝配對象,配置對象,而且管理這些對象的整個生命週期。

優勢:
IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試再也不須要單例和 JNDI 查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC 容器支持加載服務時的餓漢式初始化和懶加載。

BeanFactory 與 AppliacationContext 有什麼區別?

BeanFactory
基礎類型的 IOC 容器,提供完成的 IOC 服務支持。若是沒有特殊指定,默認採用延遲初始化策略。相對來講,容器啓動初期速度較快,所需資源有限。

ApplicationContext
ApplicationContext 是在 BeanFactory 的基礎上構建,是相對比較高級的容器實現,除了 BeanFactory 的全部支持外,ApplicationContext 還提供了事件發佈、國際化支持等功能。ApplicationContext 管理的對象,在容器啓動後默認所有初始化而且綁定完成。

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

Spring 框架支持如下五種 bean 的做用域:
singleton : bean 在每一個 Spring ioc 容器中只有一個實例。
prototype:一個 bean 的定義能夠有多個實例。
request:每次 http 請求都會建立一個 bean,該做用域僅在基於 web 的 Spring ApplicationContext 情形下有效。
session : 在一個HTTP Session中 , 一個bean定義對應一個實例。 該做用域僅在基於web 的Spring ApplicationContext 情形下有效。
global-session:在一個全局的 HTTP Session 中,一個 bean 定義對應一個實例。該做用域僅在基於 web 的Spring ApplicationContext 情形下有效。

缺省的 Spring bean 的做用域是 Singleton。

Spring 框架中的單例 bean 是線程安全的嗎?

不是線程安全的。
當存在共享變量時,你們都能去調用,此時就存在線程安全問題。

什麼是 bean 的自動裝配?有哪些方式自動裝配?

自動裝配:
無須在 Spring 配置文件中描述 javaBean 之間的依賴關係(如配置<property><constructor-arg>)。IOC 容器會自動創建 javabean 之間的關聯關係。

五種自動裝配的方式:

  • no:默認的方式是不進行自動裝配,經過顯式設置 ref 屬性來進行裝配。
  • byName:經過參數名自動裝配,Spring 容器在配置文件中發現 bean 的 autowire 屬性被設置成 byname,

以後容器試圖匹配、裝配和該 bean 的屬性具備相同名字的 bean。

  • byType:經過參數類型自動裝配,Spring 容器在配置文件中發現 bean 的 autowire 屬性被設置成 byType,

以後容器試圖匹配、裝配和該 bean 的屬性具備相同類型的 bean。若是有多個 bean 符合條件,則拋出錯誤。

  • constructor:這個方式相似於 byType, 可是要提供給構造器參數,若是沒有肯定的帶參數的構造器參數類

型,將會拋出異常。

  • autodetect:首先嚐試使用 constructor 來自動裝配,若是沒法工做,則使用 byType 方式。

什麼是spring 的 AOP?

AOP:全稱 Aspect Oriented Programming,即:面向切面編程。
AOP是OOP(Object Oriented Programming,面向對象編程)的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。
利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。
把咱們程序重複的代碼抽取出來,在須要執行的時候,使用動態代理的技術,在不修改源碼的基礎上,對咱們的已有方法進行加強。
AOP採起橫向抽取機制,取代了傳統縱向繼承體系重複性代碼

AOP 技術利用一種稱爲"橫切"的技術,剖解開封裝的對象內部,並將那些影響了多個類的公共行爲封裝到一個可重用模塊,並將其命名爲"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻爲業務模塊所共同調用的邏輯或責任封裝起來,便於減小系統的重複代碼,下降模塊之間的耦合度,並有利於將來的可操做性和可維護性。
使用"橫切"技術,AOP 把軟件系統分爲兩個部分:核心關注點和橫切關注點。
業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。
橫切關注點的一個特色是,他們常常發生在覈心關注點的多處,而各處基本類似,好比權限認證、日誌、事物。
AOP 的做用在於分離系統中的各類關注點,將核心關注點和橫切關注點分離開來。
AOP 核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組 API 提供橫切功能。好比,一個日誌模塊能夠被稱做日誌的 AOP 切面。根據需求的不一樣,一個應用程序能夠有若干切面。在 Spring AOP 中,切面經過帶有@Aspect 註解的類實現。

經典應用:事務管理、性能監視、安全檢查、緩存 、日誌等

AOP的實現方式?

aop底層採用代理機制進行實現。

  • 接口 + 實現類:spring採用 jdk 的動態代理Proxy。
  • 實現類:spring 採用 cglib字節碼加強。

AOP中有哪些概念?

Joinpoint( 鏈接點):被攔截到的點。在 spring 中,這些點指的是方法,由於 spring 只支持方法類型的鏈接點。
Pointcut( 切入點):要對哪些 Joinpoint 進行攔截,即被加強的鏈接點。
Advice( 通知/ 加強):攔截到 Joinpoint 以後所要作的事情,及加強代碼。
Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下, Introduction 能夠在運行期爲類動態地添加一些方法或 Field。
Target(目標對象):目標類,須要被代理的類
Weaving(織入):是指把加強應用到目標對象來建立新的代理對象的過程。spring 採用動態代理織入,而 AspectJ 採用編譯期織入和類裝載期織入。
Proxy(代理):代理類,一個類被 AOP 織入加強後,就產生一個結果代理類。
Aspect( 切面):是切入點和通知(引介)的結合。

在Spring中怎麼定義類的做用域?

當定義一個<bean> 在 Spring 裏,能夠給這個 bean 聲明一個做用域。它能夠經過 bean 定義中的 scope 屬性來定義。當 Spring 要在須要的時候每次生產一個新的 bean 實例,bean 的 scope 屬性被指定爲 prototype。一個 bean 每次使用的時候必須返回同一個實例,這個 bean 的 scope 屬性被指定爲 singleton。

相關文章
相關標籤/搜索