2021最全Spring面試題70道

前言

作為應屆生般此,處于找工作中。今年2月份剛剛整理出來的Spring面試題牵现,時間比較趕就沒有按照Spring的模塊比如aop铐懊、ioc那些分類排序了∠固郏總而言之科乎,順序比較亂,希望大家耐著性子 看贼急。如果實在介意茅茂,評論告知,我會視情況作修改的太抓。另外如果大家覺得我找的答案不夠清晰空闲,歡迎私信或者評論只出,我看到都會去修改的走敌!

Spring面試題內容

1. 談談你對Spring的理解碴倾?

Spring框架是一個輕量級的開源框架,是核心容器、數(shù)據(jù)訪問與集成跌榔、AOP异雁、Web、消息矫户、測試六個模塊的集成片迅,主要是為了簡化企業(yè)級應用的后臺開發(fā)残邀,降低耦合性皆辽。平時接觸到最多的還是IoC和AOP兩個特性。IoC指的是控制反轉芥挣,把對象的創(chuàng)建和依賴關系的維護交給Spring容器去管理驱闷。Spring通過工廠模式、反射機制等技術管理對象的作用域和生命周期空免。AoP一般稱為面向切面編程空另,是面向對象的一種補充,將程序中獨立于其他功能的方法抽取出來蹋砚,使Java開發(fā)模塊化扼菠,僅需專注于主業(yè)務即可

2. Spring的特點是什么?

輕 量坝咐、控 制 反 轉循榆、面 向 切 面 的 編 程(AOP)、容 器墨坚、MVC 框 架秧饮、事 務 管 理、異 常 處 理

3. Spring的優(yōu)缺點是什么泽篮?

優(yōu)點

方便解耦盗尸,簡化開發(fā)

可以將對象的創(chuàng)建和依賴關系的維護交給Spring管理。

提供面向切面編程帽撑,可以方便的實現(xiàn)對程序進行權限攔截泼各、運行監(jiān)控等功能。

聲明式事務的支持

只需要通過配置就可以完成對事務的管理亏拉,而無需手動編程扣蜻。

可以通過注解方便的測試程序。

內部提供了對各種優(yōu)秀框架的直接支持专筷,方便集成各種優(yōu)秀框架弱贼。

降低 JavaEE API 的使用難度

缺點

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

Spring依賴反射磷蛹,反射影響性能

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

4. Spring由哪些模塊組成?

Spring 總共有 20 個模塊, 由 1300 多個不同的文件構成庇勃。 而這些組件被分別整合在核心容器 檬嘀、 AOP和設備支持 、數(shù)據(jù)訪問與集成 责嚷、 Web鸳兽、 消息 、 測試 6 個模塊中

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

這是基本的 Spring 模塊罕拂,提供 spring 框架的基礎功能, BeanFactory 是任何以 spring 為基礎的應用的核心.它使 Spring 成為一個容器 揍异。BeanFactory是工廠模式的一個實現(xiàn),提供了控制反轉功能爆班,用來把應用的配置和依賴從真正的應用代碼中分離衷掷。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根據(jù)XML文件中的定義加載beans柿菩。該容器從XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應用戚嗅。

6. 解釋AOP模塊

AOP 模塊用于 Spring 應用做面向切面的開發(fā),很多支持由 AOP 聯(lián)盟提供枢舶,這樣就確保了 Spring和其他 AOP 框架的共通性懦胞。AOP模塊將元數(shù)據(jù)編程引入Spring。

7. 解釋JDBC抽象和DAO模塊

通過使用JDBC抽象和 DAO 模塊凉泄,保證數(shù)據(jù)庫代碼的簡潔躏尉,并能避免數(shù)據(jù)庫資源錯誤關閉導致的問題, 它在各種不同的數(shù)據(jù)庫的錯誤信息之上旧困,提供了一個統(tǒng)一的異常訪問層醇份。它還利用 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 ,它把傳統(tǒng)上由程序代碼直接操控的對象的調用權交給容器恼策,通過容器來實現(xiàn)組件對象的裝配和管理鸦致。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。Spring IOC 負責創(chuàng)建對象分唾,管理對象抗碰,裝配對象,配置對象绽乔,并且管理這些對象的整個生命周期弧蝇。

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

