天天看點

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

作者:Java架構師聯盟

String面試題

1、不同版本的 Spring Framework 有哪些主要功能

Version Feature

Spring 2.5 釋出于 2007 年。這是第一個支援注解的版本。

Spring 3.0 釋出于 2009 年。它完全利用了 Java5 中的改進,并為 JEE6 提供了支 持

Spring 4.0 釋出于 2013 年。這是第一個完全支援 JAVA8 的版本。

Spring 5.0 Spring Framework 5.0的最大特點之一是響應式程式設計(Reactive Programming)。 響應式程式設計核心功能和對響應式endpoints的支援可通過Spring Framework 5.0中獲得。

2、什麼是 Spring Framework?

Spring 是一個開源應用架構,旨在降低應用程式開發的複雜度。它是輕量級、松散耦合的。它具有分層體系結構,允許使用者選擇元件,同時還為 J2EE 應用程式開發提供了一個有凝聚力的架構。它可以內建其他架構,如 Structs、Hibernate、EJB 等,是以又稱為架構的架構。

3、列舉 Spring Framework 的優點。

由于 Spring Frameworks 的分層架構,使用者可以自由選擇自己需要的元件。Spring Framework 支援 POJO(Plain Old Java Object) 程式設計,進而具備持續內建和可測試性。由于依賴注入和控制反轉,JDBC 得以簡化。它是開源免費的。

4、Spring Framework 有哪些不同的功能?

>db.connectionName.find({key:value}).sort({columnName:1})

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Java研發軍團輕量級 - Spring 在代碼量和透明度方面都很輕便。IOC - 控制反轉 AOP - 面向切面程式設計可以将應用業務邏輯和系統服務分離,以實作高内聚。容器 - Spring 負責建立和管理對象(Bean)的生命周期和配置。MVC - 對 web 應用提供了高度可配置性,其他架構的內建也十分友善。事務管理 - 提供了用于事務管理的通用抽象層。Spring 的事務支援也可用于容器較少的環境。JDBC 異常 - Spring的 JDBC 抽象層提供了一個異常層次結構,簡化了錯誤處理政策。

5、Spring Framework 中有多少個子產品,它們分别是什麼?

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

Spring 核心容器 – 該層基本上是 Spring Framework 的核心。它包含以下子產品:

口Spring Core

口Spring Bean

口SpEL (Spring Expression Language)

口Spring Context

資料通路/內建 – 該層提供與資料庫互動的支援。它包含以下子產品:

口JDBC (Java DataBase Connectivity)

口ORM (Object Relational Mapping)

口OXM (Object XML Mappers)

口JMS (Java Messaging Service)

口Transaction

Web – 該層提供了建立 Web 應用程式的支援。它包含以下子產品:

Web

Web – Servlet

Web – Socket

Web – Portlet

AOP

該層支援面向切面程式設計

Instrumentation

該層為類檢測和類加載器實作提供支援。

Test

該層為使用 JUnit 和 TestNG 進行測試提供支援。

幾個雜項子產品:

Messaging – 該子產品為 STOMP 提供支援。它還支援注解程式設計模型,該模型用于從 WebSocket 用戶端路由和處理 STOMP 消息。Aspects –該子產品為與 AspectJ 的內建提供支援。

6、什麼是 Spring 配置檔案?

Spring 配置檔案是 XML 檔案。該檔案主要包含類資訊。它描述了這些類是如何配置以及互相引入的。但是,XML 配置檔案冗長且更加幹

淨。如果沒有正确規劃和編寫,那麼在大項目中管理變得非常困難

7、Spring 應用程式有哪些不同元件?

Spring 應用一般有以下元件:

口接口 - 定義功能。

口Bean 類 - 它包含屬性,setter 和 getter 方法,函數等。

口Spring 面向切面程式設計(AOP) - 提供面向切面程式設計的功能。

口Bean 配置檔案 - 包含類的資訊以及如何配置它們。

口使用者程式 - 它使用接口。

8、使用 Spring 有哪些方式?

使用 Spring 有以下方式:

口作為一個成熟的 Spring Web 應用程式。

作為第三方 Web 架構,使用 Spring Frameworks 中間層。

口用于遠端使用。

口作為企業級 Java Bean,它可以包裝現有的 POJO(Plain Old Java Objects)。

9、什麼是 Spring IOC 容器?

