1. 程式人生 > 其它 >2021年11月17日--spring面試題

2021年11月17日--spring面試題

1. 談談你對Spring的理解?

Spring框架是一個輕量級的開源框架,是核心容器、資料訪問與整合、AOP、Web、訊息、測試六個模組的整合,主要是為了簡化企業級應用的後臺開發,降低耦合性。平時接觸到最多的還是IoC和AOP兩個特性。IoC指的是控制反轉,把物件的建立和依賴關係的維護交給Spring容器去管理。Spring通過工廠模式、反射機制等技術管理物件的作用域和生命週期。AoP一般稱為面向切面程式設計,是面向物件的一種補充,將程式中獨立於其他功能的方法抽取出來,使Java開發模組化,僅需專注於主業務即可

2. Spring的特點是什麼?

輕 量、控 制 反 轉、面 向 切 面 的 編 程(AOP)、容 器、MVC 框 架、事 務 管 理、異 常 處 理

3. Spring的優缺點是什麼?

優點

方便解耦,簡化開發

可以將物件的建立和依賴關係的維護交給Spring管理。

提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能。

宣告式事務的支援

只需要通過配置就可以完成對事務的管理,而無需手動程式設計。

可以通過註解方便的測試程式。

內部提供了對各種優秀框架的直接支援,方便整合各種優秀框架。

降低 JavaEE API 的使用難度

缺點

Spring明明一個很輕量級的框架,卻給人感覺大而全

Spring依賴反射,反射影響效能

使用門檻過高,入門Spring需要較長時間

4. Spring由哪些模組組成?

Spring 總共有 20 個模組, 由 1300 多個不同的檔案構成。 而這些元件被分別整合在核心容器 、 AOP和裝置支援 、資料訪問與整合 、 Web、 訊息 、 測試 6 個模組中

5. 詳細講解一下核心容器(spring context應用上下文) 模組

這是基本的 Spring 模組,提供 spring 框架的基礎功能, BeanFactory 是任何以 spring 為基礎的應用的核心.它使 Spring 成為一個容器 。BeanFactory是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從真正的應用程式碼中分離。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根據XML檔案中的定義載入beans。該容器從XML 檔案讀取配置元資料並用它去建立一個完全配置的系統或應用。

6. 解釋AOP模組

AOP 模組用於 Spring 應用做面向切面的開發,很多支援由 AOP 聯盟提供,這樣就確保了 Spring和其他 AOP 框架的共通性。AOP模組將元資料程式設計引入Spring。

7. 解釋JDBC抽象和DAO模組

通過使用JDBC抽象和 DAO 模組,保證資料庫程式碼的簡潔,並能避免資料庫資源錯誤關閉導致的問題, 它在各種不同的資料庫的錯誤資訊之上,提供了一個統一的異常訪問層。它還利用 Spring 的 AOP 模組給 Spring 應用中的物件提供事務管理服務。

8. 解釋物件/關係對映整合(ORM)模組

Spring 通過提供ORM模組,支援我們直接在JDBC 之上使用一個物件/關係對映(ORM)工具。

Spring 支援整合主流的 ORM 框架。

Spring 的事務管理同樣支援主流的 ORM 框架及 JDBC。

9. 解釋WEB模組

Spring 的 WEB 模組是構建在 application context 模組基礎之上,提供一個適合 web 應用的上下文。

10. Spring配置檔案

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

11. 什麼是Spring IoC 容器。

控制反轉即IoC ,它把傳統上由程式程式碼直接操控的物件的呼叫權交給容器,通過容器來實現元件物件的裝配和管理。所謂的“控制反轉”概念就是對元件物件控制權的轉移,從程式程式碼本身轉移到了外部容器。Spring IOC 負責建立物件,管理物件,裝配物件,配置物件,並且管理這些物件的整個生命週期。

12. 控制反轉(IoC)有什麼作用

管理物件的建立和依賴關係的維護。

方便解耦,由容器去維護具體的物件

託管了類的產生過程。

13.控制反轉(IoC)的優點是什麼?

