天天看點

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

前言

關于Spring的知識總結了個思維導圖分享給大家

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)
1、不同版本的 Spring Framework 有哪些主要功能?
2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

2、什麼是 Spring Framework?

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

3、列舉 Spring Framework 的優點。

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

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

輕量級 - Spring 在代碼量和透明度方面都很輕便。

IOC - 控制反轉

AOP - 面向切面程式設計可以将應用業務邏輯和系統服務分離,以實作高内聚。

容器 - Spring 負責建立和管理對象(Bean)的生命周期和配置。

MVC - 對 web 應用提供了高度可配置性,其他架構的內建也十分友善。

事務管理 - 提供了用于事務管理的通用抽象層。Spring 的事務支援也可用于容器較少的環境。

JDBC 異常 - Spring的 JDBC 抽象層提供了一個異常層次結構,簡化了錯誤處理政策。

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

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

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

(1)Spring Core

(2)Spring Bean

(3)SpEL (Spring Expression Language)

(4) Spring Context

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

(1)JDBC (Java DataBase Connectivity)

(2)ORM (Object Relational Mapping)

(3)OXM (Object XML Mappers)

(4)JMS (Java Messaging Service)

(5)Transaction

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

(1)Web

(2)Web – Servlet

(3)Web – Socket

(4)Web – Portlet

AOP

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

Instrumentation

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

Test

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

幾個雜項子產品:

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

(2)Aspects – 該子產品為與 AspectJ 的內建提供支援。

6、什麼是 Spring 配置檔案?

Spring 配置檔案是 XML 檔案。該檔案主要包含類資訊。它描述了這些類是如何配置以及互相引入的。但是,XML 配置檔案冗長且更加幹淨。如果沒有正确規劃和編寫,那麼在大項目中管理變得非常困難。

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

Spring 應用一般有以下元件:

(1) 接口 - 定義功能。

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

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

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

(5)使用者程式 - 它使用接口。

8、使用 Spring 有哪些方式?

使用 Spring 有以下方式:

(1)作為一個成熟的 Spring Web 應用程式。

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

(3)用于遠端使用。

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

9、什麼是 Spring IOC 容器?

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

歡迎大家關注我的公種浩:程式員追風,2019年多家公司java面試題整理了1000多道400多頁pdf文檔,文章都會在裡面更新,整理的資料也會放在裡面。

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

10、什麼是依賴注入?

在依賴注入中,您不必建立對象,但必須描述如何建立它們。您不是直接在代碼

中将元件和服務連接配接在一起,而是描述配置檔案中哪些元件需要哪些服務。由 IoC

容器将它們裝配在一起。

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

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

(1)構造函數注入

(2)setter 注入

(3) 接口注入

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

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

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

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

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

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

14、區分 BeanFactory 和 ApplicationContext。

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

15、列舉 IoC 的一些好處。

IoC 的一些好處是:

(1)它将最小化應用程式中的代碼量。

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

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

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

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?

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

(2)Bean 由 Spring IoC 容器管理。

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

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

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

基于 xml 配置

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

基于注解配置

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

基于 Java API 配置

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

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

(2) @Configuration 類允許通過簡單地調用同一個類中的其他 @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 屬性),那麼将

調用它。歡迎大家關注我的公種浩:程式員追風,2019年多家公司java面試題整理了1000多道400多頁pdf文檔,文章都會在裡面更新,整理的資料也會放在裡面。

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

21、什麼是 spring 的内部 bean?

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

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

Student.java

