天天看點

一文了解Spring架構的前世今生(附Spring的30道經典大廠面試題)

前言

Spring 的前世今生

它是一個開源的輕量級Java SE(Java 标準版本)/Java EE(Java 企業版本)開發應用架構,其目的是用于簡化企業級應用程式開發。應用程式是由一組互相協作的對象組成。而在傳統應用程式開發中,一個完整的應用是由一組互相協作的對象組成。

是以開發一個應用除了要開發業務邏輯之外,最多的是關注如何使這些對象協作來完成所需功能,而且要低耦合、高聚合。業務邏輯開發是不可避免的,那如果有個架構出來幫我們來建立對象及管理這些對象之間的依賴關系。

可能有人說了,比如“抽象工廠、工廠方法模式”不也可以幫我們建立對象,“生成器模式”幫我們處理對象間的依賴關系,不也能完成這些功能嗎?

可是這些又需要我們建立另一些工廠類、生成器類,我們又要而外管理這些類,增加了我們的負擔,如果能有種通過配置方式來建立對象,管理對象之間依賴關系,我們不需要通過工廠和生成器來建立及管理對象之間的依賴關系,這樣我們是不是減少了許多工作,加速了開發,能節省出很多時間來幹其他事。​​​​

Spring架構剛出來時主要就是來完成這個功能。

  • Spring架構除了幫我們管理對象及其依賴關系,還提供像通用日志記錄、性能統計、安全控制、異常處理等面向切面的能力,還能幫我管理最頭疼的資料庫事務,本身提供了一套簡單的JDBC 通路實作,提供與第三方資料通路架構內建(如 Hibernate、JPA),與各種 Java EE 技術整合(如 Java Mail、任務排程等等),提供一套自己的 Web 層架構 Spring MVC、而且還能非常簡單的與第三方 Web 架構內建。
  • List item從這裡我們可以認為 Spring 是一個超級粘合大平台,除了自己提供功能外,還提供粘合其他技術和架構的能力,進而使我們可以更自由的選擇到底使用什麼技術進行開發。
  • 而且不管是 JAVA SE(C/S 架構)應用程式還是 JAVA EE(B/S 架構)應用程式都可以使用這個平台進行開發。如今的

    Spring 已經不再是一個架構,早已成為了一種生态。

  • SpringBoot 的便捷式開發實作了零配置,SpringCloud 全家桶,提供了非常友善的解決方案。

接下來,讓我們來深入探讨 Spring 到底能給我們帶來什麼?

由于資料太多,此篇文章限于篇幅隻分享了小部分資料,如果需要更多Spring相關的資料以及全套面試真題的朋友(内含所有題目答案)

一文了解Spring架構的前世今生(附Spring的30道經典大廠面試題)

問題一:**

什麼是Spring?

Spring是Enterprise Java的開源開發架構。Spring Framework的核心功能可用于開發任何Java應用程式,但有一些擴充用于在Java EE平台之上建構Web應用程式。Spring架構的目标是通過啟用基于POJO的程式設計模型,使Java EE開發更易于使用并促進良好的程式設計實踐。

問題二:

Spring Framework有哪些優點?

輕巧: Spring在尺寸和透明度方面都很輕巧。spring架構的基本版本大約為2MB。

控制反轉(IOC): 使用反轉控制技術在Spring中實作松耦合。對象提供依賴關系,而不是建立或查找依賴對象。

面向方面(AOP): Spring支援面向方面的程式設計,并将應用程式業務邏輯與系統服務分開。

容器: Spring包含并管理應用程式對象的生命周期和配置。 MVC架構: Spring的Web架構是一個設計良好的Web MVC架構,它為Web架構提供了一個很好的替代方案。

事務管理: Spring提供了一緻的事務管理界面,可以縮小到本地事務并擴充到全局事務(JTA)。

異常處理: Spring提供了一個友善的API,用于将特定于技術的異常(由JDBC,Hibernate或JDO抛出)轉換為一緻的,未經檢查的異常。