管理對象的創(chuàng)建和依賴關系的維護。

方便解耦折砸,由容器去維護具體的對象

托管了類的產生過程看疗。

13.控制反轉(IoC)的優(yōu)點是什么?

把應用的代碼量降到最低。

它使應用容易測試鞍爱,單元測試不再需要單例和JNDI查找機制鹃觉。

最小的代價和最小的侵入性使松散耦合得以實現(xiàn)专酗。

IoC容器支持加載服務時的餓漢式初始化和懶加載睹逃。

14. Spring IoC 的實現(xiàn)機制

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

15. Spring 的 IoC支持哪些功能

依賴注入

依賴檢查

自動裝配

支持集合

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

支持回調某些方法

16. ApplicationContext 通常的實現(xiàn)是什么?

FileSystemXmlApplicationContext容器 :此容器從一個XML 文件中加載 beans 的定義祷肯,XML Bean配置文件的全路徑名必須提供給它的構造函數(shù) 沉填。

ClassPathXmlApplicationContext容器:此容器從一個 XML 文件中加載 beans 的定義,需要正確設置 classpath 佑笋。因為這個容器將在 classpath 里面找 bean 的配置翼闹。

WebXmlApplicationContext容器:此容器加載一個 XML 文件,此文件定義了一個 WEB 應用的所有 bean蒋纬。

17. BeanFactory和 Application contexts 有什么區(qū)別?

BeanFactory:是Spring里面最低層的接口猎荠,提供了最簡單的容器的功能,而且只提供了實例化對象和拿對象的功能蜀备;ApplicationContext:是應用上下文关摇,繼承BeanFactory接口,它是Spring的一個更高級的容器碾阁,提供了更多的有用的功能输虱,這些功能包括;國際化訪問資源脂凶,如URL和文件載入多個有繼承關系的上下文 宪睹,使得每一個上下文都專注于一個特定的層次,比如應用的web層 消息發(fā)送和響應機制AOP兩者的區(qū)別在于裝載beans時的區(qū)別:BeanFactory在啟動的時候不會去實例化Bean蚕钦,當Spring應用中有從容器拿Bean的時候才會去實例化亭病;ApplicationContext在啟動的時候就把所有的Bean全部實例化了,它還可以通過配置來實現(xiàn)Bean的延遲實例化嘶居,所以實際開發(fā)中推薦使用Application contexts罪帖。

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

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

Spring AOP

Spring 的 XML 配置文件

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

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

依賴注入是組件之間的依賴關系,由容器在應用系統(tǒng)運行期來決定胸蛛,也就是由容器動態(tài)地將某種依賴關系的目標對象實例化污茵,并注入到應用系統(tǒng)中的各個關聯(lián)的組件之中。組件不做定位查詢葬项,只提供普通的Java方法讓容器去決定依賴關系泞当。

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

應用組件不應該負責查找資源或者其他依賴的協(xié)作對象民珍。

配置對象的工作應該由IoC容器負責襟士,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給IoC容器負責嚷量。

IoC容器全權負責組件的裝配陋桂,它會把符合依賴關系的對象通過屬性或者是構造器傳遞給需要的對象。

21. 依賴注入有什么優(yōu)勢

查找定位操作與應用代碼完全無關蝶溶。

不依賴于容器的API嗜历,可以很容易地在任何容器以外使用應用對象。

不需要特殊的接口抖所,絕大多數(shù)對象可以做到完全不必依賴容器梨州。

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