把應用的程式碼量降到最低。

它使應用容易測試,單元測試不再需要單例和JNDI查詢機制。

最小的代價和最小的侵入性使鬆散耦合得以實現。

IoC容器支援載入服務時的餓漢式初始化和懶載入。

14. Spring IoC 的實現機制

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

15. Spring 的 IoC支援哪些功能

依賴注入

依賴檢查

自動裝配

支援集合

指定初始化方法和銷燬方法

支援回撥某些方法

16. ApplicationContext 通常的實現是什麼?

FileSystemXmlApplicationContext容器 :此容器從一個XML 檔案中載入 beans 的定義,XML Bean配置檔案的全路徑名必須提供給它的建構函式 。

ClassPathXmlApplicationContext容器:此容器從一個 XML 檔案中載入 beans 的定義,需要正確設定 classpath 。因為這個容器將在 classpath 裡面找 bean 的配置。

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

17. BeanFactory和 Application contexts 有什麼區別?

BeanFactory:是Spring裡面最低層的介面,提供了最簡單的容器的功能,而且只提供了例項化物件和拿物件的功能;ApplicationContext:是應用上下文,繼承BeanFactory介面,它是Spring的一個更高階的容器,提供了更多的有用的功能,這些功能包括;國際化訪問資源,如URL和檔案載入多個有繼承關係的上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層 訊息傳送和響應機制AOP兩者的區別在於裝載beans時的區別:BeanFactory在啟動的時候不會去例項化Bean,當Spring應用中有從容器拿Bean的時候才會去例項化;ApplicationContext在啟動的時候就把所有的Bean全部例項化了,它還可以通過配置來實現Bean的延遲例項化,所以實際開發中推薦使用Application contexts。

18. 一個 Spring 的應用看起來像什麼?

一個定義了一些功能的介面 。

Spring AOP

Spring 的 XML 配置檔案

使用以上功能的客戶端程式

19. 什麼是Spring的依賴注入(DI)?

依賴注入是元件之間的依賴關係,由容器在應用系統執行期來決定,也就是由容器動態地將某種依賴關係的目標物件例項化,並注入到應用系統中的各個關聯的元件之中。元件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關係。

20. 依賴注入的基本原則?

應用元件不應該負責查詢資源或者其他依賴的協作物件。

配置物件的工作應該由IoC容器負責,查詢資源的邏輯應該從應用元件的程式碼中抽取出來,交給IoC容器負責。

IoC容器全權負責元件的裝配,它會把符合依賴關係的物件通過屬性或者是構造器傳遞給需要的物件。

21. 依賴注入有什麼優勢

查詢定位操作與應用程式碼完全無關。

不依賴於容器的API,可以很容易地在任何容器以外使用應用物件。

不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器。

22. 有哪些不同型別的依賴注入方式,推薦使用哪種?

構造器注入、介面注入和 Setter 方法注入。最好的解決方案是用構造器引數實現強制依賴, setter 方法實現可選依賴。

23. 什麼是 Spring Beans ?

Spring beans 是那些形成 Spring 應用主幹的 java 物件,它們被 Spring IOC 容器初始化,裝配,和管理,這些 beans 通過容器中配置的元資料建立。

24. 一個 Spring Bean 定義包含什麼?

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

25. 如何給 Spring 容器提供配置元資料?

XML 配置檔案。

基於註解的配置。

基於 java 的配置。

26. 你怎樣定義類的作用域?

當在 Spring 裡定義一個<bean> ,可以給這個 bean 宣告一個作用域,還可以通過 bean 定義中的 scope 屬性來定義作用域。如,當 Spring 在需要的時候每次生產一個新的 bean 例項,bean 的 scope 屬性被指定為 prototype。另一方面,一個 bean 每次使用的時候必須返回同一個例項,這個 bean 的 scope 屬性必須設為singleton。

27. 解釋 Spring 支援的幾種bean的作用域?

singleton作用域 : 是spring預設的作用域,bean 在每個 Spring ioc 容器中只有一個例項。