public class Student {

private Person person;
//Setters and Getters           

public class Person {

private String name;
private String address;
//Setters and Getters           

bean.xml

“Bangalore">

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 和 @Configuration 來實作。

@Bean 注解扮演與 元素相同的角色。 @Configuration 類允許通過簡單地調用同一個類中的其他 @Bean 方法來定義 bean 間依賴關系。

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

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

預設情況下,Spring 容器中未打開注解裝配。是以,要使用基于注解裝配,我們必須通過配置 元素在 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 屬性,則容器将抛出 BeanInitializationException。

public class Employee {

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

29、@Autowired 注解有什麼用?

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

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

30、@Qualifier 注解有什麼用?

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

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

Employee.java

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 抛出的異常。

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

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

(1)JdbcTemplate

(2)SimpleJdbcTemplate

(3)NamedParameterJdbcTemplate

(4)SimpleJdbcInsert

(5)SimpleJdbcCall

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

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

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

(1) 擴充 HibernateDAOSupport 并應用 AOP 攔截器節點

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

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

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

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

37、spring 支援哪些 ORM 架構

(1)Hibernate

(2)iBatis

(3) JPA

(4)JDO

(5) 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 中編寫切面代碼.

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

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

40、什麼是切點(JoinPoint)

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

41、什麼是通知(Advice)?

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

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

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

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

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

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

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

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

concern 是我們想要在應用程式的特定子產品中定義的行為。它可以定義為我們想要實作的功能。

cross-cutting concern 是一個适用于整個應用的行為,這會影響整個應用程式。例如,日志記錄,安全性和資料傳輸是應用程式幾乎每個子產品都需要關注的問題,是以它們是跨領域的問題。

44、AOP 有哪些實作方式?

實作 AOP 的技術,主要分為兩大類:

靜态代理

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

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

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

動态代理

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

(1)JDK 動态代理

(2)CGLIB

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

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

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

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

Advice + Target Object = Proxy

47、什麼是編織(Weaving)?

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

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

48、Spring MVC 架構有什麼用?

Spring Web MVC 架構提供 模型-視圖-控制器 架構和随時可用的元件,用于開發靈活且松散耦合的 Web 應用程式。MVC 模式有助于分離應用程式的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供松散耦合。

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

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

2020年春招面試:全網最全Spring系列面試題129道(附答案解析)

(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 将幫你做一些額外的工作:

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

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

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

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

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

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

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

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

50、介紹一下 WebApplicationContext

WebApplicationContext 是 ApplicationContext 的擴充。它具有 Web 應用程式所需的一些額外功能。它與普通的 ApplicationContext 在解析主題和決定與哪個 servlet 關聯的能力方面有所不同。

51、什麼是 spring?

Spring 是個 java 企業級應用的開源開發架構。Spring 主要用來開發 Java 應用,但是有些擴充是針對建構 J2EE 平台的 web 應用。Spring 架構目标是簡化 Java企業級應用開發,并通過 POJO 為基礎的程式設計模型促進良好的程式設計習慣。

52、使用 Spring 架構的好處是什麼?

(1)輕量:Spring 是輕量的,基本的版本大約 2MB。

(2)控制反轉:Spring 通過控制反轉實作了松散耦合,對象們給出它們的依賴,而不是建立或查找依賴的對象們。

(3)面向切面的程式設計(AOP):Spring 支援面向切面的程式設計,并且把應用業務邏輯和系統服務分開。

(4)容器:Spring 包含并管理應用中對象的生命周期和配置。

(5)MVC 架構:Spring 的 WEB 架構是個精心設計的架構,是 Web 架構的一個很好的替代品。

(6)事務管理:Spring 提供一個持續的事務管理接口,可以擴充到上至本地事務下至全局事務(JTA)。

(7)異常處理:Spring 提供友善的 API 把具體技術相關的異常(比如由 JDBC,Hibernate or JDO 抛出的)轉化為一緻的 unchecked 異常。

53、Spring 由哪些子產品組成?

以下是 Spring 架構的基本子產品:

(1)Core module

(2)Bean module

(3)Context module

(3)Expression Language module

(4)JDBC module

(5)ORM module

(6) OXM module

(7)Java Messaging Service(JMS) module

(8)Transaction module

(9)Web module

(10)Web-Servlet module

(11)Web-Struts module

(12)Web-Portlet module

54、核心容器(應用上下文) 子產品。

這是基本的 Spring 子產品,提供 spring 架構的基礎功能,BeanFactory 是 任何以 spring 為基礎的應用的核心。Spring 架構建立在此子產品之上,它使 Spring 成為一個容器。

55、BeanFactory – BeanFactory 實作舉例。

Bean 工廠是工廠模式的一個實作,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用代碼中分離。

最常用的 BeanFactory 實作是 XmlBeanFactory 類。

66、XMLBeanFactory

最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根據 XML 檔案中的定義加載 beans。該容器從 XML 檔案讀取配置中繼資料并用它去建立一個完全配置的系統或應用。

67、解釋 AOP 子產品

AOP 子產品用于發給我們的 Spring 應用做面向切面的開發, 很多支援由 AOP 聯盟提供,這樣就確定了 Spring 和其他 AOP 架構的共通性。這個子產品将中繼資料程式設計引入 Spring。

68、解釋 JDBC 抽象和 DAO 子產品。

通過使用 JDBC 抽象和 DAO 子產品,保證資料庫代碼的簡潔,并能避免資料庫資源錯誤關閉導緻的問題,它在各種不同的資料庫的錯誤資訊之上,提供了一個統一的異常通路層。它還利用 Spring 的 AOP 子產品給 Spring 應用中的對象提供事務管理服務。

69、解釋對象/關系映射內建子產品。

Spring 通過提供 ORM 子產品,支援我們在直接 JDBC 之上使用一個對象/關系映射映射(ORM)工具,Spring 支援內建主流的 ORM 架構,如 Hiberate,JDO 和 iBATISSQL Maps。Spring 的事務管理同樣支援以上所有 ORM 架構及 JDBC。

70、解釋 WEB 子產品。

Spring 的 WEB 子產品是建構在 application context 子產品基礎之上,提供一個适合 web 應用的上下文。這個子產品也包括支援多種面向 web 的任務,如透明地處理多個檔案上傳請求和程式級請求參數的綁定到你的業務對象。它也有對 JakartaStruts 的支援。

72、Spring 配置檔案

Spring 配置檔案是個 XML 檔案,這個檔案包含了類資訊,描述了如何配置它們,以及如何互相調用。

73、什麼是 Spring IOC 容器?

Spring IOC 負責建立對象,管理對象(通過依賴注入(DI),裝配對象,配置對象,并且管理這些對象的整個生命周期。

74、IOC 的優點是什麼?

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

75、ApplicationContext 通常的實作是什麼?

(1) FileSystemXmlApplicationContext :此容器從一個 XML 檔案中加載 beans 的定義,XML Bean 配置檔案的全路徑名必須提供給它的構造函數。

(2)ClassPathXmlApplicationContext:此容器也從一個 XML 檔案中加載 beans 的定義,這裡,你需要正确設定 classpath 因為這個容器将在 classpath裡找 bean 配置。

(3)WebXmlApplicationContext:此容器加載一個 XML 檔案,此檔案定義了一個 WEB 應用的所有 bean。

76、Bean 工廠和 Application contexts 有什麼差別?

Application contexts 提供一種方法處理文本消息,一個通常的做法是加載檔案資源(比如鏡像),它們可以向注冊為監聽器的 bean 釋出事件。另外,在容器或容器内的對象上執行的那些不得不由 bean 工廠以程式化方式處理的操作,可以在Application contexts 中以聲明的方式處理。Application contexts 實作了MessageSource 接口,該接口的實作以可插拔的方式提供擷取本地化消息的方法。

77、一個 Spring 的應用看起來象什麼?

(1) 一個定義了一些功能的接口。

(2)這實作包括屬性,它的 Setter , getter 方法和函數等。

(3)Spring AOP。

(4)Spring 的 XML 配置檔案。

(5)使用以上功能的用戶端程式。依賴注入

78、什麼是 Spring 的依賴注入?

依賴注入,是 IOC 的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用建立對象,而隻需要描述它如何被建立。你不在代碼裡直接組裝你的元件和服務,但是要在配置檔案裡描述哪些元件需要哪些服務,之後一個容器(IOC 容器)負責把他們組裝起來。

79、有哪些不同類型的 IOC(依賴注入)方式?

(1)構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實作的,該類有一系列參數,每個參數代表一個對其他類的依賴。

(2)Setter 方法注入:Setter 方法注入是容器通過調用無參構造器或無參static 工廠 方法執行個體化 bean 之後,調用該 bean 的 setter 方法,即實作了基于 setter 的依賴注入。

80、哪種依賴注入方式你建議使用,構造器注入,還是 Setter方法注入?

你兩種依賴方式都可以使用,構造器注入和 Setter 方法注入。最好的解決方案是用構造器參數實作強制依賴,setter 方法實作可選依賴。

81.什麼是 Spring beans?

Spring beans 是那些形成 Spring 應用的主幹的 java 對象。它們被 Spring IOC容器初始化,裝配,和管理。這些 beans 通過容器中配置的中繼資料建立。比如,以 XML 檔案中 的形式定義。

Spring 架構定義的 beans 都是單件 beans。在 bean tag 中有個屬性”singleton”,如果它被賦為 TRUE,bean 就是單件,否則就是一個 prototypebean。預設是 TRUE,是以所有在 Spring 架構中的 beans 預設都是單件。

82、一個 Spring Bean 定義 包含什麼?

一個 Spring Bean 的定義包含容器必知的所有配置中繼資料,包括如何建立一個bean,它的生命周期詳情及它的依賴。

83、如何給 Spring 容器提供配置中繼資料?

這裡有三種重要的方法給 Spring 容器提供配置中繼資料。

(1)XML 配置檔案。

(2)基于注解的配置。

(3)基于 java 的配置。

84、你怎樣定義類的作用域?

當定義一個 在 Spring 裡,我們還能給這個 bean 聲明一個作用域。它可以通過bean 定義中的 scope 屬性來定義。如,當 Spring 要在需要的時候每次生産一個新的 bean 執行個體,bean 的 scope 屬性被指定為 prototype。另一方面,一個 bean每次使用的時候必須傳回同一個執行個體,這個 bean 的 scope 屬性 必須設為singleton。

85、解釋 Spring 支援的幾種 bean 的作用域。

Spring 架構支援以下五種 bean 的作用域:

(1)singleton : bean 在每個 Spring ioc 容器中隻有一個執行個體。

(1)prototype:一個 bean 的定義可以有多個執行個體。

(3)request:每次 http 請求都會建立一個 bean,該作用域僅在基于 web的 Spring ApplicationContext 情形下有效。

(4)session:在一個 HTTP Session 中,一個 bean 定義對應一個執行個體。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。

(5)global-session:在一個全局的 HTTP Session 中,一個 bean 定義對應一個執行個體。該作用域僅在基于 web 的 Spring ApplicationContext 情形下有效。預設的 Spring bean 的作用域是 Singleton.

86、Spring 架構中的單例 bean 是線程安全的嗎?

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

87、解釋 Spring 架構中 bean 的生命周期。

(1)Spring 容器 從 XML 檔案中讀取 bean 的定義,并執行個體化 bean。

(2)Spring 根據 bean 的定義填充所有的屬性。

(3)如果 bean 實作了 BeanNameAware 接口,Spring 傳遞 bean 的 ID 到setBeanName 方法。

(4)如果 Bean 實作了 BeanFactoryAware 接口, Spring 傳遞beanfactory 給 setBeanFactory 方法。

(5)如果有任何與 bean 相關聯的 BeanPostProcessors,Spring 會在postProcesserBeforeInitialization()方法内調用它們。

(6)如果 bean 實作 IntializingBean 了,調用它的 afterPropertySet 方法,如果 bean 聲明了初始化方法,調用此初始化方法。

(7) 如果有 BeanPostProcessors 和 bean 關聯,這些 bean 的postProcessAfterInitialization() 方法将被調用。

(8)如果 bean 實作了 DisposableBean,它将調用 destroy()方法。

88、哪些是重要的 bean 生命周期方法?你能重載它們嗎?

有兩個重要的 bean 生命周期方法,第一個是 setup , 它是在容器加載 bean的時候被調用。第二個方法是 teardown 它是在容器解除安裝類的時候被調用。

The bean 标簽有兩個重要的屬性(init-method 和 destroy-method)。用它們你可以自己定制初始化和登出方法。它們也有相應的注解(@PostConstruct 和@PreDestroy)。

89、什麼是 Spring 的内部 bean?

當一個 bean 僅被用作另一個 bean 的屬性時,它能被聲明為一個内部 bean,為了定義 inner bean,在 Spring 的 基于 XML 的 配置中繼資料中,可以在 或 元素内使用 元素,内部 bean 通常是匿名的,它們的 Scope 一般是 prototype。

90、在 Spring 中如何注入一個 java 集合?

Spring 提供以下幾種集合的配置元素:

(1)類型用于注入一列值,允許有相同的值。

(2)類型用于注入一組值,不允許有相同的值。

(3)類型用于注入一組鍵值對,鍵和值都可以為任意類型。

(4)類型用于注入一組鍵值對,鍵和值都隻能為 String 類型。

91、什麼是 bean 裝配?

裝配,或 bean 裝配是指在 Spring 容器中把 bean 組裝到一起,前提是容器需要知道 bean 的依賴關系,如何通過依賴注入來把它們裝配到一起。

92、什麼是 bean 的自動裝配?

Spring 容器能夠自動裝配互相合作的 bean,這意味着容器不需要和配置,能通過 Bean 工廠自動處理 bean 之間的協作。

93、解釋不同方式的自動裝配 。

有五種自動裝配的方式,可以用來指導 Spring 容器用自動裝配方式來進行依賴注入。

(1)no:預設的方式是不進行自動裝配,通過顯式設定 ref 屬性來進行裝配。

(2)byName:通過參數名 自動裝配,Spring 容器在配置檔案中發現 bean的 autowire 屬性被設定成 byname,之後容器試圖比對、裝配和該 bean 的屬性具有相同名字的 bean。

(3)byType::通過參數類型自動裝配,Spring 容器在配置檔案中發現 bean的 autowire 屬性被設定成 byType,之後容器試圖比對、裝配和該 bean 的屬性具有相同類型的 bean。如果有多個 bean 符合條件,則抛出錯誤。

(4)constructor:這個方式類似于 byType, 但是要提供給構造器參數,如果沒有确定的帶參數的構造器參數類型,将會抛出異常。

(5)autodetect:首先嘗試使用 constructor 來自動裝配,如果無法工作,則使用 byType 方式。

(6)no:預設的方式是不進行自動裝配,通過顯式設定 ref 屬性來進行裝配。

(7)byName:通過參數名 自動裝配,Spring 容器在配置檔案中發現 bean的 autowire 屬性被設定成 byname,之後容器試圖比對、裝配和該 bean 的屬性具有相同名字的 bean。

(8)byType::通過參數類型自動裝配,Spring 容器在配置檔案中發現 bean的 autowire 屬性被設定成 byType,之後容器試圖比對、裝配和該 bean 的屬性具有相同類型的 bean。如果有多個 bean 符合條件,則抛出錯誤。

(9)constructor:這個方式類似于 byType, 但是要提供給構造器參數,如果沒有确定的帶參數的構造器參數類型,将會抛出異常。

(10)autodetect:首先嘗試使用 constructor 來自動裝配,如果無法工作,則使用 byType 方式。

94.自動裝配有哪些局限性 ?

自動裝配的局限性是:

(1)重寫:你仍需用 和 配置來定義依賴,意味着總要重寫自動裝配。

(2)基本資料類型:你不能自動裝配簡單的屬性,如基本資料類型,String字元串,和類。

(3)模糊特性:自動裝配不如顯式裝配精确,如果有可能,建議使用顯式裝配。

95、你可以在 Spring 中注入一個 null 和一個空字元串嗎?

可以。

96、什麼是基于 Java 的 Spring 注解配置? 給一些注解的例子.

基于 Java 的配置,允許你在少量的 Java 注解的幫助下,進行你的大部分 Spring配置而非通過 XML 檔案。

以@Configuration 注解為例,它用來标記類可以當做一個 bean 的定義,被Spring IOC 容器使用。另一個例子是@Bean 注解,它表示此方法将要傳回一個對象,作為一個 bean 注冊進 Spring 應用上下文。

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

相對于 XML 檔案,注解型的配置依賴于通過位元組碼中繼資料裝配元件,而非尖括号的聲明。

開發者通過在相應的類,方法或屬性上使用注解的方式,直接元件類中進行配置,而不是使用xml 表述 bean 的裝配關系。

98、怎樣開啟注解裝配?

注解裝配在預設情況下是不開啟的,為了使用注解裝配,我們必須在 Spring 配置檔案中配置 context:annotation-config/元素。

99、@Required 注解

這個注解表明 bean 的屬性必須在配置的時候設定,通過一個 bean 定義的顯式的屬性值或通過自動裝配,若@Required 注解的 bean 屬性未被設定,容器将抛出BeanInitializationException。

100、@Autowired 注解

@Autowired 注解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required 一樣,修飾 setter 方法、構造器、屬性或者具有任意名稱和/或多個參數的 PN 方法。

101、@Qualifier 注解

當有多個相同類型的 bean 卻隻有一個需要自動裝配時,将@Qualifier 注解和

@Autowire 注解結合使用以消除這種混淆,指定需要裝配的确切的 bean。

102.在 Spring 架構中如何更有效地使用 JDBC?

使用 SpringJDBC 架構,資源管理和錯誤處理的代價都會被減輕。是以開發者隻需寫 statements 和 queries 從資料存取資料,JDBC 也可以在 Spring 架構提供的模闆類的幫助下更有效地被使用,這個模闆叫 JdbcTemplate (例子見這裡here)

103、JdbcTemplate

JdbcTemplate 類提供了很多便利的方法解決諸如把資料庫資料轉變成基本資料類型或對象,執行寫好的或可調用的資料庫操作語句,提供自定義的資料錯誤處理。

104、Spring 對 DAO 的支援

Spring 對資料通路對象(DAO)的支援旨在簡化它和資料通路技術如 JDBC,Hibernate or JDO 結合使用。這使我們可以友善切換持久層。編碼時也不用擔心會捕獲每種技術特有的異常。

105、使用 Spring 通過什麼方式通路 Hibernate?

在 Spring 中有兩種方式通路 Hibernate:

(1)控制反轉 Hibernate Template 和 Callback。

(2)繼承 HibernateDAOSupport 提供一個 AOP 攔截器。

106、Spring 支援的 ORM

Spring 支援以下 ORM:

(3) JPA (Java Persistence API)

(4)TopLink

(5)JDO (Java Data Objects)

(7)OJB

107.如何通過 HibernateDaoSupport 将 Spring 和 Hibernate結合起來?

用 Spring 的 SessionFactory 調用 LocalSessionFactory。內建過程分三步:

(1)配置 the Hibernate SessionFactory。

(2)繼承 HibernateDaoSupport 實作一個 DAO。

(3) 在 AOP 支援的事務中裝配。

108、Spring 支援的事務管理類型

(1)程式設計式事務管理:這意味你通過程式設計的方式管理事務,給你帶來極大的靈活性,但是難維護。

(2)聲明式事務管理:這意味着你可以将業務代碼和事務管理分離,你隻需用注解和 XML 配置來管理事務。

109、Spring 架構的事務管理有哪些優點?

(1)它為不同的事務 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一個不變的程式設計模式。

(2)它為程式設計式事務管理提供了一套簡單的 API 而不是一些複雜的事務 API如

(3) 它支援聲明式事務管理。

(4)它和 Spring 各種資料通路抽象層很好得內建。

110、你更傾向用那種事務管理類型?

大多數 Spring 架構的使用者選擇聲明式事務管理,因為它對應用代碼的影響最小,是以更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優于程式設計式事務管理,雖然比程式設計式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性。

111、解釋 AOP

面向切面的程式設計,或 AOP, 是一種程式設計技術,允許程式子產品化橫向切割關注點,或橫切典型的責任劃分,如日志和事務管理。

112、Aspect 切面

AOP 核心就是切面,它将多個類的通用行為封裝成可重用的子產品,該子產品含有一組 API 提供橫切功能。比如,一個日志子產品可以被稱作日志的 AOP 切面。根據需求的不同,一個應用程式可以有若幹切面。在 Spring AOP 中,切面通過帶有@Aspect 注解的類實作。

113、在 Spring AOP 中,關注點和橫切關注的差別是什麼?

關注點是應用中一個子產品的行為,一個關注點可能會被定義成一個我們想實作的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用,比如日志,安全和資料傳輸,幾乎應用的每個子產品都需要的功能。是以這些都屬于橫切關注點。

114、連接配接點

連接配接點代表一個應用程式的某個位置,在這個位置我們可以插入一個 AOP 切面,它實際上是個應用程式執行 Spring AOP 的位置。

115、通知

通知是個在方法執行前或執行後要做的動作,實際上是程式執行時要通過SpringAOP 架構觸發的代碼段。

Spring 切面可以應用五種類型的通知:

(1)before:前置通知,在一個方法執行前被調用。

(2)after: 在方法執行之後調用的通知,無論方法執行是否成功。

(3)after-returning: 僅當方法成功完成後執行的通知。

(4)after-throwing: 在方法抛出異常退出時執行的通知。

(5) around: 在方法執行之前和之後調用的通知。

116、切點

切入點是一個或一組連接配接點,通知将在這些位置執行。可以通過表達式或比對的方式指明切入點。

117、什麼是引入?

引入允許我們在已存在的類中增加新的方法和屬性。

118、什麼是目标對象?

被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。

119、什麼是代理?

代理是通知目标對象後建立的對象。從用戶端的角度看,代理對象和目标對象是一樣的。

120、有幾種不同類型的自動代理?

(1)BeanNameAutoProxyCreator

(2)DefaultAdvisorAutoProxyCreator

(3)Metadata autoproxying

121、什麼是織入。什麼是織入應用的不同點?

織入是将切面和到其他應用類型或對象連接配接或建立一個被通知對象的過程。織入可以在編譯時,加載時,或運作時完成。

122、解釋基于 XML Schema 方式的切面實作。

在這種情況下,切面由正常類以及基于 XML 的配置實作。

123、解釋基于注解的切面實作

在這種情況下(基于@AspectJ 的實作),涉及到的切面聲明的風格與帶有 java5 标注的普通 java 類一緻。

124、什麼是 Spring 的 MVC 架構?

Spring 配備建構 Web 應用的全功能 MVC 架構。Spring 可以很便捷地和其他MVC 架構內建,如 Struts,Spring 的 MVC 架構用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。

125、DispatcherServlet

Spring 的 MVC 架構是圍繞 DispatcherServlet 來設計的,它用來處理所有的 HTTP請求和響應。

126、WebApplicationContext

WebApplicationContext 繼承了 ApplicationContext 并增加了一些 WEB 應用必備的特有功能,它不同于一般的 ApplicationContext ,因為它能處理主題,并找到被關聯的 servlet。

127、什麼是 Spring MVC 架構的控制器?

控制器提供一個通路應用程式的行為,此行為通常通過服務接口實作。控制器解析使用者輸入并将其轉換為一個由視圖呈現給使用者的模型。Spring 用一個非常抽象的方式實作了一個控制層,允許使用者建立多種用途的控制器。

128、@Controller 注解

該注解表明該類扮演控制器的角色,Spring 不需要你繼承任何其他控制器基類或引用 Servlet API。

129、@RequestMapping 注解

該注解是用來映射一個 URL 到一個類或一個特定的方處理法上。

最後

歡迎大家一起交流,喜歡文章記得關注我點個贊喲,感謝支援!