<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          《面試八股文》之 Spring 18卷

          共 6727字,需瀏覽 14分鐘

           ·

          2021-11-05 14:45

          微信公眾號(hào):「moon聊技術(shù)」
          關(guān)注選擇“ 「星標(biāo)」 ”, 重磅干貨,第一 時(shí)間送達(dá)!
          [如果你覺(jué)得文章對(duì)你有幫助,歡迎「關(guān)注,在看,點(diǎn)贊,轉(zhuǎn)發(fā)」]

          大家好,我是 moon,點(diǎn)個(gè)關(guān)注獲取更多八股文~。

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



          • 1.spring 中都用到了哪些設(shè)計(jì)模式?

          • 2.spring 中有哪些核心模塊?

          • 3.說(shuō)一下你理解的 IOC 是什么?

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

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

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

          • 7.那么 DI 又是什么?

          • 8.說(shuō)說(shuō) AOP 是什么?

          • 9.動(dòng)態(tài)代理和靜態(tài)代理有什么區(qū)別?

          • 10.JDK 動(dòng)態(tài)代理和 CGLIB 代理有什么區(qū)別?

          • 11.Spring AOP 和 AspectJ AOP 有什么區(qū)別?

          • 12.spring 中 Bean 的生命周期是怎樣的?

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

          • 14.為什么要使用三級(jí)緩存,二級(jí)緩存不能解決嗎?

          • 15.@Autowired 和 @Resource 有什么區(qū)別?

          • 16.spring 事務(wù)隔離級(jí)別有哪些?

          • 17.spring 事務(wù)的傳播機(jī)制有哪些?

          • 18.springBoot 自動(dòng)裝配原理?



          1.spring 中都用到了哪些設(shè)計(jì)模式?

          • 「1.工廠設(shè)計(jì)模式」: 比如通過(guò) BeanFactory 和 ApplicationContext 來(lái)生產(chǎn) Bean 對(duì)象
          • 「2.代理設(shè)計(jì)模式」: ?AOP 的實(shí)現(xiàn)方式就是通過(guò)代理來(lái)實(shí)現(xiàn),Spring主要是使用 JDK 動(dòng)態(tài)代理和 CGLIB 代理
          • 「3.單例設(shè)計(jì)模式」: Spring 中的 Bean 默認(rèn)都是單例的
          • 「4.模板方法模式」: Spring 中 jdbcTemplate 等以 Template 結(jié)尾的對(duì)數(shù)據(jù)庫(kù)操作的類,都會(huì)使用到模板方法設(shè)計(jì)模式,一些通用的功能
          • 「5.包裝器設(shè)計(jì)模式」: 我們的項(xiàng)目需要連接多個(gè)數(shù)據(jù)庫(kù),而且不同的客戶在每次訪問(wèn)中根據(jù)需要會(huì)去訪問(wèn)不同的數(shù)據(jù)庫(kù)。這種模式讓我們可以根據(jù)客戶的需求能夠動(dòng)態(tài)切換不同的數(shù)據(jù)源
          • 「6.觀察者模式」: Spring 事件驅(qū)動(dòng)模型觀察者模式的
          • 「7.適配器模式」:Spring AOP 的增強(qiáng)或通知(Advice)使用到了適配器模式

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

          • 1.「Spring Core」:Spring核心,它是框架最基礎(chǔ)的部分,提供IOC和依賴注入DI特性
          • 2.「Spring Context」:Spring上下文容器,它是 BeanFactory 功能加強(qiáng)的一個(gè)子接口
          • 3.「Spring Web」:它提供Web應(yīng)用開(kāi)發(fā)的支持
          • 4.「Spring MVC」:它針對(duì)Web應(yīng)用中MVC思想的實(shí)現(xiàn)
          • 5.「Spring DAO」:提供對(duì)JDBC抽象層,簡(jiǎn)化了JDBC編碼,同時(shí),編碼更具有健壯性
          • 6.「Spring ORM」:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等
          • 7.「Spring AOP」:即面向切面編程,它提供了與AOP聯(lián)盟兼容的編程實(shí)現(xiàn)

          3.說(shuō)一下你理解的 IOC 是什么?

          首先 IOC 是一個(gè)「容器」,是用來(lái)裝載對(duì)象的,它的核心思想就是「控制反轉(zhuǎn)」

          那么究竟「什么是控制反轉(zhuǎn)」?

          控制反轉(zhuǎn)就是說(shuō),「把對(duì)象的控制權(quán)交給了 spring,由 spring 容器進(jìn)行管理」,我們不進(jìn)行任何操作

          那么為「什么需要控制反轉(zhuǎn)」?

          我們想象一下,沒(méi)有控制反轉(zhuǎn)的時(shí)候,我們需要「自己去創(chuàng)建對(duì)象,配置對(duì)象」,還要「人工去處理對(duì)象與對(duì)象之間的各種復(fù)雜的依賴關(guān)系」,當(dāng)一個(gè)工程的量起來(lái)之后,這種關(guān)系的維護(hù)是非常令人頭痛的,所以就有了控制反轉(zhuǎn)這個(gè)概念,將對(duì)象的創(chuàng)建、配置等一系列操作交給 spring 去管理,我們?cè)谑褂玫臅r(shí)候只要去取就好了

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

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

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

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

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

          「BeanFactory 是 IOC 容器」,是用來(lái)承載對(duì)象的

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

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

          這四個(gè)注解的「本質(zhì)都是一樣的,都是將被該注解標(biāo)識(shí)的對(duì)象放入 spring 容器當(dāng)中,只是為了在使用上區(qū)分不同的應(yīng)用分層」

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

          7.那么 DI 又是什么?

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

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

          spring 中有三種注入方式

          • 接口注入
          • 構(gòu)造器注入
          • set注入

          8.說(shuō)說(shuō) AOP 是什么?

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

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

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

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

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

          「有 5 種通知類型:」

          • 「@Before」:在目標(biāo)方法調(diào)用前去通知
          • 「@AfterReturning」:在目標(biāo)方法返回或異常后調(diào)用
          • 「@AfterThrowing」:在目標(biāo)方法返回后調(diào)用
          • 「@After」:在目標(biāo)方法異常后調(diào)用
          • 「@Around」:將目標(biāo)方法封裝起來(lái),自己確定調(diào)用時(shí)機(jī)

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

          「靜態(tài)代理」

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

          「動(dòng)態(tài)代理」

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

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

          JDK 動(dòng)態(tài)代理時(shí)業(yè)務(wù)類「必須要實(shí)現(xiàn)某個(gè)接口」,它是「基于反射的機(jī)制實(shí)現(xiàn)的」,生成一個(gè)實(shí)現(xiàn)同樣接口的一個(gè)代理類,然后通過(guò)重寫(xiě)方法的方式,實(shí)現(xiàn)對(duì)代碼的增強(qiáng)。

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

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

          Spring AOP 是運(yùn)行時(shí)增強(qiáng),是通過(guò)「動(dòng)態(tài)代理實(shí)現(xiàn)」

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

          • 「編譯時(shí)織入」:就是在編譯字節(jié)碼的時(shí)候織入相關(guān)代理類
          • 「編譯后織入」:編譯完初始類后發(fā)現(xiàn)需要 AOP 增強(qiáng),然后織入相關(guān)代碼
          • 「類加載時(shí)織入」:指在加載器加載類的時(shí)候織入
          主要區(qū)別Spring AOPAspecjtJ AOP
          增強(qiáng)方式運(yùn)行時(shí)增強(qiáng)編譯時(shí)增強(qiáng)
          實(shí)現(xiàn)方式動(dòng)態(tài)代理修改代碼
          編譯器javac特殊的編譯器 ajc
          效率較低(運(yùn)行時(shí)反射損耗性能)較高
          織入方式運(yùn)行時(shí)編譯時(shí)、編譯后、類加載時(shí)

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

          SpringBean 生命周期大致分為4個(gè)階段:

          • 1.「實(shí)例化」,實(shí)例化該 Bean 對(duì)象
          • 2.「填充屬性」,給該 Bean 賦值
          • 3.「初始化」
            • 如果實(shí)現(xiàn)了 Aware 接口,會(huì)通過(guò)其接口獲取容器資源
            • 如果實(shí)現(xiàn)了 BeanPostProcessor 接口,則會(huì)回調(diào)該接口的前置和后置處理增強(qiáng)
            • 如果配置了 init-method 方法,]會(huì)執(zhí)行該方法
          • 4.「銷毀」
            • 如果實(shí)現(xiàn)了 DisposableBean 接口,則會(huì)回調(diào)該接口的 destroy 方法
            • 如果配置了 destroy-method 方法,則會(huì)執(zhí)行 destroy-method 配置的方法

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

          循環(huán)依賴就是說(shuō)兩個(gè)對(duì)象相互依賴,形成了一個(gè)環(huán)形的調(diào)用鏈路

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

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

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

          • 1.A 完成實(shí)例化后,去「創(chuàng)建一個(gè)對(duì)象工廠,并放入三級(jí)緩存」當(dāng)中
            • 如果 A 被 AOP 代理,那么通過(guò)這個(gè)工廠獲取到的就是 A 代理后的對(duì)象
            • 如果 A 沒(méi)有被 AOP 代理,那么這個(gè)工廠獲取到的就是 A 實(shí)例化的對(duì)象
          • 2.A 進(jìn)行屬性注入時(shí),去「創(chuàng)建 B」
          • 3.B 進(jìn)行屬性注入,需要 A ,則「從三級(jí)緩存中去取 A 工廠代理對(duì)象」并注入,然后刪除三級(jí)緩存中的 A 工廠,將 A 對(duì)象放入二級(jí)緩存
          • 4.B 完成后續(xù)屬性注入,直到初始化結(jié)束,將 B 放入一級(jí)緩存
          • 5.「A 從一級(jí)緩存中取到 B 并且注入 B」, 直到完成后續(xù)操作,將 A 從二級(jí)緩存刪除并且放入一級(jí)緩存,循環(huán)依賴結(jié)束

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

          • 1.「不全是構(gòu)造器方式」的循環(huán)依賴(否則無(wú)法分離初始化和實(shí)例化的操作)
          • 2.「必須是單例」(否則無(wú)法保證是同一對(duì)象)

          14.為什么要使用三級(jí)緩存,二級(jí)緩存不能解決嗎?

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

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

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

          • 「@Resource 是 Java 自己的注解」,@Resource 有兩個(gè)屬性是比較重要的,分是 name 和 type;Spring 將 @Resource 注解的 name 屬性解析為 bean 的名字,而 type 屬性則解析為 bean 的類型。所以如果使用 name 屬性,則使用 byName 的自動(dòng)注入策略,而使用 type 屬性時(shí)則使用 byType 自動(dòng)注入策略。如果既不指定 name 也不指定 type 屬性,這時(shí)將通過(guò)反射機(jī)制使用 byName 自動(dòng)注入策略。

          • 「@Autowired 是spring 的注解」,是 spring2.5 版本引入的,Autowired 只根據(jù) type 進(jìn)行注入,「不會(huì)去匹配 name」。如果涉及到 type 無(wú)法辨別注入對(duì)象時(shí),那需要依賴 @Qualifier 或 @Primary 注解一起來(lái)修飾。

          16.spring 事務(wù)隔離級(jí)別有哪些?

          • DEFAULT:采用 DB 默認(rèn)的事務(wù)隔離級(jí)別
          • READ_UNCOMMITTED:讀未提交
          • READ_COMMITTED:讀已提交
          • REPEATABLE_READ:可重復(fù)讀
          • SERIALIZABLE:串行化

          17.spring 事務(wù)的傳播機(jī)制有哪些?

          • 1.「propagation_required」
            • 當(dāng)前方法「必須在一個(gè)具有事務(wù)的上下文中運(yùn)行」,如有客戶端有事務(wù)在進(jìn)行,那么被調(diào)用端將在該事務(wù)中運(yùn)行,否則的話重新開(kāi)啟一個(gè)事務(wù)。(如果被調(diào)用端發(fā)生異常,那么調(diào)用端和被調(diào)用端事務(wù)都將回滾)
          • 2.「propagation_supports」
            • 當(dāng)前方法不必需要具有一個(gè)事務(wù)上下文,但是如果有一個(gè)事務(wù)的話,它也可以在這個(gè)事務(wù)中運(yùn)行
          • 3.「propagation_mandatory」
            • 表示當(dāng)前方法「必須在一個(gè)事務(wù)中運(yùn)行」,如果沒(méi)有事務(wù),將拋出異常
          • 4.「propagation_nested」
            • 如果當(dāng)前方法正有一個(gè)事務(wù)在運(yùn)行中,則該方法應(yīng)該「運(yùn)行在一個(gè)嵌套事務(wù)」中,被嵌套的事務(wù)可以獨(dú)立于被封裝的事務(wù)中進(jìn)行提交或者回滾。如果封裝事務(wù)存在,并且外層事務(wù)拋出異常回滾,那么內(nèi)層事務(wù)必須回滾,反之,內(nèi)層事務(wù)并不影響外層事務(wù)。如果封裝事務(wù)不存在,則同propagation_required的一樣
          • 5.「propagation_never」
            • 當(dāng)方法務(wù)不應(yīng)該在一個(gè)事務(wù)中運(yùn)行,如果「存在一個(gè)事務(wù),則拋出異常」
          • 6.「propagation_requires_new」
            • 當(dāng)前方法「必須運(yùn)行在它自己的事務(wù)中」。一個(gè)新的事務(wù)將啟動(dòng),而且如果有一個(gè)現(xiàn)有的事務(wù)在運(yùn)行的話,則這個(gè)方法將在運(yùn)行期被掛起,直到新的事務(wù)提交或者回滾才恢復(fù)執(zhí)行。
          • 7.「propagation_not_supported」
            • 方法不應(yīng)該在一個(gè)事務(wù)中運(yùn)行。「如果有一個(gè)事務(wù)正在運(yùn)行,他將在運(yùn)行期被掛起,直到這個(gè)事務(wù)提交或者回滾才恢復(fù)執(zhí)行」

          18.springBoot 自動(dòng)裝配原理?

          • 1.容器在啟動(dòng)的時(shí)候會(huì)調(diào)用 EnableAutoConfigurationImportSelector.class 的 selectImports方法「獲取一個(gè)全面的常用 BeanConfiguration 列表」

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

          • 3.之后繼續(xù)「調(diào)用 filter 來(lái)一一篩選」,過(guò)濾掉一些我們不需要不符合條件的 Bean

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


          往期推薦



          《面試八股文》之 MySql 35卷

          《面試八股文》之 Java 基礎(chǔ) 34 卷

          《面試八股文》之 JVM 20卷

          《面試八股文》之網(wǎng)絡(luò)19卷

          《面試八股文》之 Redis 16卷

          《面試八股文》之 Kafka 21卷

          《面試八股文》之Zookeeper12卷

          《面試八股文》之Dubbo17卷



          我是moon,覺(jué)得文章有趣好看,歡迎『點(diǎn)贊』、『在看』、『轉(zhuǎn)發(fā)』三連支持一下,下次見(jiàn)~

          瀏覽 70
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  多人操逼| www.色综合 | 午夜理论免费毛片 | 日韩无码一卡二卡 | 操逼逼网 |