構造器注入、接口注入和 Setter 方法注入田轧。最好的解決方案是用構造器參數(shù)實現(xiàn)強制依賴, setter 方法實現(xiàn)可選依賴暴匠。

23. 什么是 Spring Beans ?

Spring beans 是那些形成 Spring 應用主干的 java 對象,它們被 Spring IOC 容器初始化傻粘,裝配每窖,和管理,這些 beans 通過容器中配置的元數(shù)據(jù)創(chuàng)建弦悉。

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

一個 Spring Bean 的定義包含容器必知的所有配置元數(shù)據(jù)窒典,包括如何創(chuàng)建一個bean,它的生命周期詳情及它的依賴警绩。

25. 如何給 Spring 容器提供配置元數(shù)據(jù)?

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 的定義可以有多個實例,但該作用域謹慎使用湖饱,頻繁創(chuàng)建和銷毀會嚴重影響性能。

request作用域:每次 http 請求都會創(chuàng)建一個 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 是無狀態(tài)的(比如 dao類)姚糊,某種程度上來說 bean 也是安全的贿衍,但如果 bean 有狀態(tài)的話(比如 view model 對象),那就要開發(fā)者自己去保證線程安全了救恨。最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”释树,這樣請求 bean 相當于 new Bean()了肠槽,就可以保證線程安全了。

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

Spring 容器從XML 文件中讀取 bean 的定義奢啥,并實例化 bean秸仙。Spring 根據(jù) bean 的定義填充所有的屬性。

如果 bean 實現(xiàn)了 BeanNameAware 接口.Spring 傳遞 bean 的ID到 setBeanName 方法桩盲。

如果 Bean 實現(xiàn)了 BeanFactoryAware 接口寂纪, Spring 傳遞 beanFactory 給 setBeanFactory 方法。

如果有任何與 bean 相關聯(lián)的 BeanPostProcessors, Spring 會在 postProcesserBeforeInitialization() 方法內調用它們.

如果 bean 實現(xiàn) IntializingBean 了赌结,調用它的 afterPropertySet 方法捞蛋,如果 bean 聲明了初始化方法,調用此初始化方法柬姚。

如果有 BeanPostProcessors 和 bean 關聯(lián)拟杉,這些 bean 的 postProcessAfterInitialization() 方法將被調用。

如果 bean 實現(xiàn)了 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 的配置元數(shù)據(jù)中,可以在 <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 之間的協(xié)作。

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

no方式:是默認的方式如迟,不進行自動裝配收毫,通過顯式設置 ref 屬性來進行裝配。

byName方式:是通過參數(shù)名自動裝配殷勘,Spring 容器在配置文件中發(fā)現(xiàn) bean 的 autowire 屬性被設置成 byname之后此再,容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean劳吠。

byType方式: 是通過參數(shù)類型自動裝配引润,Spring 容器在配置文件中發(fā)現(xiàn) bean 的 autowire 屬性被設置成 byType之后,容器試圖匹配痒玩、裝配和該 bean 的屬性具有相同類型的 bean淳附。如果有多個 bean 符合條件议慰,則拋出錯誤。

constructor方式:這個方式類似于 byType方式奴曙,但是要提供給構造器參數(shù)吝镣,如果沒有確定的帶參數(shù)的構造器參數(shù)類型糊肠,將會拋出異常。

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

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

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

不能自動裝配簡單的屬性,如基本數(shù)據(jù)類型薪介,String 字符串和類祠饺。

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

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

可以记劈。

38. 什么是基于 java 的 Spring 注解配置?給一些注解的例子

基于 Java 的配置勺鸦,允許在少量的 Java 注解的幫助下,進行大部分 Spring 配置而非通過 XML 文件目木。以@Configuration注解為例换途,它用來標記類可以當做一個 bean 的定義,被 Spring IOC 容器使用嘶窄。另一個例子是@Bean注解怀跛,它表示此方法將要返回一個對象,作為一個 bean 注冊進 Spring 應用上下文柄冲。

