成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試八股文之Spring

開發(fā) 前端
這次整理了一下關于 spring 的面試題,網(wǎng)上也翻了翻關于 spring 的面試題,匯總了一下,基本都在這里了,當然可能有些過于基本的概念我是直接整理到某一問當中了,就沒有單獨再開設一問,祝大家面試順利~

[[433317]]

「《面試八股文》之 Spring 18卷」 又新鮮出爐了,這次整理了一下關于 spring 的面試題,網(wǎng)上也翻了翻關于 spring 的面試題,匯總了一下,基本都在這里了,當然可能有些過于基本的概念我是直接整理到某一問當中了,就沒有單獨再開設一問,祝大家面試順利~

一.spring 中都用到了哪些設計模式?

「1.工廠設計模式」: 比如通過 BeanFactory 和 ApplicationContext 來生產(chǎn) Bean 對象

「2.代理設計模式」: AOP 的實現(xiàn)方式就是通過代理來實現(xiàn),Spring主要是使用 JDK 動態(tài)代理和 CGLIB 代理

「3.單例設計模式」: Spring 中的 Bean 默認都是單例的

「4.模板方法模式」: Spring 中 jdbcTemplate 等以 Template 結尾的對數(shù)據(jù)庫操作的類,都會使用到模板方法設計模式,一些通用的功能

「5.包裝器設計模式」: 我們的項目需要連接多個數(shù)據(jù)庫,而且不同的客戶在每次訪問中根據(jù)需要會去訪問不同的數(shù)據(jù)庫。這種模式讓我們可以根據(jù)客戶的需求能夠動態(tài)切換不同的數(shù)據(jù)源

「6.觀察者模式」: Spring 事件驅動模型觀察者模式的

「7.適配器模式」:Spring AOP 的增強或通知(Advice)使用到了適配器模式

二.spring 中有哪些核心模塊?

1.「Spring Core」:Spring核心,它是框架最基礎的部分,提供IOC和依賴注入DI特性

2.「Spring Context」:Spring上下文容器,它是 BeanFactory 功能加強的一個子接口

3.「Spring Web」:它提供Web應用開發(fā)的支持

4.「Spring MVC」:它針對Web應用中MVC思想的實現(xiàn)

5.「Spring DAO」:提供對JDBC抽象層,簡化了JDBC編碼,同時,編碼更具有健壯性

6.「Spring ORM」:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等

7.「Spring AOP」:即面向切面編程,它提供了與AOP聯(lián)盟兼容的編程實現(xiàn)

三.說一下你理解的 IOC 是什么?

首先 IOC 是一個「容器」,是用來裝載對象的,它的核心思想就是「控制反轉」

那么究竟「什么是控制反轉」?

控制反轉就是說,「把對象的控制權交給了 spring,由 spring 容器進行管理」,我們不進行任何操作

那么為「什么需要控制反轉」?

我們想象一下,沒有控制反轉的時候,我們需要「自己去創(chuàng)建對象,配置對象」,還要「人工去處理對象與對象之間的各種復雜的依賴關系」,當一個工程的量起來之后,這種關系的維護是非常令人頭痛的,所以就有了控制反轉這個概念,將對象的創(chuàng)建、配置等一系列操作交給 spring 去管理,我們在使用的時候只要去取就好了

四.spring 中的 IOC 容器有哪些?有什么區(qū)別?

spring 主要提供了「兩種 IOC 容器」,一種是 「BeanFactory」,還有一種是 「ApplicationContext」

它們的區(qū)別就在于,BeanFactory 「只提供了最基本的實例化對象和拿對象的功能」,而 ApplicationContext 是繼承了 BeanFactory 所派生出來的產(chǎn)物,是其子類,它的作用更加的強大,比如支持注解注入、國際化等功能

五.那 BeanFactory 和 FactoryBean 又有什么區(qū)別?

這兩個是「不同的產(chǎn)物」

「BeanFactory 是 IOC 容器」,是用來承載對象的

「FactoryBean 是一個接口」,為 Bean 提供了更加靈活的方式,通過代理一個Bean對象,對方法前后做一些操作。

六.@Repository、@Service、@Compent、@Controller它們有什么區(qū)別?

這四個注解的「本質都是一樣的,都是將被該注解標識的對象放入 spring 容器當中,只是為了在使用上區(qū)分不同的應用分層」

  • @Repository:dao層
  • @Service:service層
  • @Controller:controller層
  • @Compent:其他不屬于以上三層的統(tǒng)一使用該注解

