Java經(jīng)典面試題匯總:Spring
1. 什么是Spring? 有哪些優(yōu)點(diǎn)?
Spring 是個(gè)Java企業(yè)級(jí)應(yīng)用的開(kāi)源開(kāi)發(fā)框架,主要用來(lái)開(kāi)發(fā)Java應(yīng)用,但是有些擴(kuò)展是針對(duì)構(gòu)建J2EE平臺(tái)的web應(yīng)用,目標(biāo)是簡(jiǎn)化Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā),并通過(guò)POJO為基礎(chǔ)的編程模型促進(jìn)良好的編程習(xí)慣。
主要有以下優(yōu)點(diǎn):
- 提供了 IOC 技術(shù),容器會(huì)幫你管理依賴(lài)的對(duì)象,從而不需要自己創(chuàng)建和管理依賴(lài)對(duì)象了,更輕松的實(shí)現(xiàn)了程序的解耦。
- 提供了事務(wù)支持,使得事務(wù)操作變的更加方便。
- 提供了面向切片編程,這樣可以更方便的處理某一類(lèi)的問(wèn)題。 更方便的框架集成,
- 可以很方便的集成其他框架,比如 MyBatis、Hibernate 等。
2. 什么是 AOP?
AOP:Aspect Oriented Programming 是面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。 簡(jiǎn)單來(lái)說(shuō)就是統(tǒng)一處理某一“切面”(類(lèi))的問(wèn)題的編程思想,比如統(tǒng)一處理日志、異常等。
3. 什么是 IOC?
IOC:Inversion of Control(中文:控制反轉(zhuǎn))是 Spring 的核心,對(duì)于 Spring 框架來(lái)說(shuō),就是由 Spring 來(lái)負(fù)責(zé)控制對(duì)象的生命周期和對(duì)象間的關(guān)系。 簡(jiǎn)單來(lái)說(shuō),控制指的是當(dāng)前對(duì)象對(duì)內(nèi)部成員的控制權(quán);控制反轉(zhuǎn)指的是,這種控制權(quán)不由當(dāng)前對(duì)象管理了,由其他(類(lèi),第三方容器)來(lái)管理。
4. 什么是 DI?
DI(Dependency Injection)叫依賴(lài)注入,是對(duì)IOC更簡(jiǎn)單的詮釋?zhuān)蕾?lài)注入的基本原則是應(yīng)用組件不應(yīng)該負(fù)責(zé)查找資源或者其他依賴(lài)的協(xié)作對(duì)象。
5. Spring 有哪些核心模塊?
- Spring Core:框架的最基礎(chǔ)部分,提供 IOC 和依賴(lài)注入特性。
- Spring Context:構(gòu)建于 Core 封裝包基礎(chǔ)上的 Context 封裝包,提供了一種框架式的對(duì)象訪問(wèn)方法。
- Spring dao:Data Access Object 提供了JDBC的抽象層。
- Spring aop:提供了面向切面的編程實(shí)現(xiàn),讓你可以自定義攔截器、切點(diǎn)等。
- Spring Web:提供了針對(duì) Web 開(kāi)發(fā)的集成特性,例如文件上傳,利用 servlet listeners 進(jìn)行 IOC 容器初始化和針對(duì) Web 的 ApplicationContext。
- Spring Web MVC:Spring 中的 MVC 封裝包提供了 Web 應(yīng)用的 Model-View-Controller(MVC)的實(shí)現(xiàn)。
- Spring ORM:對(duì)現(xiàn)有的ORM框架的支持;
6. Spring 常用的注入方式有哪些?
- setter 屬性注入
- 構(gòu)造方法注入
- 注解方式注入
7. Spring 中的 Bean 是線程安全的嗎?
spring 中的 bean 默認(rèn)是單例模式,spring 框架并沒(méi)有對(duì)單例 bean 進(jìn)行多線程的封裝處理。 實(shí)際上大部分時(shí)候 spring bean 無(wú)狀態(tài)的(比如 dao 類(lèi)),所以某種程度上來(lái)說(shuō) bean 也是安全的,但如果 bean 有狀態(tài)的話(huà)(比如 view model 對(duì)象),那就要開(kāi)發(fā)者自己去保證線程安全了,最簡(jiǎn)單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請(qǐng)求 bean 相當(dāng)于 new Bean()了,所以就可以保證線程安全了。 有狀態(tài)就是有數(shù)據(jù)存儲(chǔ)功能。 無(wú)狀態(tài)就是不會(huì)保存數(shù)據(jù)。
8. Spring中Bean的作用域有哪些?
- Singleton:Spring IOC 容器中只存在一個(gè) bean 實(shí)例,bean 以單例模式存在,是系統(tǒng)默認(rèn)值;
- Prototype:每次從容器調(diào)用 bean 時(shí)都會(huì)創(chuàng)建一個(gè)新的示例,既每次 getBean()相當(dāng)于執(zhí)行 new Bean()操作;
- Request:每次 Http 請(qǐng)求都會(huì)創(chuàng)建一個(gè) bean;
- Session:同一個(gè) Http Session 共享一個(gè) bean 實(shí)例;
- Global-Session:用于 portlet 容器,因?yàn)槊總€(gè) portlet 有單獨(dú)的 Session,GlobalSession 提供一個(gè)全局性的 Http Session。 注意: 使用 prototype 作用域需要慎重的思考,因?yàn)轭l繁創(chuàng)建和銷(xiāo)毀 bean 會(huì)帶來(lái)很大的性能開(kāi)銷(xiāo)。
9. @Qualifier 注解
當(dāng)有多個(gè)相同類(lèi)型的bean卻只有一個(gè)需要自動(dòng)裝配時(shí),將@Qualifier 注解和@Autowire 注解結(jié)合使用以消除這種混淆,指定需要裝配的確切的bean。
10. @Resource與@Autowired注解的區(qū)別?
- @Resource默認(rèn)按照名稱(chēng)方式進(jìn)行bean匹配,支持指定類(lèi)型。
- @Autowired默認(rèn)按照類(lèi)型方式進(jìn)行bean匹配,如果我們想使用按照名稱(chēng)(byName)來(lái)裝配,可以結(jié)合@Qualifier注解一起使用。
11. Spring底層兩種動(dòng)態(tài)代理實(shí)現(xiàn)原理及區(qū)別?
- 被代理對(duì)象需要實(shí)現(xiàn)JDK提供的動(dòng)態(tài)代理接口。
- 通過(guò)cglib的jar包實(shí)現(xiàn)動(dòng)態(tài)代理,該方法只需要對(duì)目標(biāo)對(duì)象繼承即可
12. Spring 事務(wù)實(shí)現(xiàn)方式有哪些?
- 聲明式事務(wù):聲明式事務(wù)也有兩種實(shí)現(xiàn)方式,基于 xml 配置文件的方式和注解方式(在類(lèi)上添加 @Transaction 注解)。
- 編碼方式:提供編碼的形式管理和維護(hù)事務(wù)。
13. Spring事務(wù)有哪些特性?
簡(jiǎn)稱(chēng)ACID:
- 原子性(Atomicity): 事務(wù)是最小的執(zhí)行單位,不允許分割。事務(wù)的原子性確保動(dòng)作要么全部完成,要么完全不起作用;
- 一致性(Consistency): 執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致;
- 隔離性(Isolation): 并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),一個(gè)用戶(hù)的事物不被其他事物所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫(kù)是獨(dú)立的;
- 持久性(Durability): 一個(gè)事務(wù)被提交之后。它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。
14. 說(shuō)一下 Spring 的事務(wù)隔離?
Spring事務(wù)有五大隔離級(jí)別:
- ISOLATION_DEFAULT:默認(rèn),用底層數(shù)據(jù)庫(kù)的設(shè)置隔離級(jí)別,數(shù)據(jù)庫(kù)設(shè)置的是什么我就用什么;
- ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級(jí)別、事務(wù)未提交前,就可被其他事務(wù)讀?。〞?huì)出現(xiàn)幻讀、臟讀、不可重復(fù)讀);
- ISOLATIONREADCOMMITTED:提交讀,一個(gè)事務(wù)提交后才能被其他事務(wù)讀取到(會(huì)造成幻讀、不可重復(fù)讀),SQL server 的默認(rèn)級(jí)別;
- ISOLATIONREPEATABLEREAD:可重復(fù)讀,保證多次讀取同一個(gè)數(shù)據(jù)時(shí),其值都和事務(wù)開(kāi)始時(shí)候的內(nèi)容是一致,禁止讀取到別的事務(wù)未提交的數(shù)據(jù)(會(huì)造成幻讀),MySQL 的默認(rèn)級(jí)別;
- ISOLATION_SERIALIZABLE:序列化,代價(jià)最高最可靠的隔離級(jí)別,該隔離級(jí)別能防止臟讀、不可重復(fù)讀、幻讀。
15. Spring與贓讀、幻讀、不可重復(fù)讀?
- 臟讀 :表示一個(gè)事務(wù)能夠讀取另一個(gè)事務(wù)中還未提交的數(shù)據(jù)。比如,某個(gè)事務(wù)嘗試插入記錄 A,此時(shí)該事務(wù)還未提交,然后另一個(gè)事務(wù)嘗試讀取到了記錄 A。
- 不可重復(fù)讀 :是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。
- 幻讀 :指同一個(gè)事務(wù)內(nèi)多次查詢(xún)返回的結(jié)果集不一樣。比如同一個(gè)事務(wù) A 第一次查詢(xún)時(shí)候有 n 條記錄,但是第二次同等條件下查詢(xún)卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺(jué)。發(fā)生幻讀的原因也是另外一個(gè)事務(wù)新增或者刪除或者修改了第一個(gè)事務(wù)結(jié)果集里面的數(shù)據(jù),同一個(gè)記錄的數(shù)據(jù)內(nèi)容被修改了,所有數(shù)據(jù)行的記錄就變多或者變少了。
16. Spring事務(wù)的傳播行為有哪些?
Spring事務(wù)有七大傳播行為:
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
使用Spring Cache和Redis實(shí)現(xiàn)查詢(xún)數(shù)據(jù)緩存
在現(xiàn)代應(yīng)用程序中,查詢(xún)緩存的使用已經(jīng)變得越來(lái)越普遍,它不僅能夠顯著提高系統(tǒng)的性能,還能提升用戶(hù)體驗(yàn),在這篇文章中,我們將探討緩存的基本概念、重要性以及如何使用Spring Cache和Redis實(shí)現(xiàn)查詢(xún)數(shù)據(jù)緩存,需要的朋友可以參考下2024-07-07idea pom導(dǎo)入net.sf.json的jar包失敗的解決方案
JSON(JavaScript Object Notation,JS對(duì)象簡(jiǎn)譜)是一種輕量級(jí)的數(shù)據(jù)交換格式,這篇文章主要介紹了idea pom導(dǎo)入net.sf.json的jar包失敗的解決方案,感興趣的朋友一起看看吧2023-11-11Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開(kāi)發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷(xiāo)售報(bào)表等等,需要的朋友可以參考下2023-08-08Java+Eclipse+Selenium環(huán)境搭建的方法步驟
這篇文章主要介紹了Java+Eclipse+Selenium環(huán)境搭建的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06JSON中fastjson、jackson、gson如何選擇
在Java中,JSON的解析方式很多,例如fastjson(阿里)、Gson(谷歌)、jackjson等,本文主要介紹了JSON中fastjson、jackson、gson如何選擇,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12詳解使用Spring的BeanPostProcessor優(yōu)雅的實(shí)現(xiàn)工廠模式
這篇文章主要介紹了詳解使用Spring的BeanPostProcessor優(yōu)雅的實(shí)現(xiàn)工廠模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringCloud微服務(wù)集成Dubbo的詳細(xì)過(guò)程
Apache?Dubbo?是一款易用、高性能的?WEB?和?RPC?框架,同時(shí)為構(gòu)建企業(yè)級(jí)微服務(wù)提供服務(wù)發(fā)現(xiàn)、流量治理、可觀測(cè)、認(rèn)證鑒權(quán)等能力、工具與最佳實(shí)踐,這篇文章主要介紹了SpringCloud微服務(wù)集成Dubbo,需要的朋友可以參考下2024-03-03