spring-面試題

面試官問到你熟悉的地方,盡量拖時(shí)間。問得越多露餡概率越大
總分模式講

1.談?wù)勀銓pring IOC的理解,原理和實(shí)現(xiàn)

總:
控制反轉(zhuǎn):理論思想,原來的對象是由使用者控制,有了spring之后,可以把整個(gè)對象交給spring管理。
spring容器:存儲對象,使用map結(jié)構(gòu)來存儲,在spring一般存在三級緩存,singletonObjects存放完整的bean對象。整個(gè)bean的生命周期,從創(chuàng)建到銷毀的過程全部由容器來管理(bean生命周期)
分:
1.一般聊ioc容器,需要說創(chuàng)建過程(beanFactory,DefaultListableBeanFactory),向bean工廠設(shè)置一些參數(shù)(BeanPostProcessor,Aware接口)
2.加載解析bean對象,準(zhǔn)備要?jiǎng)?chuàng)建的bean對象的定義對象beanDefinition(xml)
3.beanFactoryPostProcessor處理,擴(kuò)展點(diǎn),PlaceHolderConfigureSupport

  1. beanPostProcessor的注冊功能,方便后續(xù)對bean完成具體的擴(kuò)展功能
    5.通過反射講BeanDefinition對象實(shí)例化成具體的bean對象
    6.bean初始化過程(填充熟悉,調(diào)用aware子類方法,調(diào)用beanPostProcessor前置處理方法,調(diào)用init-method,調(diào)用beanPostProcess后置方法)
  2. 生成完整的bean對象,通過getBean方法可以直接獲取
    8.銷毀
    如果沒看過源碼:
    具體細(xì)節(jié)記不清,bean都是反射生成的,同時(shí)有很多擴(kuò)展點(diǎn),beanFactory擴(kuò)展,bean擴(kuò)展。ioc最核心的是bean屬性填充和bean生命周期管理

2.spring IOC的底層實(shí)現(xiàn)

總:反射
設(shè)計(jì)模式
關(guān)鍵方法(createBeanFactory,getBean,doGetBean,createBean,createBeanInstance,populateBean,initializingBean)
分:
1.通過createBeanFactory創(chuàng)建一個(gè)bean工廠
2.開始循環(huán)創(chuàng)建對象,先查找(getBean),查不到反射創(chuàng)建(createBean),使用無參構(gòu)造函數(shù)創(chuàng)建
3.進(jìn)行對象信息填充(populateBean)
4.進(jìn)行其他初始化動(dòng)作(initializingBean)

3. bean的生命周期

1.實(shí)例化bean:反射的方式生成bean
2.填充bean的屬性:populateBean,循環(huán)依賴問題(三級緩存)
3.調(diào)用aware接口相關(guān)方法,invokeAwareMethod(完成beanName,BeanFactory對象的屬性設(shè)置)
4.調(diào)用BeanPostProcessor中的前置方法,使用較多的又ApplicationContextPostProcessor,設(shè)置ApplicationContext,Environment,ResourceLoader對象
5.調(diào)用initmethod方法,invokeInitmethod(調(diào)用afterPropertiesSet方法)
6.調(diào)用BeanPostProcessor的后置方法,spring的aop在此實(shí)現(xiàn),AbstractAutoProxyCreator
7.獲取完成對象,可以通過getBean獲取對象
8.銷毀流程,判斷是否實(shí)現(xiàn)了dispoableBean接口,調(diào)用destoryBean方法

4.spring循環(huán)依賴如何解決

