黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

面試題首頁 > Spring面試題

Spring高級面試題

001什么是循環(huán)依賴?

類與類之間的依賴關(guān)系形成了閉環(huán),就會導(dǎo)致循環(huán)依賴問題的產(chǎn)生。
比如下圖中A類依賴了B類,B類依賴了C類,而最后C類又依賴了A類,這樣就形成了循環(huán)依賴問題。

002循環(huán)依賴類型?

1.通過構(gòu)造方法進(jìn)行依賴注入時(shí)產(chǎn)生的循環(huán)依賴問題。
該情況會報(bào)異常,在new對象的時(shí)候就會堵塞住了,其實(shí)也就是”先有雞還是先有蛋“的歷史難題。
2.通過setter方法進(jìn)行依賴注入且是在多例模式下產(chǎn)生的循環(huán)依賴問題。
該情況會報(bào)異常,每一次getBean()時(shí),都會產(chǎn)生一個(gè)新的Bean,如此反復(fù)下去就會有無窮無盡的Bean產(chǎn)生了,最終就會導(dǎo)致OOM問題的出現(xiàn)。
3.通過setter方法進(jìn)行依賴注入且是在單例模式下產(chǎn)生的循環(huán)依賴問題。
因此在Spring中,前兩種都會報(bào)異常,只有第(3)種方式的循環(huán)依賴問題能被解決。

003如何解決循環(huán)依賴?

Spring在單例模式下的setter方法依賴注入引起的循環(huán)依賴問題,主要是通過二級緩存和三級緩存來解決的,其中三級緩存是主要功臣。解決的核心原理就是:在對象實(shí)例化之后,依賴注入之前,Spring提前暴露的Bean實(shí)例的引用在第三級緩存中進(jìn)行存儲。
Spring中有三個(gè)緩存,用于存儲單例的Bean實(shí)例,這三個(gè)緩存是彼此互斥的,不會針對同一個(gè)Bean的實(shí)例同時(shí)存儲。如果調(diào)用getBean,則需要從三個(gè)緩存中依次獲取指定的Bean實(shí)例。 讀取順序依次是一級緩存 ==> 二級緩存 ==> 三級緩存。

004Spring的啟動(dòng)過程?

Spring啟動(dòng)過程是IOC容器的啟動(dòng)過程,本質(zhì)是創(chuàng)建和初始化bean工廠(BeanFactory).BeanFactory是Spring IOC的核心,Spring使用beanFactory來實(shí)例化,配置和管理bean。對于web程序,IOC容器啟動(dòng)過程即是建立上下文的過程,web容器會提供一個(gè)全局的servletContext上下文環(huán)境。其啟動(dòng)過程主要包含三個(gè)類,ContextLoaderListener,ContextLoader和XmlWebApplicationContext。
在web.xml中提供ContextLoaderListener上下文監(jiān)聽器,在web容器啟動(dòng)時(shí),會觸發(fā)容器初始化事件,ContextLoaderListener會監(jiān)聽到這個(gè)事件,從而觸發(fā)ContextInitialized方法完成上下文初始化,這個(gè)方法中調(diào)用父類ContextLoader的方法完成上下文初始化。ContextLoader類中主要完成三件事:
1)創(chuàng)建WebApplicationContext;
2)加載對應(yīng)的Spring配置文件中的bean;(refresh方法,完成bean的加載)
3)將WebApplicationContext放入servletContext中。ContextLoaderListener監(jiān)聽器初始化完之后,開始初始化web.xml中配置的servlet,如DispatcherSevlet
ContextLoaderListener監(jiān)聽器監(jiān)聽的是servletContext,當(dāng)web容器初始化后,servletContext發(fā)生變化時(shí),會觸發(fā)相應(yīng)事件。

005Spring對數(shù)據(jù)庫事務(wù)管理?

Spring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一事務(wù)管理接口,具體實(shí)現(xiàn)都是由各數(shù)據(jù)庫自己實(shí)現(xiàn),數(shù)據(jù)庫事務(wù)的提交和回滾是通過 redo log 和 undo log實(shí)現(xiàn)的。Spring會在事務(wù)開始時(shí),根據(jù)當(dāng)前環(huán)境中設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫隔離級別,由此保持一致。

006Spring事務(wù)的種類?

①編程式事務(wù)管理使用TransactionTemplate。
②聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是通過AOP功能,對方法前后進(jìn)行攔截,將事務(wù)處理的功能編織到攔截的方法中,也就是在目標(biāo)方法開始之前啟動(dòng)一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。
聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明或通過@Transactional注解的方式,便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中,減少業(yè)務(wù)代碼的污染。唯一不足地方是,最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。

007Spring的事務(wù)傳播機(jī)制