問題三:

核心容器(應用程式上下文)子產品是什麼?

這是基本的Spring子產品,它提供了Spring架構的基本功能。BeanFactory是任何基于spring的應用程式的核心。Spring架構是在這個子產品的頂部建構的,它構成了Spring容器。

問題四:

AOP子產品是什麼?

AOP子產品用于為我們的Spring應用程式開發方面。AOP聯盟提供了大部分支援,以確定Spring與其他AOP架構之間的互操作性。該子產品還向Spring引入了中繼資料程式設計。

問題五:

解釋一下JDBC抽象和DAO子產品

使用JDBC抽象和DAO子產品,我們可以確定我們使資料庫代碼保持幹淨和簡單,并防止因無法關閉資料庫資源而導緻的問題。它在幾個資料庫伺服器給出的錯誤消息之上提供了一層有意義的異常。它還利用Spring的AOP子產品為Spring應用程式中的對象提供事務管理服務。

問題六:

解釋一下對象/關系映射內建子產品

通過提供ORM子產品,Spring還支援在直接JDBC上使用對象/關系映射(ORM)工具。Spring支援綁定到幾個流行的ORM架構,包括Hibernate,JDO和iBATIS SQL Maps。Spring的事務管理支援每個ORM架構以及JDBC。

問題七:

web子產品的作用是什麼?

Spring Web子產品建構在應用程式上下文子產品上,提供适用于基于Web的應用程式的上下文。此子產品還包含對幾個面向Web的任務的支援,例如透明地處理檔案上載的多部分請求以及将請求參數程式設計綁定到業務對象。它還包含與Jakarta Struts的內建支援。

問題八:

Spring MVC子產品的作用是什麼?

Spring提供了MVC架構來建構Web應用程式。Spring可以很容易地與其他MVC架構內建,但是Spring的MVC架構是更好的選擇,因為它使用IoC來提供控制器邏輯與業務對象的清晰分離。使用Spring MVC,您可以聲明性地将請求參數綁定到業務對象。

問題九:

什麼是Spring配置檔案?

Spring配置檔案是一個XML檔案。此檔案包含類資訊,并描述了這些類是如何配置和互相引入的。

問題十:

什麼是Spring IoC容器?

Spring IoC負責建立對象,管理它們(使用依賴注入(DI)),将它們連接配接在一起,配置它們,以及管理它們的整個生命周期。

問題十一:

IOC有什麼好處?

IOC或依賴注入最小化應用程式中的代碼量。它使測試應用程式變得容易,因為在單元測試中不需要單例或JNDI查找機制。以最小的努力和最少的侵入機制促進松散耦合。IOC容器支援急切的執行個體化和延遲加載服務。

問題十二:

ApplicationContext的常見實作是什麼?

該FileSystemXmlApplicationContext來容器從XML檔案加載bean的定義。必須将XML bean配置檔案的完整路徑提供給構造函數。

該ClassPathXmlApplicationContext的容器還加載從XML檔案java bean的定義。在這裡,您需要正确設定CLASSPATH,因為此容器将在CLASSPATH中查找bean配置XML檔案。

該WebXmlApplicationContext:容器從Web應用程式中加載的所有bean類定義的XML檔案。

問題十三:

Bean Factory和ApplicationContext有什麼差別?

ApplicationContex提供了一種解析文本消息的方法,一種加載檔案資源(如圖像)的通用方法,它們可以将事件釋出到注冊為偵聽器的bean。此外,可以在應用程式上下文中以聲明方式處理容器中的容器或容器上的操作,這些操作必須以程式設計方式與Bean Factory一起處理。ApplicationContex實作MessageSource,一個用于擷取本地化消息的接口,實際的實作是可插入的。

問題十四:

什麼是Spring中的依賴注入?