39. 什么是基于注解的容器配置

相對于 XML 文件,注解型的配置依賴于通過字節(jié)碼元數(shù)據(jù)裝配組件忠蝗,而非尖括號的聲明现横。開發(fā)者通過在相應的類,方法或屬性上使用注解的方式阁最,直接在組件類中進行配置戒祠,而不是使用XML文件的方式表述 bean 的裝配關系。

40. 怎樣開啟注解裝配?

注解裝配在默認情況下是不開啟的速种,為了使用注解裝配姜盈,必須在 Spring 配置文件中配置context:annotation-config/元素 。

41. @Required 注解

@Required 注解表明 bean 的屬性必須在配置的時候設置配阵,通過一個 bean 定義的顯式的屬性值或通過自動裝配馏颂。若 @Required 注解的bean 屬性未被設置示血,容器將拋出異常。

  1. @Autowired 注解

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

  1. @Qualifier 注解

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

  1. @RequestMapping 注解

@RequestMapping 注解用于將特定 HTTP 請求方法映射到處理相應請求的控制器中的特定類或者方法蒂萎。

45. @Autowired和@Resource之間的區(qū)別

@Autowired注解:默認是按照類型來裝配注入的秆吵,它要求依賴對象必須存在。

@Resource注解:默認是按照名稱來裝配注入的岖是,只有找不到與名稱匹配的bean才會按照類型來裝配注入帮毁。

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

使用 Spring JDBC 框架,資源管理和錯誤處理的代價都會被減輕豺撑。開發(fā)者只需寫 statements 從數(shù)據(jù)庫存取數(shù)據(jù)烈疚,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate

47. 什么是JdbcTemplate聪轿?

JdbcTemplate 類提供了很多便利的方法來解決問題爷肝,如把數(shù)據(jù)庫數(shù)據(jù)轉變成基本數(shù)據(jù)類型或對象,執(zhí)行寫好的或可調用的數(shù)據(jù)庫操作語句陆错,提供自定義的數(shù)據(jù)錯誤處理灯抛。

48. Spring 對數(shù)據(jù)訪問對象(DAO)的支持?

Spring 對數(shù)據(jù)訪問對象(DAO)的支持旨在簡化數(shù)據(jù)訪問技術音瓷,方便切換持久層对嚼,編碼時也不用擔心會捕獲每種技術特有的異常。

49. Spring 支持的事務管理類型

編程式事務管理: 通過編程的方式管理事務绳慎,帶來極大的靈活性纵竖,但是難以維護 。

聲明式事務管理 :可以將業(yè)務代碼和事務管理分離杏愤,只需用注解和 XML 配置來管理事務靡砌。

50. Spring事務的實現(xiàn)方式和實現(xiàn)原理

Spring事務的本質其實就是數(shù)據(jù)庫對事務的支持,沒有數(shù)據(jù)庫的事務支持珊楼,spring是無法提供事務管理功能的通殃。真正的數(shù)據(jù)庫層的事務提交和回滾是通過binlog或者redo log實現(xiàn)的。

51. 事務的ACID是指什么厕宗?

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

一致性(Consistent):事務結束后系統(tǒng)狀態(tài)是一致的照宝;

隔離性(Isolated):并發(fā)執(zhí)行的事務彼此無法看到對方的中間狀態(tài);

持久性(Durable):事務完成后所做的改動都會被持久化句葵,即使發(fā)生災難性的失敗厕鹃,通過日志和同步備份可以在故障發(fā)生后重建數(shù)據(jù)。

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

DEFAULT:是Spring事務默認的隔離級別剂碴,使用數(shù)據(jù)庫默認的事務隔離機制

未提交讀(read uncommited):是最低的事務隔離級別,它允許另外一個事務可以讀取當前事務未提交的數(shù)據(jù)轻专。臟讀忆矛,不可重復讀,幻讀都有可能發(fā)生