七.那么 DI 又是什么?

DI 就是依賴注入,其實和 IOC 大致相同,只不過是「同一個概念使用了不同的角度去闡述」

DI 所描述的「重點是在于依賴」,我們說了 「IOC 的核心功能就是在于在程序運行時動態(tài)的向某個對象提供其他的依賴對象」,而這個功能就是依靠 DI 去完成的,比如我們需要注入一個對象 A,而這個對象 A 依賴一個對象 B,那么我們就需要把這個對象 B 注入到對象 A 中,這就是依賴注入

spring 中有三種注入方式

  • 接口注入
  • 構造器注入
  • set注入

八.說說 AOP 是什么?

AOP 意為:「面向切面編程,通過預編譯方式和運行期間動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術」。

AOP 是 「OOP(面向對象編程) 的延續(xù)」,是 Spring 框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用 AOP 可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

「AOP 實現(xiàn)主要分為兩類:」

  • 「靜態(tài) AOP 實現(xiàn)」, AOP 框架「在編譯階段」對程序源代碼進行修改,生成了靜態(tài)的 AOP 代理類(生成的 *.class 文件已經(jīng)被改掉了,需要使用特定的編譯器),比如 AspectJ
  • 「動態(tài) AOP 實現(xiàn)」, AOP 框架「在運行階段」對動態(tài)生成代理對象(在內(nèi)存中以 JDK 動態(tài)代理,或 CGlib 動態(tài)地生成 AOP 代理類),如 SpringAOP

spring 中 AOP 的實現(xiàn)是「通過動態(tài)代理實現(xiàn)的」,如果是實現(xiàn)了接口就會使用 JDK 動態(tài)代理,否則就使用 CGLIB 代理。

「有 5 種通知類型:」

  • 「@Before」:在目標方法調用前去通知
  • 「@AfterReturning」:在目標方法返回或異常后調用
  • 「@AfterThrowing」:在目標方法返回后調用
  • 「@After」:在目標方法異常后調用
  • 「@Around」:將目標方法封裝起來,自己確定調用時機

九.動態(tài)代理和靜態(tài)代理有什么區(qū)別?

「靜態(tài)代理」

  • 由程序員創(chuàng)建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經(jīng)存在了
  • 靜態(tài)代理通常只代理一個類
  • 靜態(tài)代理事先知道要代理的是什么

「動態(tài)代理」

  • 在程序運行時,運用反射機制動態(tài)創(chuàng)建而成
  • 動態(tài)代理是代理一個接口下的多個實現(xiàn)類
  • 動態(tài)代理不知道要代理什么東西,只有在運行時才知道

十.JDK 動態(tài)代理和 CGLIB 代理有什么區(qū)別?

JDK 動態(tài)代理時業(yè)務類「必須要實現(xiàn)某個接口」,它是「基于反射的機制實現(xiàn)的」,生成一個實現(xiàn)同樣接口的一個代理類,然后通過重寫方法的方式,實現(xiàn)對代碼的增強。

CGLIB 動態(tài)代理是使用字節(jié)碼處理框架 ASM,其原理是通過字節(jié)碼技術為一個類「創(chuàng)建子類,然后重寫父類的方法」,實現(xiàn)對代碼的增強。

十一.Spring AOP 和 AspectJ AOP 有什么區(qū)別?

Spring AOP 是運行時增強,是通過「動態(tài)代理實現(xiàn)」的

AspectJ AOP 是編譯時增強,需要特殊的編譯器才可以完成,是通過「修改代碼來實現(xiàn)」的,支持「三種織入方式」

  • 「編譯時織入」:就是在編譯字節(jié)碼的時候織入相關代理類
  • 「編譯后織入」:編譯完初始類后發(fā)現(xiàn)需要 AOP 增強,然后織入相關代碼
  • 「類加載時織入」:指在加載器加載類的時候織入

 

十二.spring 中 Bean 的生命周期是怎樣的?

SpringBean 生命周期大致分為4個階段:

1.「實例化」,實例化該 Bean 對象

2.「填充屬性」,給該 Bean 賦值

3.「初始化」

  • 如果實現(xiàn)了 Aware 接口,會通過其接口獲取容器資源
  • 如果實現(xiàn)了 BeanPostProcessor 接口,則會回調該接口的前置和后置處理增強
  • 如果配置了 init-method 方法,]會執(zhí)行該方法