prototype作用域:一個 bean 的定義可以有多個例項,但該作用域謹慎使用,頻繁建立和銷燬會嚴重影響效能。

request作用域:每次 http 請求都會建立一個 bean, 該作用域僅在基於 web 的 Spring Application Context 情況下有效。

session作用域:在一個 HTTP Session 中,一個 bean 定義對應一個例項。該作用域僅在基於 web 的 Spring Application Context 情況下有效 。

global-session作用域:在一個全域性的 HTTP Session 中,一個 bean 定義對應一個例項。該作用域僅在基於 web 的 Spring Application Context 情況下有效。

28. Spring 框架中的單例 bean是執行緒安全的嗎?

Spring 框架中的單例 bean 不是執行緒安全的,spring 中的 bean 預設是單例模式,Spring框架並沒有對單例 bean 進行多執行緒的封裝處理。實際上大部分時候 spring bean 是無狀態的(比如 dao類),某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 物件),那就要開發者自己去保證執行緒安全了。最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當於 new Bean()了,就可以保證執行緒安全了。

29. 解釋 Spring 框架中 bean 的生命週期

Spring 容器從XML 檔案中讀取 bean 的定義,並例項化 bean。Spring 根據 bean 的定義填充所有的屬性。

如果 bean 實現了 BeanNameAware 介面.Spring 傳遞 bean 的ID到 setBeanName 方法。

如果 Bean 實現了 BeanFactoryAware 介面, Spring 傳遞 beanFactory 給 setBeanFactory 方法。

如果有任何與 bean 相關聯的 BeanPostProcessors, Spring 會在 postProcesserBeforeInitialization() 方法內呼叫它們.

如果 bean 實現 IntializingBean 了,呼叫它的 afterPropertySet 方法,如果 bean 聲明瞭初始化方法,呼叫此初始化方法。

如果有 BeanPostProcessors 和 bean 關聯,這些 bean 的 postProcessAfterInitialization() 方法將被呼叫。

如果 bean 實現了 DisposableBean 它將呼叫 destroy() 方法。

30. 哪些是重要的 bean 生命週期方法?你能過載它們嗎?

有兩個重要的 bean生命週期方法,第一個方法是 setup,它是在容器載入 bean 的時候被呼叫。第二個方法是teardown ,它是在容器解除安裝類的時候被呼叫。Bean 標籤有兩個重要的屬性(init-method和destroy-method),可以通過這兩個屬性定製初始化和登出方法,它們也有相應的註解(@PostConstruct和@PreDestroy )。

31. 什麼是 Spring 的內部 bean(什麼是Spring inner beans)?

當一個 bean 僅被用作另一個 bean 的屬性時,它能被宣告為一個內部 bean。為了定義內部 bean,在 Spring 的基於 XML 的配置元資料中,可以在 <property/> 元素內使用 <bean/> 元素。內部 bean 通常是匿名的,它們的 scope 屬性一般是 prototype。

32. 在 Spring 中如何注入一個 java 集合?

list型別用於注入一列值,允許有相同的值。

set 型別用於注入一組值,不允許有相同的值。

map型別用於注入一組鍵值對,鍵和值都可以為任意型別。

型別用於注入一組鍵值對,鍵和值都只能為 String 型別。

33. 什麼是bean的裝配?

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

34. 什麼是 bean 的自動裝載?

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

35. 解釋不同方式的自動裝配

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

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

byType方式: 是通過引數型別自動裝配,Spring 容器在配置檔案中發現 bean 的 autowire 屬性被設定成 byType之後,容器試圖匹配、裝配和該 bean 的屬性具有相同型別的 bean。如果有多個 bean 符合條件,則丟擲錯誤。

constructor方式:這個方式類似於 byType方式,但是要提供給構造器引數,如果沒有確定的帶引數的構造器引數型別,將會丟擲異常。

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

36. 自動裝配有哪些侷限性?

仍需用<constructor-arg>和<property>配置來定義依賴,這意味著總要重寫自動裝配。