已提交讀(read commited): 保證一個事務提交后才能被另外一個事務讀取请垛,另外一個事務不能讀取該事務未提交的數(shù)據(jù)催训。避免了臟讀,但是不可重復讀和幻讀都有可能發(fā)生

可重復讀(repeatable read):保證一個事務不會修改已經由另一個事務讀取但未提交或者未回滾的數(shù)據(jù)宗收,避免了臟讀和不可重復讀漫拭,但是幻讀有可能發(fā)生

可串行化(serializable):最嚴格的事務隔離級別,支持事務串行執(zhí)行混稽,資源消耗最大采驻,避免了臟讀,不可重復讀匈勋,幻讀

  1. 什么是臟讀礼旅、不可重復讀、幻讀洽洁?

臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數(shù)據(jù)痘系。比如A事務執(zhí)行過程中,B事務讀取了A事務的修改饿自。但是由于某些原因A事務沒有完成提交碎浇,發(fā)生了回滾操作,則B事務所讀取的數(shù)據(jù)是不正確的璃俗,這就是臟讀。

不可重復讀 :表示一個事務讀到另一個事務已經提交的updated數(shù)據(jù)悉默,導致多次查詢結果不一致城豁。比如B事務讀取了兩次數(shù)據(jù),在這兩次的讀取過程中A事務修改了數(shù)據(jù)抄课,導致B事務的這兩次讀取出來的數(shù)據(jù)不一樣唱星,這就是不可重復讀

幻讀 :表示一個事務讀到另一個事務已經提交的insert數(shù)據(jù)雳旅,導致多次查詢結果不一致。比如B事務讀取了兩次數(shù)據(jù)间聊,在這兩次的讀取過程中A事務添加了數(shù)據(jù)攒盈,導致B事務的這兩次讀取出來的數(shù)據(jù)不一樣,這就是幻讀

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

PROPAGATION_REQUIRED級別: 默認的spring事務傳播級別型豁,如果已經存在一個事務,則支持當前事務尚蝌。如果當前不存在事務迎变,則開啟一個新的事務。

PROPAGATION_SUPPORTS級別: 如果已經存在一個事務飘言,則支持當前事務衣形。如果當前不存在事務,則使用非事務的方式執(zhí)行姿鸿。

PROPAGATION_MANDATORY級別: 如果已經存在一個事務谆吴,則支持當前事務。如果當前不存在事務苛预,則拋出異常句狼。

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

PROPAGATION_NOT_SUPPORTED級別: 總是使用非事務的方式執(zhí)行,并掛起任何存在的事務

PROPAGATION_NEVER級別: 使用非事務的方式執(zhí)行苫拍,如果當前存在事務芜繁,則拋出異常。

PROPAGATION_NESTED級別: 如果當前存在事務绒极,則嵌套在事務內執(zhí)行骏令。如果當前不存在事務,則按PROPAGATION_REQUIRED屬性執(zhí)行垄提。

55. Spring 框架的事務管理有哪些優(yōu)點 榔袋?

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

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

它支持聲明式事務管理铡俐。

它可以很好的集成 Spring 的各種數(shù)據(jù)訪問抽象層凰兑。

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

對于聲明式事務管理和編程式事務管理审丘,我更喜歡選擇聲明式事務管理吏够,因為它對應用代碼的影響最小,更符合一個無侵入的輕量級容器的思想。

57. 解釋 AOP锅知?

AOP:一般稱為面向切面編程作為面向對象的一種補充播急,用于將那些與業(yè)務無關,但卻對多個對象產生影響的公共行為和邏輯售睹,抽取并封裝為一個可復用的模塊桩警。這個模塊被命名為“切面”,減少了系統(tǒng)中的重復代碼昌妹,降低了模塊間的耦合度捶枢,同時提高了系統(tǒng)的可維護性,可用于權限認證捺宗、日志柱蟀、事務處理等方面。

