Spring 面試題匯總

spring的模塊有哪些?

Spring Core:基礎(chǔ),可以說Spring其他所有的功能都依賴于該類庫拙友。主要提供IOC和DI功能。

Spring Aspects:該模塊為與AspectJ的集成提供支持歼郭。

Spring AOP:提供面向方面的編程實(shí)現(xiàn)遗契。

Spring JDBC:Java數(shù)據(jù)庫連接。

Spring JMS:Java消息服務(wù)病曾。

Spring ORM:用于支持Hibernate等ORM工具牍蜂。

Spring Web:為創(chuàng)建Web應(yīng)用程序提供支持。

Spring Test:提供了對JUnit和TestNG測試的支持泰涂。

說下你對spring的理解鲫竞?

1.Spring框架幫我們管理對象及其依賴關(guān)系

2.是基于POJO的輕量級和最小侵入性編程

3.通過依賴注入進(jìn)行控制反轉(zhuǎn)

4.通過依賴注入和面向接口來松耦合

spring是如何解決循環(huán)依賴的?

首先循環(huán)依賴有三種情況:

1.構(gòu)造函數(shù)循環(huán)依賴(無法解決)

首先要解決循環(huán)依賴就是要先實(shí)例化逼蒙,然后放入三級緩存暴露出來从绘,那么如果是構(gòu)造函數(shù)這一步循環(huán)依賴,實(shí)例化的時候就會產(chǎn)生無限遞歸創(chuàng)建是牢,所以不能別解決

如果是延遲加載的話可以解決(另當(dāng)別論)僵井,后面真正用這個對象的時候有沒有問題我就不清楚了

2.setter方式的多例的循環(huán)依賴(無法解決)

如果是多例的,在容器初始化的時候驳棱,不會去創(chuàng)建批什,所以早期沒有放入到三級緩存中暴露出來,所以無法解決循環(huán)依賴社搅,會報錯

3.setter方式的單例循環(huán)依賴(A依賴B驻债,B依賴A)

1.首先第一步會實(shí)例化對象A,然后把A放入到三級緩存中提前暴露出來

2.然后去屬性注入B乳规,沒有B就去創(chuàng)建B,然后回去實(shí)例化B合呐,把B放入三級緩存中

3.屬性注入A驯妄,現(xiàn)在A中是在三級緩存,并把A移到二級緩存合砂,并且存放的是工廠,通過延遲加載源织,因?yàn)椴恢繟到底是代理對象還是原生對象翩伪,所以通過延遲加載的方法創(chuàng)建Bean

4.B就創(chuàng)建完成

5.回到A,回到A后谈息,就B屬性已經(jīng)注入缘屹,之后生成A,如果A代理了侠仇,就把二級緩存中的代理A賦值給原生的A返回放入到一級緩存中轻姿,如果不需要代理,就直接放入一級緩存

二級緩存中放的是創(chuàng)建中的對象

因此逻炊,我們可以發(fā)現(xiàn)互亮,spring利用三級緩存進(jìn)行對象的早期暴露,讓我們提前去引用他余素,來完成循環(huán)依賴

面試官喜歡問豹休,為什么要用三級,為什么要用二級桨吊,為什么用一級緩存威根?

我們知道循環(huán)依賴有幾種

一種是:A依賴B,B依賴A视乐,都無代理

就是因?yàn)槲覀円崆氨┞堆h(huán)依賴的對象洛搀,三級緩存中不放工廠行不行,可以佑淀,但是為了去解決萬分之一的循環(huán)依賴的情況留美,就每次都先生成對象,不合理

第二種:A依賴B渣聚,B依賴A独榴,有代理

B把A的代理給創(chuàng)建出來了,不用二級緩存奕枝,那我們的三級緩存就不干凈了

spring的生命周期

1.實(shí)例化

2.屬性注入

3.初始化

//Bean實(shí)例對象包裝相關(guān)屬性棺榔,如名稱,類加載器隘道,所屬容器等信息       

invokeAwareMethods(beanName, bean);
// 前置通知
applyBeanPostProcessorsBeforeInitialization
//文件中通過init-method屬性指定的
invokeInitMethods(beanName, wrappedBean, mbd);
// 后置通知生成AOP
applyBeanPostProcessorsAfterInitialization

4.銷毀

spring中的AOP是在DI之前還是之后

對于單個對象創(chuàng)建症歇,我們可以看到當(dāng)前對象AOP是在DI之后

對于屬性注入其他的對象郎笆,那么先生成其他對象的代理AOP,然后給當(dāng)前對象注入屬性,這種情況就是B的AOP在A的注入之前

A要去注入屬性B,然后B又要代理忘晤,AOP在DI之前

spring AOP主要是用來干什么宛蚓,是如何實(shí)現(xiàn)的

1.我們需要配置切點(diǎn),來告訴容器设塔,需要對那些類中的方法進(jìn)行增強(qiáng)

2.首先是通過動態(tài)代理的方式去進(jìn)行方法的增強(qiáng)凄吏,如果代理的類有實(shí)現(xiàn)接口就用jdk代理,否則就用cglib代理