不能自動裝配簡單的屬性,如基本資料型別,String 字串和類。

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

37. 你可以在Spring中注入一個null 和一個空字串嗎?

可以。

38. 什麼是基於 java 的 Spring 註解配置?給一些註解的例子

基於 Java 的配置,允許在少量的 Java 註解的幫助下,進行大部分 Spring 配置而非通過 XML 檔案。以@Configuration註解為例,它用來標記類可以當做一個 bean 的定義,被 Spring IOC 容器使用。另一個例子是@Bean註解,它表示此方法將要返回一個物件,作為一個 bean 註冊進 Spring 應用上下文。

39. 什麼是基於註解的容器配置

相對於 XML 檔案,註解型的配置依賴於通過位元組碼元資料裝配元件,而非尖括號的宣告。開發者通過在相應的類,方法或屬性上使用註解的方式,直接在元件類中進行配置,而不是使用XML檔案的方式表述 bean 的裝配關係。

40. 怎樣開啟註解裝配?

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

41. @Required 註解

@Required 註解表明 bean 的屬性必須在配置的時候設定,通過一個 bean 定義的顯式的屬性值或通過自動裝配。若 @Required 註解的bean 屬性未被設定,容器將丟擲異常。

  1. @Autowired 註解

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

  1. @Qualifier 註解

當有多個相同型別的 bean 卻只有一個需要自動裝配時,將 @Qualifier 註解和 @Autowire 註解結合使用以消除這種混淆,指定需要裝配的 bean。

  1. @RequestMapping 註解

@RequestMapping 註解用於將特定 HTTP 請求方法對映到處理相應請求的控制器中的特定類或者方法。

45. @Autowired和@Resource之間的區別

@Autowired註解:預設是按照型別來裝配注入的,它要求依賴物件必須存在。

@Resource註解:預設是按照名稱來裝配注入的,只有找不到與名稱匹配的bean才會按照型別來裝配注入。

46. 在 Spring 框架中如何更有效地使用JDBC

使用 Spring JDBC 框架,資源管理和錯誤處理的代價都會被減輕。開發者只需寫 statements 從資料庫存取資料,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate

47. 什麼是JdbcTemplate?

JdbcTemplate 類提供了很多便利的方法來解決問題,如把資料庫資料轉變成基本資料型別或物件,執行寫好的或可呼叫的資料庫操作語句,提供自定義的資料錯誤處理。

48. Spring 對資料訪問物件(DAO)的支援?

Spring 對資料訪問物件(DAO)的支援旨在簡化資料訪問技術,方便切換持久層,編碼時也不用擔心會捕獲每種技術特有的異常。

49. Spring 支援的事務管理型別

程式設計式事務管理: 通過程式設計的方式管理事務,帶來極大的靈活性,但是難以維護 。

宣告式事務管理 :可以將業務程式碼和事務管理分離,只需用註解和 XML 配置來管理事務。

50. Spring事務的實現方式和實現原理

Spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務管理功能的。真正的資料庫層的事務提交和回滾是通過binlog或者redo log實現的。

51. 事務的ACID是指什麼?

原子性(Atomic):事務中各項操作,要麼全做要麼全不做,任何一項操作的失敗都會導致整個事務的失敗;

一致性(Consistent):事務結束後系統狀態是一致的;

隔離性(Isolated):併發執行的事務彼此無法看到對方的中間狀態;

永續性(Durable):事務完成後所做的改動都會被持久化,即使發生災難性的失敗,通過日誌和同步備份可以在故障發生後重建資料。

52. Spring事務的五種事務隔離級別?

DEFAULT:是Spring事務預設的隔離級別,使用資料庫預設的事務隔離機制

未提交讀(read uncommited):是最低的事務隔離級別,它允許另外一個事務可以讀取當前事務未提交的資料。髒讀,不可重複讀,幻讀都有可能發生

已提交讀(read commited): 保證一個事務提交後才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的資料。避免了髒讀,但是不可重複讀和幻讀都有可能發生