4.「銷毀」

如果實現(xiàn)了 DisposableBean 接口,則會回調該接口的 destroy 方法

如果配置了 destroy-method 方法,則會執(zhí)行 destroy-method 配置的方法

十三.spring 是怎么解決循環(huán)依賴的?

循環(huán)依賴就是說兩個對象相互依賴,形成了一個環(huán)形的調用鏈路

spring 使用三級緩存去解決循環(huán)依賴的,其「核心邏輯就是把實例化和初始化的步驟分開,然后放入緩存中」,供另一個對象調用

  • 「第一級緩存」:用來保存實例化、初始化都完成的對象
  • 「第二級緩存」:用來保存實例化完成,但是未初始化完成的對象
  • 「第三級緩存」:用來保存一個對象工廠,提供一個匿名內(nèi)部類,用于創(chuàng)建二級緩存中的對象

當 A、B 兩個類發(fā)生循環(huán)引用時 大致流程

1.A 完成實例化后,去「創(chuàng)建一個對象工廠,并放入三級緩存」當中

如果 A 被 AOP 代理,那么通過這個工廠獲取到的就是 A 代理后的對象

如果 A 沒有被 AOP 代理,那么這個工廠獲取到的就是 A 實例化的對象

2.A 進行屬性注入時,去「創(chuàng)建 B」

3.B 進行屬性注入,需要 A ,則「從三級緩存中去取 A 工廠代理對象」并注入,然后刪除三級緩存中的 A 工廠,將 A 對象放入二級緩存

4.B 完成后續(xù)屬性注入,直到初始化結束,將 B 放入一級緩存

5.「A 從一級緩存中取到 B 并且注入 B」, 直到完成后續(xù)操作,將 A 從二級緩存刪除并且放入一級緩存,循環(huán)依賴結束

spring 解決循環(huán)依賴有兩個前提條件:

1.「不全是構造器方式」的循環(huán)依賴(否則無法分離初始化和實例化的操作)

2.「必須是單例」(否則無法保證是同一對象)

十四.為什么要使用三級緩存,二級緩存不能解決嗎?

可以,三級緩存的功能是只有真正發(fā)生循環(huán)依賴的時候,才去提前生成代理對象,否則只會「創(chuàng)建一個工廠并將其放入到三級緩存」中,但是不會去通過這個工廠去真正創(chuàng)建對象。

如果使用二級緩存解決循環(huán)依賴,意味著所有 Bean 在實例化后就要完成 AOP 代理,這樣「違背了 Spring 設計的原則」,Spring 在設計之初就是在 Bean 生命周期的最后一步來完成 AOP 代理,而不是在實例化后就立馬進行 AOP 代理。

十五.@Autowired 和 @Resource 有什么區(qū)別?

  • 「@Resource 是 Java 自己的注解」,@Resource 有兩個屬性是比較重要的,分是 name 和 type;Spring 將 @Resource 注解的 name 屬性解析為 bean 的名字,而 type 屬性則解析為 bean 的類型。所以如果使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。如果既不指定 name 也不指定 type 屬性,這時將通過反射機制使用 byName 自動注入策略。
  • 「@Autowired 是spring 的注解」,是 spring2.5 版本引入的,Autowired 只根據(jù) type 進行注入,「不會去匹配 name」。如果涉及到 type 無法辨別注入對象時,那需要依賴 @Qualifier 或 @Primary 注解一起來修飾。

十六.spring 事務隔離級別有哪些?

  • DEFAULT:采用 DB 默認的事務隔離級別
  • READ_UNCOMMITTED:讀未提交
  • READ_COMMITTED:讀已提交
  • REPEATABLE_READ:可重復讀
  • SERIALIZABLE:串行化

十七.spring 事務的傳播機制有哪些?

1.「propagation_required」

  • 當前方法「必須在一個具有事務的上下文中運行」,如有客戶端有事務在進行,那么被調用端將在該事務中運行,否則的話重新開啟一個事務。(如果被調用端發(fā)生異常,那么調用端和被調用端事務都將回滾)

2.「propagation_supports」

  • 當前方法不必需要具有一個事務上下文,但是如果有一個事務的話,它也可以在這個事務中運行