依賴注入是控制反轉(IoC)的一個方面,它是一個通用概念,它可以用許多不同的方式表達。這個概念說你不建立你的對象,而是描述它們應該如何建立。您不能在代碼中直接連接配接元件和服務,而是描述配置檔案中哪些元件需要哪些服務。然後,一個容器(IOC容器)負責将其全部挂起。

問題十五:

有哪些不同類型的IoC(依賴注入)?

基于構造函數的依賴注入:當容器調用具有許多參數的類構造函數時,完成基于構造函數的DI,每個參數表示對其他類的依賴。 基于Setter的依賴注入:基于Setter的DI是在調用無參數構造函數或無參數靜态工廠方法來執行個體化bean之後,通過容器調用bean上的setter方法來完成的。​​一鍵擷取Spring文檔合集PDF​​

問題十六:

Spring bean是什麼?

Spring Beans是構成Spring應用程式主幹的Java對象。它們由Spring IoC容器執行個體化,組裝和管理。這些bean是使用提供給容器的配置中繼資料建立的,例如,以XML定義的形式。

在spring架構中定義的bean是singleton bean。如果指定為true,則bean标記中有一個名為“singleton”的屬性,然後bean變為singleton,如果設定為false,則bean将成為原型bean。預設情況下,它設定為true。是以,spring架構中的所有bean都是預設的單例bean。

問題十七:
如何為Spring容器提供配置中繼資料?

為Spring容器提供配置中繼資料有三種重要方法:

基于XML的配置檔案。

基于注釋的配置。

基于Java的配置。

問題十八:

如何定義bean的範圍?

在Spring中定義一個時,我們也可以為bean聲明一個範圍。它可以通過bean定義中的scope屬性定義。例如,當Spring每次需要生成一個新的bean執行個體時,bean’sscope屬性就是原型。另一方面,當每次需要Spring都必須傳回相同的bean執行個體時,bean scope屬性必須設定為singleton。

問題十九:

Spring支援的bean範圍有哪些?

Spring Framework支援以下五個範圍提供了五個範圍:

在作用域的單重态中,Spring将bean定義範圍限定為每個Spring IoC容器的單個執行個體。

在原型範圍中,單個bean定義具有任意數量的對象執行個體。

在請求範圍中,bean被定義為HTTP請求。此範圍僅在Web感覺的Spring ApplicationContext中有效。

在會話範圍中,bean定義的範圍限定為HTTP會話。此範圍僅在Web感覺的Spring ApplicationContext中有效。

在全局會話範圍中,bean定義的範圍限定為全局HTTP會話。這也是Web感覺Spring ApplicationContext中使用的一種情況。 Spring Bean的預設範圍是Singleton。

問題二十:

Spring Framework中的Singleton bean線程安全嗎?

不,單例bean在Spring架構中不是線程安全的。

問題二十一:

解釋Spring架構中的Bean生命周期

spring容器從XML檔案中查找bean的定義并執行個體化bean。

Spring填充bean定義(DI)中指定的所有屬性。

如果bean實作了StringNameAware接口,則spring将bean的id傳遞給setBeanName()

如果Bean implementsBeanFactoryAware接口,spring将beanfactory傳遞給setBeanFactory()

如果有任何與bean關聯的beanBeanPostProcessors,則Spring調用postProcesserBeforeInitialization()

如果bean implementsIntializingBean,則調用其afterPropertySet()方法。

如果bean具有init方法聲明,則調用指定的初始化方法。

如果有任何與Bean關聯的BeanPostProcessors,則将調用它們的postProcessAfterInitialization()方法。

如果bean實作了DisposableBean,它将調用destroy()

問題二十二:

哪些是重要的bean生命周期方法?可以覆寫它們嗎?

有兩個重要的bean生命周期方法。第一個是setup,當bean加載到容器中時調用。第二種方法是拆卸方法,當從容器中解除安裝bean時調用該方法。