3.我們需要配置切面闰蛔,來告訴容器增強(qiáng)方法有哪些痕钢,并且每個方法對應(yīng)一個攔截器

4.給每個方法綁定攔截器的執(zhí)行鏈

5.通過遞歸加索引去調(diào)用

6.如果你要執(zhí)行在之前,那么你的方法必須在proceed這個方法之前序六,如果你要執(zhí)行再之后任连,你的方法必須在preceed之后

spring注入bean的方式有哪些

1.通過@Configuration+@Bean的方式注入

2.通過實(shí)現(xiàn)ImportBeanDefinitionRegistrar接口可以往容器中注入BeanDefinition,從而注入bean

3.通過實(shí)現(xiàn)ImportSelector接口可以往spring容器中批量注入Bean

4.通過實(shí)現(xiàn)FactoryBean接口可以往Spring容器中自定義Bean

springmvc的流程

1.用戶發(fā)送請求至前端控制器DispatcherServlet例诀;
2.DispatcherServlet收到請求后随抠,調(diào)用HandlerMapping處理器映射器,請求獲取Handler繁涂;
3.處理器映射器根據(jù)請求url找到具體的處理器Handler拱她,生成處理器對象及處理器攔截器(如果有則生成),一并返回給DispatcherServlet爆土;
4.DispatcherServlet 調(diào)用 HandlerAdapter處理器適配器椭懊,請求執(zhí)行Handler;
5.HandlerAdapter 經(jīng)過適配調(diào)用 具體處理器進(jìn)行處理業(yè)務(wù)邏輯步势;
6.Handler執(zhí)行完成返回ModelAndView氧猬;
7.HandlerAdapter將Handler執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet;
8.DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進(jìn)行解析坏瘩;
9.ViewResolver解析后返回具體View盅抚;
10.DispatcherServlet對View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)
11.DispatcherServlet響應(yīng)用戶。

對于spring中的bean的懶加載如何實(shí)現(xiàn)

1.如果想讓單例的bean懶加載倔矾,就要加@Lazy注解

2.多例的bean在容器初始化本來就是懶加載的妄均,只有在調(diào)用的時候去實(shí)例化,所以加@Lazy有沒有意義

spring中聲明式事務(wù)注解中的參數(shù)

1.propagation傳播機(jī)制

2.isolation隔離級別

3.timeout超時時間哪自,如果共用一個事務(wù)丰包,只有之前的事務(wù)設(shè)置的timeout有效

4.rollbackFor回滾異常

5.noRollbackFor不會滾異常

事務(wù)的特點(diǎn)

事務(wù)應(yīng)該具有 4 個屬性:原子性、一致性壤巷、隔離性邑彪、持久性

原子性(Automicity)

一個事務(wù)是一個不可分割的工作單位,事務(wù)中包括的諸操作要么都做胧华,要么都不做寄症。

一致性(Consistency)

事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)宙彪。

一致性與原子性是密切相關(guān)的。

隔離性(Isolation)

一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾有巧。

即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的释漆,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。

持久性(Durability)

持久性也稱永久性(Permanence)篮迎,指一個事務(wù)一旦提交男图,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響甜橱。

spring的事務(wù)有幾種傳播機(jī)制

首先一定是基于嵌套事務(wù)來討論的享言,如果是一個事務(wù)就沒什么意義了

比如現(xiàn)在有一個這樣的例子::test調(diào)用methodB,methodB有Transactional渗鬼,methodB調(diào)用methodA,methodA也有事務(wù) 荧琼,這個就是我們的嵌套事務(wù)

//是默認(rèn)的傳播機(jī)制譬胎,如果B方法中調(diào)用A,如果B中有事務(wù),則A無論是否開啟事務(wù)都會用B的事務(wù)命锄,任何地方出現(xiàn)異常A和B都回滾
REQUIRED(必須的),
// 如果B調(diào)用A
// 1.B中是REQUIRED堰乔,A中是REQUIRES_NEW,會新起一個事務(wù)脐恩,則A,B互相不影響
// 2.B中是REQUIRES_NEW,A中是REQUIRED镐侯,那么A和B用同一個事務(wù),會把A的事務(wù)掛起
// 3.B中是REQUIRES_NEW,A中是REQUIRES_NEW驶冒,那么A和B各用各的事務(wù)苟翻,互相不影響
REQUIRES_NEW(需要新的),
// 如果存在一個事務(wù),支持當(dāng)前事務(wù)骗污。如果沒有事務(wù)崇猫,則非事務(wù)的執(zhí)行,完全依賴最外層事務(wù)
SUPPORTS(1),
// 必須運(yùn)行在事務(wù)里面
MANDATORY(強(qiáng)制性的),
// 以非事務(wù)方式執(zhí)行操作需忿,如果當(dāng)前存在事務(wù)诅炉,就把當(dāng)前事務(wù)掛起
NOT_SUPPORTED,
// 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)屋厘,則拋出異常涕烧。
NEVER,
// 支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)存在汗洒,則執(zhí)行一個嵌套事務(wù)议纯,如果當(dāng)前沒有事務(wù),就新建一個事務(wù)仲翎。
NESTED(嵌套的);