3.「propagation_mandatory」

  • 表示當前方法「必須在一個事務中運行」,如果沒有事務,將拋出異常

4.「propagation_nested」

  • 如果當前方法正有一個事務在運行中,則該方法應該「運行在一個嵌套事務」中,被嵌套的事務可以獨立于被封裝的事務中進行提交或者回滾。如果封裝事務存在,并且外層事務拋出異常回滾,那么內(nèi)層事務必須回滾,反之,內(nèi)層事務并不影響外層事務。如果封裝事務不存在,則同propagation_required的一樣

5.「propagation_never」

  • 當方法務不應該在一個事務中運行,如果「存在一個事務,則拋出異常」

6.「propagation_requires_new」

  • 當前方法「必須運行在它自己的事務中」。一個新的事務將啟動,而且如果有一個現(xiàn)有的事務在運行的話,則這個方法將在運行期被掛起,直到新的事務提交或者回滾才恢復執(zhí)行。

7.「propagation_not_supported」

  • 方法不應該在一個事務中運行。「如果有一個事務正在運行,他將在運行期被掛起,直到這個事務提交或者回滾才恢復執(zhí)行」

十八.springBoot 自動裝配原理?

1.容器在啟動的時候會調用 EnableAutoConfigurationImportSelector.class 的 selectImports方法「獲取一個全面的常用 BeanConfiguration 列表」

2.之后會讀取 spring-boot-autoconfigure.jar 下面的spring.factories,「獲取到所有的 Spring 相關的 Bean 的全限定名 ClassName」

3.之后繼續(xù)「調用 filter 來一一篩選」,過濾掉一些我們不需要不符合條件的 Bean

4.最后把符合條件的 BeanConfiguration 注入默認的 EnableConfigurationPropertie 類里面的屬性值,并且「注入到 IOC 環(huán)境當中」

 

責任編輯:姜華 來源: moon聊技術
相關推薦

2021-10-26 14:40:03

MySQL SQL 語句數(shù)據(jù)庫

2021-10-21 14:43:23

Java 語言 Java 基礎

2021-07-26 14:59:23

面試Redis內(nèi)存數(shù)據(jù)庫

2021-09-07 14:46:42

面試網(wǎng)絡HTTP 協(xié)議

2024-02-23 19:17:12

構造函數(shù)C++開發(fā)

2023-11-28 18:09:49

Java多態(tài)

2021-10-26 17:05:55

Redis字符串復雜度

2022-09-03 11:36:11

Python文件網(wǎng)絡

2021-08-01 22:59:43

Object八股文quals

2021-05-06 07:27:57

面試任務調度器

2021-04-14 10:02:59

網(wǎng)絡八股文協(xié)議

2023-11-29 17:28:07

2021-05-20 11:43:57

操作系統(tǒng)硬件軟件

2021-08-12 09:28:24

Java多線程變量

2024-10-12 09:26:32

線程池系統(tǒng)核心線程

2023-01-13 18:04:03

面試題消息中間件

2024-06-05 10:59:51

2023-12-12 13:38:00

Java異步編程

2022-05-27 14:43:45

JVM字節(jié)碼指令

2022-05-19 08:41:09

JVM虛擬機架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品成人在线 | 欧美日韩一区精品 | 欧美videosex性极品hd | 久久久精 | 国产在线一区二区三区 | 精品国产一区二区三区免费 | www.99精品| 久操福利 | 久草在线 | 99精品欧美一区二区蜜桃免费 | 亚洲视频在线观看 | 国产高清一区二区三区 | 午夜视频精品 | 91人人视频在线观看 | 国产一区二区在线播放 | 国产精品九九九 | 国产综合视频 | 欧美日韩在线免费观看 | 久久黄网 | 欧美性一区二区三区 | 欧美极品少妇xxxxⅹ免费视频 | 国产精品久久久免费 | 久久久综合网 | 九九综合| 欧美激情在线精品一区二区三区 | 国产精品婷婷 | 日韩成人| 亚洲欧美精品在线观看 | 欧美一级在线免费 | 亚洲综合色网站 | 日本aa毛片a级毛片免费观看 | av网站在线播放 | 91免费视频 | 国产一级片网站 | 天天看天天操 | 91私密视频 | 99pao成人国产永久免费视频 | 日韩精品成人一区二区三区视频 | 在线播放一区二区三区 | 男女羞羞视频免费 | 精品久久久久久久久久久久久久久久久 |