Spring事務(wù)的傳播機(jī)制說的是,當(dāng)多個(gè)事務(wù)同時(shí)存在的時(shí)候,Spring如何處理這些事務(wù)的行為。事務(wù)傳播機(jī)制實(shí)際上是使用簡單的ThreadLocal實(shí)現(xiàn)的,所以,如果調(diào)用的方法是在新線程調(diào)用的,事務(wù)傳播實(shí)際上是會失效的。① PROPAGATION_REQUIRED:(默認(rèn)傳播行為)如果當(dāng)前沒有事務(wù),就創(chuàng)建一個(gè)新事務(wù);如果當(dāng)前存在事務(wù),就加入該事務(wù)。
② PROPAGATION_REQUIRES_NEW:無論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)進(jìn)行執(zhí)行。
③ PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),就加入該事務(wù);如果當(dāng)前不存在事務(wù),就以非事務(wù)執(zhí)行。‘
④ PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
⑤ PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行;如果當(dāng)前沒有事務(wù),則按REQUIRED屬性執(zhí)行。
⑥ PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),就加入該事務(wù);如果當(dāng)前不存在事務(wù),就拋出異常。
⑦ PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

008Spring事務(wù)的隔離級別?

① ISOLATION_DEFAULT:這是個(gè) PlatfromTransactionManager 默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別。
② ISOLATION_READ_UNCOMMITTED:讀未提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)未提交的數(shù)據(jù)。
③ ISOLATION_READ_COMMITTED:讀已提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)已經(jīng)提交的數(shù)據(jù)。
④ ISOLATION_REPEATABLE_READ:可重復(fù)讀,在同一個(gè)事務(wù)內(nèi),任意時(shí)刻的查詢結(jié)果都是一致的。
⑤ ISOLATION_SERIALIZABLE:所有事務(wù)逐個(gè)依次執(zhí)行。

009什么時(shí)候@Transactional失效?

1. @Transactional配置的方法非public權(quán)限修飾(例如private的就別加了);
2. @Transactional所在類非Spring容器管理的bean(例如一個(gè)Util就別加了,都沒注入容器,你叫Spring怎么用他的AOP幫你管理事務(wù)?);
3. @Transactional所在類中,注解修飾的方法被類內(nèi)部方法調(diào)用(例如同一個(gè)class類中,方法A調(diào)用方法B,只在方法B加了@Transactional注解,那就失效了);
4. 業(yè)務(wù)代碼拋出異常類型非RuntimeException,事務(wù)失效;
5. 業(yè)務(wù)代碼中存在異常時(shí),使用try…catch…語句塊捕獲,而catch語句塊沒有throw new RuntimeExecption異常(只有該異常或者他的父異常例如Exception可以回滾);
6. 注解@Transactional中Propagation屬性值設(shè)置錯(cuò)誤(例如Propagation.NOT_SUPPORTED,一般不會這么設(shè)置)
7. mysql關(guān)系型數(shù)據(jù)庫,且存儲引擎是MyISAM而非InnoDB,則事務(wù)會不起作用。

010Spring 什么情況下進(jìn)行事務(wù)回滾?

在java中異常的基類為Throwable,Error和Exception繼承Throwable。Exception中RuntimeException及其子類成為未檢查異常(unchecked),其它Exception成為已檢查異常(checked)。
Spring的事務(wù)管理默認(rèn)是針對unchecked exception回滾,也就是默認(rèn)對Error異常和RuntimeException異常以及其子類進(jìn)行事務(wù)回滾,且必須拋出異常,若使用try-catch對其異常捕獲則不會進(jìn)行回滾!(Error異常和RuntimeException異常拋出時(shí)不需要方法調(diào)用throws或try-catch語句);
checked異常,checked異常必須由try-catch語句包含或者由方法throws拋出,且事務(wù)默認(rèn)對checked異常不進(jìn)行回滾。

目錄

返回頂部
主站蜘蛛池模板: 欧美日韩一区二区在线视频播放 | 欧美激情人成日本在线视频 | 制服丝袜中文 | 色天天综合网色鬼综合 | 亚洲美女综合 | 国产免费麻豆 | 国产欧美精品一区二区色综合 | 国内精品在线播放 | 一区精品在线 | 97免费在线观看 | 欧美成人看片黄a免费看 | 午夜成a人片在线观看 | 天天天操 | 欧美三级中文字幕hd | 国产精品亚洲精品日韩动图 | a天堂v| 欧美午夜理伦三级理论三级 | 亚洲欧美日韩一区高清中文字幕 | 在线欧美日韩 | 日韩视频免费一区二区三区 | 伦理片免费看 | 亚洲欧美日本国产综合在线 | 日日日天天射天天干视频 | 国产片久久 | 日韩a级片在线观看 | 久久精品a亚洲国产v高清不卡 | 午夜窝窝 | 一级黄色片在线 | 天天碰天天操 | 免费一级真人毛片 | 欧美日韩高清在线观看一区二区 | 黄色视频一级毛片 | 一二三区乱码一区二区三区码 | 欧美超级碰碰 | 阿v天堂2021在线观看 | 好男人社区神马www在线观看 | 新97人人模人人爽人人喊 | 99久久中文字幕伊人 | 午夜私人影院4480yy毛片 | 亚洲国产精品毛片∧v卡在线 | 小妖精抬起臀嗯啊h军人小说 |