58. Spring AOP and AspectJ AOP 有什么區(qū)別蚜厉?AOP 有哪些實現(xiàn)方式长已?

AOP實現(xiàn)的關鍵在于代理模式,AOP代理主要分為靜態(tài)代理和動態(tài)代理昼牛。AspectJ是靜態(tài)代理的增強术瓮,所謂靜態(tài)代理就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強贰健。它會在編譯階段將AspectJ切面織入到Java字節(jié)碼中胞四,運行的時候就是增強之后的AOP對象。Spring AOP使用的是動態(tài)代理伶椿,所謂的動態(tài)代理就是說AOP框架不會去修改字節(jié)碼辜伟,而是每次運行時在內存中臨時為方法生成一個AOP對象。這個AOP對象包含了目標對象的全部方法脊另,并且在特定的切點做了增強處理导狡,并回調原對象的方法。

59. JDK動態(tài)代理和CGLIB動態(tài)代理的區(qū)別偎痛?

區(qū)別在于生成AOP代理對象的時機不同旱捧,相對來說AspectJ的靜態(tài)代理方式具有更好的性能,但AspectJ需要特定的編譯器進行處理踩麦,而Spring AOP代表的動態(tài)代理則無需特定的編譯器處理枚赡。

60. 什么是代理?

代理是通知目標對象后創(chuàng)建的對象谓谦。從客戶端的角度看贫橙,代理對象和目標對象是一樣的。

61. 解釋一下Spring AOP里面的幾個名詞反粥?

切面:是通知和切點的結合料皇,通知和切點共同定義了切面的全部內容谓松。 在Spring AOP中,切面可以使用通用類或者在普通類中以 @AspectJ 注解來實現(xiàn)践剂。

連接點:指方法,在Spring AOP中娜膘,一個連接點總是代表一個方法的執(zhí)行逊脯。

通知:在Spring AOP中,切面的工作被稱為通知竣贪,通知是一個在方法執(zhí)行前或執(zhí)行后要做的動作军洼。

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

引入:引入允許向現(xiàn)有類添加新方法或屬性。

目標對象: 被一個或者多個切面所通知的對象爷耀,它通常是一個代理對象甘桑。

織入:織入是將切面和到其他應用類型或對象連接或創(chuàng)建一個被通知對象的過程,織入可以在編譯時歹叮,加載時跑杭,或運行時完成。

62. Spring通知有哪些類型咆耿?

前置通知:在一個方法執(zhí)行之前調用的通知德谅。

后通知: 在方法執(zhí)行之后調用的通知,無論方法執(zhí)行是否成功萨螺。

返回后通知: 僅當方法成功完成后調用的通知窄做。

拋出異常后通知: 在方法拋出異常退出時調用的通知。

環(huán)繞通知: 在方法執(zhí)行之前和之后調用的通知 慰技。

63. 在 Spring AOP 中椭盏,關注點和橫切關注點的區(qū)別是什么?

關注點是應用中一個模塊的行為惹盼,一個關注點可能會被定義成一個想實現(xiàn)的功能庸汗。

橫切關注點是一個關注點,此關注點是整個應用都會使用的功能手报,并影響整個應用蚯舱。比如日志,安全和數(shù)據(jù)傳輸掩蛤,幾乎是應用的每個模塊都需要的功能枉昏。

64. 什么是(Aspect)切面?

AspectJ切面是AOP的核心揍鸟,它將多個類的通用行為封裝成可復用的模塊兄裂,該模塊含有一組API提供橫切功能句旱。比如,一個日志模塊可以被稱作日志的AOP切面晰奖,根據(jù)需求的不同谈撒,一個應用程序可以有若干切面。在SpringAOP中匾南,切面通過帶有@Aspect注解的類實現(xiàn)啃匿。

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

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

66. 解釋基于注解的切面實現(xiàn)蛆楞?

在這種情況下(基于@AspectJ注解的實現(xiàn))溯乒,涉及到的切面聲明的風格與帶有 java5 標注的普通 java 類一致。

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