可重複讀(repeatable read):保證一個事務不會修改已經由另一個事務讀取但未提交或者未回滾的資料,避免了髒讀和不可重複讀,但是幻讀有可能發生

可序列化(serializable):最嚴格的事務隔離級別,支援事務序列執行,資源消耗最大,避免了髒讀,不可重複讀,幻讀

  1. 什麼是髒讀、不可重複讀、幻讀?

髒讀 :表示一個事務能夠讀取另一個事務中還未提交的資料。比如A事務執行過程中,B事務讀取了A事務的修改。但是由於某些原因A事務沒有完成提交,發生了回滾操作,則B事務所讀取的資料是不正確的,這就是髒讀。

不可重複讀 :表示一個事務讀到另一個事務已經提交的updated資料,導致多次查詢結果不一致。比如B事務讀取了兩次資料,在這兩次的讀取過程中A事務修改了資料,導致B事務的這兩次讀取出來的資料不一樣,這就是不可重複讀

幻讀 :表示一個事務讀到另一個事務已經提交的insert資料,導致多次查詢結果不一致。比如B事務讀取了兩次資料,在這兩次的讀取過程中A事務添加了資料,導致B事務的這兩次讀取出來的資料不一樣,這就是幻讀

54. Spring事務的7種傳播級別?

PROPAGATION_REQUIRED級別: 預設的spring事務傳播級別,如果已經存在一個事務,則支援當前事務。如果當前不存在事務,則開啟一個新的事務。

PROPAGATION_SUPPORTS級別: 如果已經存在一個事務,則支援當前事務。如果當前不存在事務,則使用非事務的方式執行。

PROPAGATION_MANDATORY級別: 如果已經存在一個事務,則支援當前事務。如果當前不存在事務,則丟擲異常。

PROPAGATION_REQUIRES_NEW級別: 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。

PROPAGATION_NOT_SUPPORTED級別: 總是使用非事務的方式執行,並掛起任何存在的事務

PROPAGATION_NEVER級別: 使用非事務的方式執行,如果當前存在事務,則丟擲異常。

PROPAGATION_NESTED級別: 如果當前存在事務,則巢狀在事務內執行。如果當前不存在事務,則按PROPAGATION_REQUIRED屬性執行。

55. Spring 框架的事務管理有哪些優點 ?

它為不同的事務 API 提供一個不變的程式設計模式 。

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

它支援宣告式事務管理。

它可以很好的整合 Spring 的各種資料訪問抽象層。

56. 你更傾向使用哪種事務管理型別?

對於宣告式事務管理和程式設計式事務管理,我更喜歡選擇宣告式事務管理,因為它對應用程式碼的影響最小,更符合一個無侵入的輕量級容器的思想。

57. 解釋 AOP?

AOP:一般稱為面向切面程式設計作為面向物件的一種補充,用於將那些與業務無關,但卻對多個物件產生影響的公共行為和邏輯,抽取並封裝為一個可複用的模組。這個模組被命名為“切面”,減少了系統中的重複程式碼,降低了模組間的耦合度,同時提高了系統的可維護性,可用於許可權認證、日誌、事務處理等方面。

58. Spring AOP and AspectJ AOP 有什麼區別?AOP 有哪些實現方式?

AOP實現的關鍵在於代理模式,AOP代理主要分為靜態代理和動態代理。AspectJ是靜態代理的增強,所謂靜態代理就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強。它會在編譯階段將AspectJ切面織入到Java位元組碼中,執行的時候就是增強之後的AOP物件。Spring AOP使用的是動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼,而是每次執行時在記憶體中臨時為方法生成一個AOP物件。這個AOP物件包含了目標物件的全部方法,並且在特定的切點做了增強處理,並回調原物件的方法。

59. JDK動態代理和CGLIB動態代理的區別?

區別在於生成AOP代理物件的時機不同,相對來說AspectJ的靜態代理方式具有更好的效能,但AspectJ需要特定的編譯器進行處理,而Spring AOP代表的動態代理則無需特定的編譯器處理。

60. 什麼是代理?