關(guān)鍵詞:三級緩存,提前暴露對象,aop
總:什么是循環(huán)依賴
分:先說明bean的創(chuàng)建過程:實(shí)例化,初始化(填充熟悉)
1.創(chuàng)建A,實(shí)例化A,此時(shí)發(fā)現(xiàn)A對象的b為空
2.容器查找B,沒有找到,直接創(chuàng)建B對象
3.實(shí)例化B對象,此時(shí)B對象中的a屬性為空,填充屬性a
4.從容器中查找A,找不到,直接創(chuàng)建,于是形成了循環(huán)依賴
解決:提前暴露A,將A實(shí)例化之后暴露出去(即使不完整),這樣第4步找得到A。這樣就存在2個(gè)A,一個(gè)是實(shí)例化后,一個(gè)是完整的初始化后。需要2個(gè)map來存,一級緩存存完整對象,二級緩存存實(shí)例化后的對象。
為什么有三級緩存,三級緩存value存的是objectFactory函數(shù)式接口,意義是保證容器運(yùn)行過程同名的bean只有一個(gè)。aop代理類需要先生成原始類,最開始放三級緩存,確認(rèn)類是代理類還是普通類,加入二級緩存,同時(shí)刪除三級緩存。生成完整bean對象放入一級緩存,刪除二三級緩存

5.bean factory和factory bean有什么區(qū)別

都是創(chuàng)建對象
不同點(diǎn):使用beanFactory創(chuàng)建流程太復(fù)雜。簡單自定義某個(gè)對象的創(chuàng)建,同時(shí)創(chuàng)建后交給spring管理,事項(xiàng)factoryBean接口

6.spring中的設(shè)計(jì)模式

單例模式:bean默認(rèn)都是單例
模板方法:postProcessorFactory, onRefresh,initPropertyValue
工廠方法:beanFactory
策略模式:xmlBeanDefinitionReader,propertiesBeanDefinitionReader
觀察者模式:listener,event
適配器模式:adapter
裝飾者模式:beanWrapper
責(zé)任鏈模式:aop的時(shí)候生成一個(gè)攔截器鏈

7.spring AOP的底層實(shí)現(xiàn)

aop是ioc的擴(kuò)展功能?,F(xiàn)有ioc,再有aop,只是ioc的整個(gè)流程中新增一個(gè)擴(kuò)展點(diǎn):beanPostProcessor
1.代理對象創(chuàng)建過程(advice,切面,切點(diǎn))
2.通過jdk或cglib創(chuàng)建代理對象
3.在執(zhí)行方法的時(shí)候,調(diào)用到字節(jié)碼中,找到DynamicAdvisoredInterceptor的intercept方法,從此方法執(zhí)行
4.根據(jù)之前定義的通知生成攔截鏈,從攔截鏈一次獲取每一個(gè)通知開始執(zhí)行。

8.spring的事務(wù)如何回滾的

其實(shí)想問的是:spring的事務(wù)管理是如何實(shí)現(xiàn)的
總:spring的事務(wù)是由aop實(shí)現(xiàn)的,事務(wù)是通過transactionInterceptor來實(shí)現(xiàn)的
分:
1.準(zhǔn)備工作,解析各個(gè)方法的事務(wù)相關(guān)屬性,決定是否開啟事務(wù)
2.開啟事務(wù),獲取數(shù)據(jù)庫連接
3.執(zhí)行sql
4.執(zhí)行失敗,通過completeTransactionAfterThrowing完成回滾
5.執(zhí)行成功,通過commitTransactionAfterReturning完成事務(wù)提交
6.事務(wù)執(zhí)行完畢,清除事務(wù)相關(guān)屬性cleanupTransactionInfo

9. 談一談spring事務(wù)傳播

7種:
required:需要在事務(wù)中運(yùn)行,如果沒有事務(wù)開啟一個(gè),如果有在原有事務(wù)運(yùn)行
requires_new:開啟一個(gè)新事務(wù)
nested:如果一個(gè)事務(wù)存在,運(yùn)行在一個(gè)嵌套事務(wù)中,外層事務(wù)是不會引起內(nèi)層事務(wù)的回滾,內(nèi)層事務(wù)的失敗不會引起外層事務(wù)的回滾。如果沒有事務(wù),開啟事務(wù)
support:有事務(wù)在事務(wù)中運(yùn)行,沒有就不開啟事務(wù)運(yùn)行
not_support:不在事務(wù)中運(yùn)行,如果有事務(wù)先掛起
never:不在事務(wù)中運(yùn)行,如果有事務(wù)報(bào)錯(cuò)
mandatory:存在事務(wù),支持當(dāng)前事務(wù),沒有事務(wù)拋異常

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容