前言
作為應屆生,處于找工作中。今年2月份剛剛整理出來的Spring面試題,時間比較趕就沒有按照Spring的模塊比如aop、ioc那些分類排序了??偠灾?,順序比較亂,希望大家耐著性子 看。如果實在介意,評論告知,我會視情況作修改的。另外如果大家覺得我找的答案不夠清晰,歡迎私信或者評論只出,我看到都會去修改的!
Spring面試題內容
1. 談談你對Spring的理解?
Spring框架是一個輕量級的開源框架,是核心容器、數據訪問與集成、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管理。
提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監(jiān)控等功能。
聲明式事務的支持
只需要通過配置就可以完成對事務的管理,而無需手動編程。
可以通過注解方便的測試程序。
內部提供了對各種優(yōu)秀框架的直接支持,方便集成各種優(yōu)秀框架。
降低 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 文件讀取配置元數據并用它去創(chuàng)建一個完全配置的系統(tǒng)或應用。
6. 解釋AOP模塊
AOP 模塊用于 Spring 應用做面向切面的開發(fā),很多支持由 AOP 聯盟提供,這樣就確保了 Spring和其他 AOP 框架的共通性。AOP模塊將元數據編程引入Spring。
7. 解釋JDBC抽象和DAO模塊
通過使用JDBC抽象和 DAO 模塊,保證數據庫代碼的簡潔,并能避免數據庫資源錯誤關閉導致的問題, 它在各種不同的數據庫的錯誤信息之上,提供了一個統(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)上由程序代碼直接操控的對象的調用權交給容器,通過容器來實現組件對象的裝配和管理。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。Spring IOC 負責創(chuàng)建對象,管理對象,裝配對象,配置對象,并且管理這些對象的整個生命周期。
12. 控制反轉(IoC)有什么作用
管理對象的創(chuàng)建和依賴關系的維護。
方便解耦,由容器去維護具體的對象
托管了類的產生過程。
13.控制反轉(IoC)的優(yōu)點是什么?
把應用的代碼量降到最低。
它使應用容易測試,單元測試不再需要單例和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 有什么區(qū)別?
BeanFactory:是Spring里面最低層的接口,提供了最簡單的容器的功能,而且只提供了實例化對象和拿對象的功能;ApplicationContext:是應用上下文,繼承BeanFactory接口,它是Spring的一個更高級的容器,提供了更多的有用的功能,這些功能包括;國際化訪問資源,如URL和文件載入多個有繼承關系的上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層 消息發(fā)送和響應機制AOP兩者的區(qū)別在于裝載beans時的區(qū)別:BeanFactory在啟動的時候不會去實例化Bean,當Spring應用中有從容器拿Bean的時候才會去實例化;ApplicationContext在啟動的時候就把所有的Bean全部實例化了,它還可以通過配置來實現Bean的延遲實例化,所以實際開發(fā)中推薦使用Application contexts。
18. 一個 Spring 的應用看起來像什么?
一個定義了一些功能的接口 。
Spring AOP
Spring 的 XML 配置文件
使用以上功能的客戶端程序
19. 什么是Spring的依賴注入(DI)?
依賴注入是組件之間的依賴關系,由容器在應用系統(tǒng)運行期來決定,也就是由容器動態(tài)地將某種依賴關系的目標對象實例化,并注入到應用系統(tǒng)中的各個關聯的組件之中。組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關系。
20. 依賴注入的基本原則?
應用組件不應該負責查找資源或者其他依賴的協(xié)作對象。
配置對象的工作應該由IoC容器負責,查找資源的邏輯應該從應用組件的代碼中抽取出來,交給IoC容器負責。
IoC容器全權負責組件的裝配,它會把符合依賴關系的對象通過屬性或者是構造器傳遞給需要的對象。
21. 依賴注入有什么優(yōu)勢
查找定位操作與應用代碼完全無關。
不依賴于容器的API,可以很容易地在任何容器以外使用應用對象。
不需要特殊的接口,絕大多數對象可以做到完全不必依賴容器。
22. 有哪些不同類型的依賴注入方式,推薦使用哪種?
構造器注入、接口注入和 Setter 方法注入。最好的解決方案是用構造器參數實現強制依賴, setter 方法實現可選依賴。
23. 什么是 Spring Beans ?
Spring beans 是那些形成 Spring 應用主干的 java 對象,它們被 Spring IOC 容器初始化,裝配,和管理,這些 beans 通過容器中配置的元數據創(chuàng)建。
24. 一個 Spring Bean 定義包含什么?
一個 Spring Bean 的定義包含容器必知的所有配置元數據,包括如何創(chuàng)建一個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 的定義可以有多個實例,但該作用域謹慎使用,頻繁創(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 根據 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 之間的協(xié)作。
35. 解釋不同方式的自動裝配
no方式:是默認的方式,不進行自動裝配,通過顯式設置 ref 屬性來進行裝配。
byName方式:是通過參數名自動裝配,Spring 容器在配置文件中發(fā)現 bean 的 autowire 屬性被設置成 byname之后,容器試圖匹配、裝配和該 bean 的屬性具有相同名字的 bean。
byType方式: 是通過參數類型自動裝配,Spring 容器在配置文件中發(fā)現 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 文件,注解型的配置依賴于通過字節(jié)碼元數據裝配組件,而非尖括號的聲明。開發(fā)者通過在相應的類,方法或屬性上使用注解的方式,直接在組件類中進行配置,而不是使用XML文件的方式表述 bean 的裝配關系。
40. 怎樣開啟注解裝配?
注解裝配在默認情況下是不開啟的,為了使用注解裝配,必須在 Spring 配置文件中配置context:annotation-config/元素 。
41. @Required 注解
@Required 注解表明 bean 的屬性必須在配置的時候設置,通過一個 bean 定義的顯式的屬性值或通過自動裝配。若 @Required 注解的bean 屬性未被設置,容器將拋出異常。
- @Autowired 注解
@Autowired 注解提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和 @Required 注解一樣,修飾 setter 方法、構造器、屬性或者具有任意名稱和多個參數的方法。
- @Qualifier 注解
當有多個相同類型的 bean 卻只有一個需要自動裝配時,將 @Qualifier 注解和 @Autowire 注解結合使用以消除這種混淆,指定需要裝配的 bean。
- @RequestMapping 注解
@RequestMapping 注解用于將特定 HTTP 請求方法映射到處理相應請求的控制器中的特定類或者方法。
45. @Autowired和@Resource之間的區(qū)別
@Autowired注解:默認是按照類型來裝配注入的,它要求依賴對象必須存在。
@Resource注解:默認是按照名稱來裝配注入的,只有找不到與名稱匹配的bean才會按照類型來裝配注入。
46. 在 Spring 框架中如何更有效地使用JDBC
使用 Spring JDBC 框架,資源管理和錯誤處理的代價都會被減輕。開發(fā)者只需寫 statements 從數據庫存取數據,JDBC 也可以在 Spring 框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate
47. 什么是JdbcTemplate?
JdbcTemplate 類提供了很多便利的方法來解決問題,如把數據庫數據轉變成基本數據類型或對象,執(zhí)行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。
48. Spring 對數據訪問對象(DAO)的支持?
Spring 對數據訪問對象(DAO)的支持旨在簡化數據訪問技術,方便切換持久層,編碼時也不用擔心會捕獲每種技術特有的異常。
49. Spring 支持的事務管理類型
編程式事務管理: 通過編程的方式管理事務,帶來極大的靈活性,但是難以維護 。
聲明式事務管理 :可以將業(yè)務代碼和事務管理分離,只需用注解和 XML 配置來管理事務。
50. Spring事務的實現方式和實現原理
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務管理功能的。真正的數據庫層的事務提交和回滾是通過binlog或者redo log實現的。
51. 事務的ACID是指什么?
原子性(Atomic):事務中各項操作,要么全做要么全不做,任何一項操作的失敗都會導致整個事務的失??;
一致性(Consistent):事務結束后系統(tǒng)狀態(tài)是一致的;
隔離性(Isolated):并發(fā)執(zhí)行的事務彼此無法看到對方的中間狀態(tài);
持久性(Durable):事務完成后所做的改動都會被持久化,即使發(fā)生災難性的失敗,通過日志和同步備份可以在故障發(fā)生后重建數據。
52. Spring事務的五種事務隔離級別?
DEFAULT:是Spring事務默認的隔離級別,使用數據庫默認的事務隔離機制
未提交讀(read uncommited):是最低的事務隔離級別,它允許另外一個事務可以讀取當前事務未提交的數據。臟讀,不可重復讀,幻讀都有可能發(fā)生
已提交讀(read commited): 保證一個事務提交后才能被另外一個事務讀取,另外一個事務不能讀取該事務未提交的數據。避免了臟讀,但是不可重復讀和幻讀都有可能發(fā)生
可重復讀(repeatable read):保證一個事務不會修改已經由另一個事務讀取但未提交或者未回滾的數據,避免了臟讀和不可重復讀,但是幻讀有可能發(fā)生
可串行化(serializable):最嚴格的事務隔離級別,支持事務串行執(zhí)行,資源消耗最大,避免了臟讀,不可重復讀,幻讀
- 什么是臟讀、不可重復讀、幻讀?
臟讀 :表示一個事務能夠讀取另一個事務中還未提交的數據。比如A事務執(zhí)行過程中,B事務讀取了A事務的修改。但是由于某些原因A事務沒有完成提交,發(fā)生了回滾操作,則B事務所讀取的數據是不正確的,這就是臟讀。
不可重復讀 :表示一個事務讀到另一個事務已經提交的updated數據,導致多次查詢結果不一致。比如B事務讀取了兩次數據,在這兩次的讀取過程中A事務修改了數據,導致B事務的這兩次讀取出來的數據不一樣,這就是不可重復讀
幻讀 :表示一個事務讀到另一個事務已經提交的insert數據,導致多次查詢結果不一致。比如B事務讀取了兩次數據,在這兩次的讀取過程中A事務添加了數據,導致B事務的這兩次讀取出來的數據不一樣,這就是幻讀
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 的各種數據訪問抽象層。
56. 你更傾向使用哪種事務管理類型?
對于聲明式事務管理和編程式事務管理,我更喜歡選擇聲明式事務管理,因為它對應用代碼的影響最小,更符合一個無侵入的輕量級容器的思想。
57. 解釋 AOP?
AOP:一般稱為面向切面編程作為面向對象的一種補充,用于將那些與業(yè)務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取并封裝為一個可復用的模塊。這個模塊被命名為“切面”,減少了系統(tǒng)中的重復代碼,降低了模塊間的耦合度,同時提高了系統(tǒng)的可維護性,可用于權限認證、日志、事務處理等方面。
58. Spring AOP and AspectJ AOP 有什么區(qū)別?AOP 有哪些實現方式?
AOP實現的關鍵在于代理模式,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 注解來實現。
連接點:指方法,在Spring AOP中,一個連接點總是代表一個方法的執(zhí)行。
通知:在Spring AOP中,切面的工作被稱為通知,通知是一個在方法執(zhí)行前或執(zhí)行后要做的動作。
切點:切點的定義會匹配通知所要織入的一個或多個連接點。通常使用明確的類和方法名稱,或是利用正則表達式定義所匹配的類和方法名稱來指定切點。
引入:引入允許向現有類添加新方法或屬性。
目標對象: 被一個或者多個切面所通知的對象,它通常是一個代理對象。
織入:織入是將切面和到其他應用類型或對象連接或創(chuàng)建一個被通知對象的過程,織入可以在編譯時,加載時,或運行時完成。
62. Spring通知有哪些類型?
前置通知:在一個方法執(zhí)行之前調用的通知。
后通知: 在方法執(zhí)行之后調用的通知,無論方法執(zhí)行是否成功。
返回后通知: 僅當方法成功完成后調用的通知。
拋出異常后通知: 在方法拋出異常退出時調用的通知。
環(huán)繞通知: 在方法執(zhí)行之前和之后調用的通知 。
63. 在 Spring AOP 中,關注點和橫切關注點的區(qū)別是什么?
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個想實現的功能。
橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用。比如日志,安全和數據傳輸,幾乎是應用的每個模塊都需要的功能。
64. 什么是(Aspect)切面?
AspectJ切面是AOP的核心,它將多個類的通用行為封裝成可復用的模塊,該模塊含有一組API提供橫切功能。比如,一個日志模塊可以被稱作日志的AOP切面,根據需求的不同,一個應用程序可以有若干切面。在SpringAOP中,切面通過帶有@Aspect注解的類實現。
65. 有幾種不同類型的自動代理?
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying
66. 解釋基于注解的切面實現?
在這種情況下(基于@AspectJ注解的實現),涉及到的切面聲明的風格與帶有 java5 標注的普通 java 類一致。
67. Spring 框架中都用到了哪些設計模式?
工廠模式:BeanFactory是工廠模式的一個實現,用來創(chuàng)建對象的實例;
單例模式:Spring配置文件定義的Bean默認為單例模式。
代理模式:Spring的AOP功能的實現用到了代理模式;
模板方法模式:用來解決代碼重復的問題。比如. 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:在持久層中,具有將數據庫操作拋出的原生異常翻譯轉化為Spring的持久層異常的功能
70. Spring如何處理線程并發(fā)問題?
一般情況下,只有無狀態(tài)的Bean才可以在多線程的環(huán)境下共享。在Spring中,絕大部分Bean都可以聲明為singleton作用域。因為Spring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進行處理,解決線程安全問題。ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題,ThreadLocal采用了“空間換時間”的方式,而線程同步機制采用了“時間換空間”的方式。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
面試題系列文章傳送門
有問題歡迎私信指出,我是碼農阿斌,一個互聯網行業(yè)的菜鳥,立志成為一名架構師。https://lianghongbin.blog.csdn.net/