spring中事務(wù)的隔離級別

// 數(shù)據(jù)庫默認(rèn)的隔離級別
DEFAULT(-1),
// 讀未提交 ru,會導(dǎo)致臟讀
// 一事務(wù)對數(shù)據(jù)進(jìn)行了增刪改痹扇,但未提交铛漓,另一事務(wù)可以讀取到未提交的數(shù)據(jù)。如果第一個事務(wù)這時候回滾了鲫构,那么第二個事務(wù)就讀到了臟數(shù)據(jù)浓恶。
READ_UNCOMMITTED(1),
// 讀已提交 rc 避免臟讀,允許不可重復(fù)讀和幻讀
// 不可重復(fù)讀:一個事務(wù)中發(fā)生了兩次讀操作结笨,讀到的結(jié)果不一致包晰,因?yàn)槠渌氖聞?wù)往里面插入了一條數(shù)據(jù)
// 幻讀:A查詢數(shù)據(jù)不存在,然后B事務(wù)往里面插入一條數(shù)據(jù)炕吸,并提交事務(wù)伐憾,A繼續(xù)查詢還是不存在,也插入這條數(shù)據(jù)赫模,但是由于數(shù)據(jù)存在树肃,就插入失敗
READ_COMMITTED(2),
// 可重復(fù)讀 rr 避免臟讀,不可重復(fù)讀瀑罗,允許幻讀 
REPEATABLE_READ(4),
// 序列化
SERIALIZABLE(8);
// 從上到下胸嘴,隔離級別越來越高,并發(fā)性能就越來越差

臟讀:一事務(wù)對數(shù)據(jù)進(jìn)行了增刪改斩祭,但未提交劣像,另一事務(wù)可以讀取到未提交的數(shù)據(jù)。如果第一個事務(wù)這時候回滾了摧玫,那么第二個事務(wù)就讀到了臟數(shù)據(jù)耳奕。

不可重復(fù)讀:一個事務(wù)中發(fā)生了兩次讀操作,讀到的結(jié)果不一致诬像,因?yàn)槠渌氖聞?wù)往里面插入了一條數(shù)據(jù)

幻讀:A查詢數(shù)據(jù)不存在屋群,然后B事務(wù)往里面插入一條數(shù)據(jù),并提交事務(wù)坏挠,A繼續(xù)查詢還是不存在谓晌,也插入這條數(shù)據(jù),但是由于數(shù)據(jù)存在癞揉,就插入失敗

spring的失效場景

1.非public方法 事務(wù)的實(shí)現(xiàn)原理是代理增強(qiáng)纸肉,非public不能進(jìn)行代理增強(qiáng),不能進(jìn)行JDK或者CGLIB代理

演示: 把methodA改成protect

2.調(diào)用本類的方法 (調(diào)用methodC方法)

3.拋出捕捉的非RuntimeException喊熟,如果想要捕捉所有異常(rollbackFor = {Exception.class})

或者指定@Transactional(rollbackFor = {RuntimeException.class,ClassNotFoundException.class},propagation = Propagation.REQUIRED)  多個異常類

4.我們知道事務(wù)就是依賴于數(shù)據(jù)庫的柏肪,所以數(shù)據(jù)庫不支持肯定也是失效的!芥牌!比如myIsam

5.如果AOP使用了CGLIB代理烦味,事務(wù)方法或者類不是public,無法被外部包訪問到,或者是final無法繼承

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谬俄,一起剝皮案震驚了整個濱河市柏靶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溃论,老刑警劉巖屎蜓,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钥勋,居然都是意外死亡炬转,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門算灸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扼劈,“玉大人,你說我怎么就攤上這事菲驴〖龀常” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵赊瞬,是天一觀的道長捍靠。 經(jīng)常有香客問我,道長森逮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任磁携,我火速辦了婚禮褒侧,結(jié)果婚禮上算墨,老公的妹妹穿的比我還像新娘籽懦。我一直安慰自己荆秦,他們只是感情好凿跳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布摄凡。 她就那樣靜靜地躺著袱蚓,像睡著了一般技潘。 火紅的嫁衣襯著肌膚如雪技扼。 梳的紋絲不亂的頭發(fā)上粮呢,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天婿失,我揣著相機(jī)與錄音,去河邊找鬼啄寡。 笑死豪硅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挺物。 我是一名探鬼主播懒浮,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼识藤!你這毒婦竟也來了砚著?” 一聲冷哼從身側(cè)響起次伶,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稽穆,沒想到半個月后冠王,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秧骑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年版确,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乎折。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡绒疗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骂澄,到底是詐尸還是另有隱情吓蘑,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布坟冲,位于F島的核電站磨镶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏健提。R本人自食惡果不足惜琳猫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望私痹。 院中可真熱鬧脐嫂,春花似錦、人聲如沸紊遵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暗膜。三九已至匀奏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間学搜,已是汗流浹背娃善。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑞佩,地道東北人会放。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像钉凌,于是被迫代替她去往敵國和親咧最。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容