代理是通知目標物件後建立的物件。從客戶端的角度看,代理物件和目標物件是一樣的。

61. 解釋一下Spring AOP裡面的幾個名詞?

切面:是通知和切點的結合,通知和切點共同定義了切面的全部內容。 在Spring AOP中,切面可以使用通用類或者在普通類中以 @AspectJ 註解來實現。

連線點:指方法,在Spring AOP中,一個連線點總是代表一個方法的執行。

通知:在Spring AOP中,切面的工作被稱為通知,通知是一個在方法執行前或執行後要做的動作。

切點:切點的定義會匹配通知所要織入的一個或多個連線點。通常使用明確的類和方法名稱,或是利用正則表示式定義所匹配的類和方法名稱來指定切點。

引入:引入允許向現有類新增新方法或屬性。

目標物件: 被一個或者多個切面所通知的物件,它通常是一個代理物件。

織入:織入是將切面和到其他應用型別或物件連線或建立一個被通知物件的過程,織入可以在編譯時,載入時,或執行時完成。

62. Spring通知有哪些型別?

前置通知:在一個方法執行之前呼叫的通知。

後通知: 在方法執行之後呼叫的通知,無論方法執行是否成功。

返回後通知: 僅當方法成功完成後呼叫的通知。

丟擲異常後通知: 在方法丟擲異常退出時呼叫的通知。

環繞通知: 在方法執行之前和之後呼叫的通知 。

63. 在 Spring AOP 中,關注點和橫切關注點的區別是什麼?

關注點是應用中一個模組的行為,一個關注點可能會被定義成一個想實現的功能。

橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,並影響整個應用。比如日誌,安全和資料傳輸,幾乎是應用的每個模組都需要的功能。

64. 什麼是(Aspect)切面?

AspectJ切面是AOP的核心,它將多個類的通用行為封裝成可複用的模組,該模組含有一組API提供橫切功能。比如,一個日誌模組可以被稱作日誌的AOP切面,根據需求的不同,一個應用程式可以有若干切面。在SpringAOP中,切面通過帶有@Aspect註解的類實現。

65. 有幾種不同型別的自動代理?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

66. 解釋基於註解的切面實現?

在這種情況下(基於@AspectJ註解的實現),涉及到的切面宣告的風格與帶有 java5 標註的普通 java 類一致。

67. Spring 框架中都用到了哪些設計模式?

工廠模式:BeanFactory是工廠模式的一個實現,用來建立物件的例項;

單例模式:Spring配置檔案定義的Bean預設為單例模式。

代理模式:Spring的AOP功能的實現用到了代理模式;

模板方法模式:用來解決程式碼重複的問題。比如. RestTemplate模版類, JmsTemplate模版類,

JpaTemplate模版類。

觀察者模式:定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都會得到通知並自動更新。

68. Spring基於XML注入bean的幾種方式?

setter方法注入

構造器注入

靜態工廠注入

例項工廠注入

69. @Component, @Controller, @Repository, @Service 有何區別?

@Component:是通用註解,其他三個註解是這個註解的拓展,並且各自具有特定的功能

@Controller:是spring-mvc的註解,具有將請求進行轉發,重定向的功能

@Service:是業務邏輯層註解,用於標註該類處於業務邏輯層。

@Repository:在持久層中,具有將資料庫操作丟擲的原生異常翻譯轉化為Spring的持久層異常的功能

70. Spring如何處理執行緒併發問題?

一般情況下,只有無狀態的Bean才可以在多執行緒的環境下共享。在Spring中,絕大部分Bean都可以宣告為singleton作用域。因為Spring對一些Bean中非執行緒安全狀態採用ThreadLocal進行處理,解決執行緒安全問題。ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題,ThreadLocal採用了“空間換時間”的方式,而執行緒同步機制採用了“時間換空間”的方式。ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每一個執行緒都擁有自己的變數副本,也就沒有必要對該變數進行同步了。ThreadLocal提供了執行緒安全的共享物件,在編寫多執行緒程式碼時,可以把不安全的變數封裝進ThreadLocal。