Spring 架構的核心是 Spring 容器。容器建立對象,将它們裝配在一起,配置它們并管理它們的完整生命周期。Spring 容器使用依賴注入來管理組成應用程式的元件。容器通過讀取提供的配置中繼資料來接收對象進行執行個體化,配置群組裝的指令。該中繼資料可以通過 XML,Java 注解或 Java 代碼提供。

10、什麼是依賴注入?

在依賴注入中,您不必建立對象,但必須描述如何建立它們。您不是直接在代碼中将元件和服務連接配接在一起,而是描述配置檔案中哪些元件需要哪些服務。由 IoC容器将它們裝配在一起。

11、可以通過多少種方式完成依賴注入?

通常,依賴注入可以通過三種方式完成,既:

口構造函數注入

口setter 注入

口接口注入

在 Spring Framework 中,僅使用構造函數和 setter 注入。

12、區分構造函數注入和 setter 注入

構造函數注入

沒有部分注入

不會覆寫 setter 屬性

任意修改都會建立一個新執行個體

适用于設定很多屬性

setter 注入

有部分注入

會覆寫setter屬性

任意修改不會建立一個新執行個體

适用于設定少量屬性

13、spring 中有多少種 IOC 容器?

BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在用戶端要求時執行個體化 bean。

ApplicationContext - ApplicationContext 接口擴充了 BeanFactory 接口。它在 BeanFactory 基礎上提供了一些額外的功能。

14、區分 BeanFactory 和 ApplicationContext。

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

15、列舉 IoC 的一些好處。

IoC 的一些好處是:

口它将最小化應用程式中的代碼量。

口它将使您的應用程式易于測試,因為它不需要單元測試用例中的任何單例或 JNDI 查找機制。

口它以最小的影響和最少的侵入機制促進松耦合。

口它支援即時的執行個體化和延遲加載服務。

16、Spring IoC 的實作機制。

Spring 中的 IoC 的實作原理就是工廠模式加反射機制。

執行個體:

interface Fruit {
       public abstract void eat();
}
class Apple implements Fruit {
        public void eat(){
        System.out.println("Apple");
         }
}
class Orange implements Fruit {
      public void eat(){
      System.out.println("Orange");
       }
}
class Factory {
      public static Fruit getInstance(String ClassName) {
              Fruit f=null;
              try {
                   f=(Fruit)Class.forName(ClassName).newInstance();
               } catch (Exception e) {
                     e.printStackTrace();
               }
               return f;
         }
}
class Client {
      public static void main(String[] a) {
              Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
               if(f!=null){
                     f.eat();
               }
        }
}           

17、什麼是 spring bean?

口它們是構成使用者應用程式主幹的對象。

口Bean 由 Spring IoC 容器管理。

口它們由 Spring IoC 容器執行個體化,配置,裝配和管理。

口Bean 是基于使用者提供給容器的配置中繼資料建立。

18、spring 提供了哪些配置方式?

基于 xml 配置

bean 所需的依賴項和服務在 XML 格式的配置檔案中指定。這些配置檔案通常包含許多 bean 定義和特定于應用程式的配置選項。它們通常以 bean 标簽開頭。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
        <property name="name" value="Edureka"></property>
</bean>           

基于注解配置

您可以通過在相關的類,方法或字段聲明上使用注解,将 bean 配置為元件類本身,而不是使用 XML 來描述 bean 裝配。預設情況下,Spring 容器中未打開注解裝配。是以,您需要在使用它之前在 Spring 配置檔案中啟用它。例如:

<beans>
        <context:annotation-config/>
        <!-- bean definitions go here -->
</beans>           

基于 Java API 配置

Spring 的 Java 配置是通過使用 @Bean 和 @Confifiguration 來實作。

1、 @Bean 注解扮演與 元素相同的角色。

2、 @Confifiguration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關系。

例如:

@Configuration
public class StudentConfig {
       @Bean
        public StudentBean myStudent() {
               return new StudentBean();
        }
}           

19、spring 支援集中 bean scope?

Spring bean 支援 5 種 scope:

Singleton - 每個 Spring IoC 容器僅有一個單執行個體。Prototype - 每次請求都會産生一個新的執行個體。Request - 每一次 HTTP 請求都會産生一個新的執行個體,并且該 bean 僅在目前 HTTP 請求内有效。Session - 每一次 HTTP 請求都會産生一個新的 bean,同時該 bean 僅在目前