bean标記有兩個重要的屬性(init-method和destroy-method),您可以使用它們定義自己的自定義初始化和銷毀方法。還有相應的注釋(@PostConstruct和@PreDestroy)。

問題二十三:

Spring的内部beans是什麼?

當bean僅用作另一個bean的屬性時,可以将其聲明為内部bean。Spring的基于XML的配置中繼資料提供了bean定義中元素的使用,以便定義所謂的内部bean。内部bean總是匿名的,它們總是作為原型。

問題二十四:

如何在Spring中注入Java Collection?

Spring提供以下類型的集合配置元素:

在允許重複的情況下,該類型用于注入值清單。 該類型用于連接配接一組值,但沒有任何重複。 該類型用于注入名稱 - 值對的集合,其中name和value可以是任何類型。 該類型可用于注入名稱 - 值對的集合,其中名稱和值都是字元串。

問題二十五:

什麼是Bean wiring?

當bean在Spring容器中組合在一起時,接線或者bean接線就是這種情況。布線bean時,Spring容器需要知道需要什麼bean以及容器應該如何使用依賴注入将它們綁定在一起。

問題二十六:

什麼是bean auto wiring?

Spring容器能夠自動連接配接協作bean之間的關系。這意味着可以通過檢查BeanFactory的内容而不使用和元素來自動讓Spring解析bean的協作者(其他bean)。

問題二十七:

解釋不同的自動接線方式?

自動裝配功能有五種模式,可用于訓示Spring容器使用自動裝配進行依賴注入:

no: 這是預設設定。應使用顯式bean引用進行布線。

byName: 當自動裝配byName時,Spring容器會檢視在XML配置檔案中autowireattribute設定為byName的bean的屬性。然後,它嘗試比對并将其屬性與配置檔案中由相同名稱定義的bean相連。

byType: 當按資料類型進行自動裝配時,Spring容器會在XML配置檔案中檢視autowireattribute設定為byType的bean的屬性。然後,如果屬性的類型與配置檔案中的一個bean名稱比對,則會嘗試比對并連接配接屬性。如果存在多個這樣的bean,則抛出緻命異常。

**構造函數:**此模式類似于byType,但type适用于構造函數參數。如果容器中沒有構造函數參數類型的一個bean,則會引發緻命錯誤。

autodetect: Spring首先嘗試通過構造函數使用autowire連接配接,如果它不起作用,Spring會嘗試通過byType來自動裝配。

問題二十八:

autowiring有限制嗎?

autowiring的局限性是:

覆寫: 您仍然可以使用和設定指定依賴項,這将始終覆寫自動裝配。

基中繼資料類型: 您不能自動裝配簡單屬性,例如基元,字元串和類。

令人困惑的性質: 自動裝配不如顯式布線精确,是以如果可能,請使用明确的布線。

問題二十九:

什麼是基于Spring Java的配置?

基于Java的配置選項使您可以在沒有XML的情況下編寫大部分Spring配置,但可以使用少量基于Java的注釋。

一個示例是@Configuration注釋,它訓示Spring IoC容器可以将該類用作bean定義的源。另一個例子是@ Bean注釋方法,它将傳回一個應該在Spring應用程式上下文中注冊為bean的對象。

問題三十:

什麼是基于注釋的容器配置?

基于注釋的配置提供了XML設定的替代方案,該配置依賴于位元組碼中繼資料來連接配接元件而不是角括号聲明。開發人員不是使用XML來描述bean連接配接,而是通過在相關的類,方法或字段聲明上使用注釋将配置移動到元件類本身。

總結

我在這裡整理出了Java進階架構師之路的核心知識,同時也是面試時面試官必問的知識點,篇章也是包括了很多知識點,其中包括了有基礎知識、Java集合、JVM、多線程并發、spring原理、微服務、Netty 與RPC 、Kafka、日記、設計模式、Java算法、資料庫、Zookeeper、分布式緩存、資料結構等等。

一文了解Spring架構的前世今生(附Spring的30道經典大廠面試題)