工廠模式:BeanFactory是工廠模式的一個實現(xiàn)裆悄,用來創(chuàng)建對象的實例;

單例模式:Spring配置文件定義的Bean默認為單例模式臂聋。

代理模式:Spring的AOP功能的實現(xiàn)用到了代理模式光稼;

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

JpaTemplate模版類逻住。

觀察者模式:定義對象間的一種一對多的依賴關系钟哥,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知并自動更新瞎访。

68. Spring基于XML注入bean的幾種方式腻贰?

setter方法注入

構造器注入

靜態(tài)工廠注入

實例工廠注入

69. @Component, @Controller, @Repository, @Service 有何區(qū)別?

@Component:是通用注解扒秸,其他三個注解是這個注解的拓展播演,并且各自具有特定的功能

@Controller:是spring-mvc的注解,具有將請求進行轉發(fā)伴奥,重定向的功能

@Service:是業(yè)務邏輯層注解写烤,用于標注該類處于業(yè)務邏輯層。

@Repository:在持久層中拾徙,具有將數(shù)據(jù)庫操作拋出的原生異常翻譯轉化為Spring的持久層異常的功能

70. Spring如何處理線程并發(fā)問題洲炊?

一般情況下,只有無狀態(tài)的Bean才可以在多線程的環(huán)境下共享尼啡。在Spring中暂衡,絕大部分Bean都可以聲明為singleton作用域。因為Spring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進行處理崖瞭,解決線程安全問題狂巢。ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題,ThreadLocal采用了“空間換時間”的方式书聚,而線程同步機制采用了“時間換空間”的方式唧领。ThreadLocal會為每一個線程提供一個獨立的變量副本藻雌,從而隔離了多個線程對數(shù)據(jù)的訪問沖突。因為每一個線程都擁有自己的變量副本斩个,也就沒有必要對該變量進行同步了胯杭。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時萨驶,可以把不安全的變量封裝進ThreadLocal歉摧。

面試題系列文章傳送門

有問題歡迎私信指出,我是碼農阿斌腔呜,一個互聯(lián)網(wǎng)行業(yè)的菜鳥,立志成為一名架構師再悼。https://lianghongbin.blog.csdn.net/

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末核畴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冲九,更是在濱河造成了極大的恐慌谤草,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莺奸,死亡現(xiàn)場離奇詭異丑孩,居然都是意外死亡,警方通過查閱死者的電腦和手機灭贷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門温学,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甚疟,你說我怎么就攤上這事仗岖。” “怎么了览妖?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵轧拄,是天一觀的道長。 經常有香客問我讽膏,道長檩电,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任府树,我火速辦了婚禮俐末,結果婚禮上,老公的妹妹穿的比我還像新娘挺尾。我一直安慰自己鹅搪,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布遭铺。 她就那樣靜靜地躺著丽柿,像睡著了一般恢准。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甫题,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天馁筐,我揣著相機與錄音,去河邊找鬼坠非。 笑死敏沉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的炎码。 我是一名探鬼主播盟迟,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼潦闲!你這毒婦竟也來了攒菠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤歉闰,失蹤者是張志新(化名)和其女友劉穎辖众,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體和敬,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凹炸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昼弟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤它。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖私杜,靈堂內的尸體忽然破棺而出蚕键,到底是詐尸還是另有隱情,我是刑警寧澤衰粹,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布锣光,位于F島的核電站,受9級特大地震影響铝耻,放射性物質發(fā)生泄漏誊爹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一瓢捉、第九天 我趴在偏房一處隱蔽的房頂上張望频丘。 院中可真熱鬧,春花似錦泡态、人聲如沸搂漠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桐汤。三九已至而克,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怔毛,已是汗流浹背员萍。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拣度,地道東北人碎绎。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像抗果,于是被迫代替她去往敵國和親筋帖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容