HTTP session 内有效。Global-session - 類似于标準的 HTTP Session 作用域,不過它僅僅在基于portlet 的 web 應用中才有意義。Portlet規範定義了全局 Session 的概念,

它被所有構成某個 portlet web 應用的各種不同的 portlet 所共享。在 globalsession 作用域中定義的 bean 被限定于全局 portlet Session的生命周期範圍内。如果你在 web 中使用 global session 作用域來辨別 bean,那麼 web會自動當成 session 類型來使用。

僅當使用者使用支援 Web 的 ApplicationContext 時,最後三個才可用。

20、spring bean 容器的生命周期是什麼樣的?

spring bean 容器的生命周期流程如下:

1、Spring 容器根據配置中的 bean 定義中執行個體化 bean。

2、Spring 使用依賴注入填充所有屬性,如 bean 中所定義的配置。

3、如果 bean 實作BeanNameAware 接口,則工廠通過傳遞 bean 的 ID 來調用setBeanName()。

4、如果 bean 實作 BeanFactoryAware 接口,工廠通過傳遞自身的執行個體來調用 setBeanFactory()。

5、如果存在與 bean 關聯的任何BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。

6、如果為 bean 指定了 init 方法(的 init-method 屬性),那麼将調用它。

7、最後,如果存在與 bean 關聯的任何 BeanPostProcessors,則将調用 postProcessAfterInitialization() 方法。8、如果 bean 實作DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。

9、如果為bean 指定了 destroy 方法(的 destroy-method 屬性),那麼将調用它。

21、什麼是 spring 的内部 bean?

隻有将 bean 用作另一個 bean 的屬性時,才能将 bean 聲明為内部 bean。為了定義 bean,Spring 的基于 XML 的配置中繼資料在 或 中提供了 元素的使用。内部 bean 總是匿名的,它們總是作為原型。

例如,假設我們有一個 Student 類,其中引用了 Person 類。這裡我們将隻建立一個 Person 類執行個體并在 Student 中使用它。

Student.java

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

bean.xml

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

22、什麼是 spring 裝配

當 bean 在 Spring 容器中組合在一起時,它被稱為裝配或 bean 裝配。Spring容器需要知道需要什麼 bean 以及容器應該如何使用依賴注入來将 bean 綁定在一起,同時裝配 bean。

23、自動裝配有哪些方式?

Spring 容器能夠自動裝配 bean。也就是說,可以通過檢查 BeanFactory 的内容讓 Spring 自動解析 bean 的協作者。

自動裝配的不同模式:

no - 這是預設設定,表示沒有自動裝配。應使用顯式 bean 引用進行裝配。byName - 它根據 bean 的名稱注入對象依賴項。它比對并裝配其屬性與 XML檔案中由相同名稱定義的 bean。byType - 它根據類型注入對象依賴項。如果屬性的類型與 XML 檔案中的一個 bean 名稱比對,則比對并裝配屬性。構造函數- 它通過調用類的構造函數來注入依賴項。它有大量的參數。autodetect - 首先容器嘗試通過構造函數使用 autowire 裝配,如果不能,則嘗試通過 byType 自動裝配

24、自動裝配有什麼局限?

覆寫的可能性 - 您始終可以使用 和 設定指定依賴項,這将覆寫自動裝配。基本中繼資料類型 - 簡單屬性(如原資料類型,字元串和類)無法自動裝配。令人困惑的性質 - 總是喜歡使用明确的裝配,因為自動裝配不太精确。

25、什麼是基于注解的容器配置

不使用 XML 來描述 bean 裝配,開發人員通過在相關的類,方法或字段聲明上使用注解将配置移動到元件類本身。它可以作為 XML 設定的

替代方案。例如:Spring 的 Java 配置是通過使用 @Bean 和 @Confifiguration 來實作。 @Bean 注解扮演與 元素相同的角色。@Confifiguration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關系。

例如

@Configuration
public class StudentConfig {
       @Bean
        public StudentBean myStudent() {
               return new StudentBean();
        }
}           

26、如何在 spring 中啟動注解裝配?

預設情況下,Spring 容器中未打開注解裝配。是以,要使用基于注解裝配,我們必須通過配置 <context:annotation-confifig/> 元素在Spring 配置檔案中啟用它。

27、@Component, @Controller, @Repository

@Service 有何差別?

@Component :這将 java 類标記為 bean。它是任何 Spring 管理元件的通用構造型。spring 的元件掃描機制現在可以将其拾取并将其拉入應用程式環境中。

@Controller :這将一個類标記為 Spring Web MVC 控制器。标有它的Bean 會自動導入到 IoC 容器中。

@Service :此注解是元件注解的特化。它不會對 @Component 注解提供任何其他行為。您可以在服務層類中使用@Service 而不是

@Component,因為它以更好的方式指定了意圖。

@Repository :這個注解是具有類似用途和功能的 @Component 注解的特化。它為 DAO 提供了額外的好處。它将 DAO 導入 IoC 容器,

并使未經檢查的異常有資格轉換為 Spring DataAccessException。

28、@Required 注解有什麼用?

@Required 應用于 bean 屬性 setter 方法。此注解僅訓示必須在配置時使用bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean屬性。如果尚未填充受影響的 bean 屬性,則容器将抛出 eanInitializationException。

示例:

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

29、@Autowired 注解有什麼用?

@Autowired 可以更準确地控制應該在何處以及如何進行自動裝配。此注解用于在 setter 方法,構造函數,具有任意名稱或多個參數的屬性或方法上自動裝配bean。預設情況下,它是類型驅動的注入。

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

30、@Qualififier 注解有什麼用?

當您建立多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualififier 注解和 @Autowired 通過指定應該裝配哪個确切的 bean來消除歧義。

例如,這裡我們分别有兩個類,Employee 和 EmpAccount。在 EmpAccount中,使用@Qualififier 指定了必須裝配 id 為 emp1 的 bean。

Employee.java

public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}           

EmpAccount.java

public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}           

31、@RequestMapping 注解有什麼用?

@RequestMapping 注解用于将特定 HTTP 請求方法映射到将處理相應請求的

控制器中的特定類/方法。此注釋可應用于兩個級别:

類級别:映射請求的 URL 方法級别:映射 URL 以及 HTTP 請求方法

32、spring DAO 有什麼用?

Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的資料通路技術更容易以一種統一的方式工作。這使得使用者容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。

33、列舉 Spring DAO 抛出的異常。

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

34、spring JDBC API 中存在哪些類?

口JdbcTemplate

口SimpleJdbcTemplate

口NamedParameterJdbcTemplate

口SimpleJdbcInsert

口SimpleJdbcCall

35、使用 Spring 通路 Hibernate 的方法有哪些?

我們可以通過兩種方式使用 Spring 通路 Hibernate:

1、 使用 Hibernate 模闆和回調進行控制反轉

2、 擴充 HibernateDAOSupport 并應用 AOP 攔截器節點

36、列舉 spring 支援的事務管理類型

Spring 支援兩種類型的事務管理:

1、 程式化事務管理:在此過程中,在程式設計的幫助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。

2、 聲明式事務管理:在此,事務管理與業務代碼分離。僅使用注解或基于 XML的配置來管理事務。

37、spring 支援哪些 ORM 架構

口Hibernate

口iBatis

口JPA

口JDO

口OJB

38、什麼是 AOP?

AOP(Aspect-Oriented Programming), 即 面向切面程式設計, 它與OOP( Object-Oriented Programming, 面向對象程式設計) 相輔相成, 提供了與

OOP 不同的抽象軟體結構的視角. 在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)

39、什麼是 Aspect?

aspect 由 pointcount 和 advice 組成, 它既包含了橫切邏輯的定義, 也包括了連接配接點的定義. Spring AOP 就是負責實施切面的架構, 它将切面

所定義的橫切邏輯編織到切面所指定的連接配接點中. AOP 的工作重心在于如何将增強編織目标對象的連接配接點上, 這裡包含兩個工作:

1、如何通過 pointcut 和 advice 定位到特定的 joinpoint 上

2、如何在advice 中編寫切面代碼

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

以簡單地認為, 使用 @Aspect 注解的類就是切面.

40、什麼是切點(JoinPoint)

程式運作中的一些時間點, 例如一個方法的執行, 或者是一個異常的處理.在 Spring AOP 中, join point 總是方法的執行點。

41、什麼是通知(Advice)?

特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器,在 JoinPoint “周圍”維護一系列的攔截器。

42、有哪些類型的通知(Advice)?

Before - 這些類型的 Advice 在 joinpoint 方法之前執行,并使用@Before 注解标記進行配置。

After Returning - 這些類型的 Advice 在連接配接點方法正常執行後執行,并使用@AfterReturning 注解标記進行配置。

After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過抛出異常退出并使用 @AfterThrowing 注解标記配置時執行。

After (fifinally) - 這些類型的 Advice 在連接配接點方法之後執行,無論方法退出是正常還是異常傳回,并使用 @After 注解标記進行配置。

Around - 這些類型的 Advice 在連接配接點之前和之後執行,并使用@Around 注解标記進行配置

43、指出在 spring aop 中 concern 和 cross-cuttingconcern 的不同之處。

concern 是 我 們 想 要 在 應 用 程 序 的 特 定 模 塊 中 定 義 的 行 為 。 它 可 以 定 義 為 我 們 想要 實 現 的 功 能 。

cross-cutting concern 是 一 個 适 用 于 整 個 應 用 的 行 為 ,

這 會 影 響 整 個 應 用 程 序 。例 如 ,日 志 記 錄 ,安 全 性 和 數 據 傳 輸

是 應 用 程 序 幾 乎 每 個 模 塊 都 需 要 關 注 的 問 題 ,因 此 它 們 是 跨 領 域 的 問 題

44、AOP 有哪些實作方式?

實 現 AOP 的 技 術 ,

主 要 分 為 兩 大 類 :

靜态代理

指使用 AOP 架構提供的指令進行編譯,進而在編譯階段就可生成 AOP 代理類,是以也稱為編譯時增強;

編譯時編織(特殊編譯器實作)

類加載時編織(特殊的類加載器實作)。

動态代理

在運作時在記憶體中“臨時”生成 AOP 動态代理類,是以也被稱為運作時增強。

JDK 動态代理

CGLIB

45、Spring AOP and AspectJ AOP 有什麼差別?

Spring AOP 基于動态代理方式實作;AspectJ 基于靜态代理方式實作。SpringAOP 僅支援方法級别的 PointCut;提供了完全的 AOP 支援,

它還支援屬性級别的 PointCut。

46、如何了解 Spring 中的代理?

将 Advice 應用于目标對象後建立的對象稱為代理。在用戶端對象的情況下,目标對象和代理對象是相同的。

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

47、什麼是編織(Weaving)?

為了建立一個 advice 對象而連結一個 aspect 和其它應用類型或對象,稱為編織(Weaving)。在 Spring AOP 中,編織在運作時執行。請

參考下圖:

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

48、Spring MVC 架構有什麼用?

Spring Web MVC 架構提供 模型-視圖-控制器 架構和随時可用的元件,用于開發靈活且松散耦合的 Web 應用程式。MVC 模式有助于分離應

用程式的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供松散耦合。

49、描述一下 DispatcherServlet 的工作流程

DispatcherServlet 的工作流程可以用一幅圖來說明

位元組面試官:“這49道Spring面試題,給我好好解釋一遍!”

1、向伺服器發送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。

2、 DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源辨別符(URI)。然後根據該 URI,調用

HandlerMapping獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及 Handler 對

象對應的攔截器),最後以 HandlerExecutionChain 對象的形式傳回。

3、 DispatcherServlet 根據獲得的 Handler,選擇一個合适的HandlerAdapter。(附注:如果成功獲得 HandlerAdapter 後,此時将開始

執行攔截器的 preHandler(...)方法)。

4、提取 Request 中的模型資料,填充 Handler 入參,開始執行 Handler( Controller)。在填充 Handler 的入參過程中,根據你的配置,

Spring 将幫你做一些額外的工作:

HttpMessageConveter:将請求消息(如 Json、xml 等資料)轉換成一個對象,将對象轉換為指定的響應資訊。

資料轉換:對請求消息進行資料轉換。如 String 轉換成 Integer、Double 等。

資料根式化:對請求消息進行資料格式化。如将字元串轉換成格式化數字或格式化日期等。

資料驗證:驗證資料的有效性(長度、格式等),驗證結果存儲到BindingResult 或 Error 中。

5、Handler(Controller)執行完成後,向 DispatcherServlet 傳回一個ModelAndView 對象;

6、根據傳回的 ModelAndView,選擇一個适合的 ViewResolver(必須是已經注冊到 Spring 容器中的 ViewResolver)傳回給DispatcherServlet。

7、 ViewResolver 結合 Model 和 View,來渲染視圖。

8、視圖負責将渲染結果傳回給用戶端。

本文給大家講解的内容是Java面試系列:Spring 面試題(49道全解析)

  1. 覺得文章不錯的朋友可以轉發此文關注小編;
  2. 感謝大家的支援!