javascript
Springcloud整理
Springcloud
答題技巧:
總:當(dāng)前問(wèn)題回答的是那些具體的點(diǎn)
分:以1,2,3,4,5的方式分細(xì)節(jié)取描述相關(guān)的知識(shí)點(diǎn),如果有哪些點(diǎn)不清楚,直接忽略過(guò)去
突出一些技術(shù)名詞(核心概念,接口,類,關(guān)鍵方法)
避重就輕:沒(méi)有重點(diǎn)
一個(gè)問(wèn)題能占用面試官多少時(shí)間?問(wèn)的越多可能露餡越多
當(dāng)面試官問(wèn)到一個(gè)你熟悉的點(diǎn)的時(shí)候,一定要盡量拖時(shí)間
1.Spring IOC的理解,原理與實(shí)現(xiàn)?
總:
控制反轉(zhuǎn):理論思想,原來(lái)的對(duì)象是由使用者來(lái)進(jìn)行控制,有了spring之后,可以把整個(gè)對(duì)象交給spring來(lái)幫我們進(jìn)行管理
DI:依賴注入,把對(duì)應(yīng)的屬性的值注入到具體的對(duì)象中,@Autowired,populateBean完成屬性值的注入
容器:存儲(chǔ)對(duì)象,使用map結(jié)構(gòu)來(lái)存儲(chǔ),在spring中一般存在三級(jí)緩存,singletonObjects存放完整的bean對(duì)象,
整個(gè)bean的生命周期,從創(chuàng)建到使用到銷毀的過(guò)程全部都是由容器來(lái)管理(bean的生命周期)
分:
1、一般聊ioc容器的時(shí)候要涉及到容器的創(chuàng)建過(guò)程(beanFactory,DefaultListableBeanFactory),向bean工廠中設(shè)置一些參數(shù)(BeanPostProcessor,Aware接口的子類)等等屬性
2、加載解析bean對(duì)象,準(zhǔn)備要?jiǎng)?chuàng)建的bean對(duì)象的定義對(duì)象beanDefinition,(xml或者注解的解析過(guò)程)
3、beanFactoryPostProcessor的處理,此處是擴(kuò)展點(diǎn),PlaceHolderConfigurSupport,ConfigurationClassPostProcessor
4、BeanPostProcessor的注冊(cè)功能,方便后續(xù)對(duì)bean對(duì)象完成具體的擴(kuò)展功能
5、通過(guò)反射的方式講BeanDefinition對(duì)象實(shí)例化成具體的bean對(duì)象,
6、bean對(duì)象的初始化過(guò)程(填充屬性,調(diào)用aware子類的方法,調(diào)用BeanPostProcessor前置處理方法,調(diào)用init-mehtod方法,調(diào)用BeanPostProcessor的后置處理方法)
7、生成完整的bean對(duì)象,通過(guò)getBean方法可以直接獲取
8、銷毀過(guò)程
面試官,這是我對(duì)ioc的整體理解,包含了一些詳細(xì)的處理過(guò)程,您看一下有什么問(wèn)題,可以指點(diǎn)我一下(允許你把整個(gè)流程說(shuō)完)
您由什么想問(wèn)的?
老師,我沒(méi)看過(guò)源碼怎么辦?
具體的細(xì)節(jié)我記不太清了,但是spring中的bean都是通過(guò)反射的方式生成的,同時(shí)其中包含了很多的擴(kuò)展點(diǎn),比如最常用的對(duì)BeanFactory的擴(kuò)展,對(duì)bean的擴(kuò)展(對(duì)占位符的處理),我們?cè)诠緦?duì)這方面的使用是比較多的,除此之外,ioc中最核心的也就是填充具體bean的屬性,和生命周期(背一下)。
2.談一下spring IOC的底層實(shí)現(xiàn)
底層實(shí)現(xiàn):工作原理,過(guò)程,數(shù)據(jù)結(jié)構(gòu),流程,設(shè)計(jì)模式,設(shè)計(jì)思想
你對(duì)他的理解和你了解過(guò)的實(shí)現(xiàn)過(guò)程
反射,工廠,設(shè)計(jì)模式(會(huì)的說(shuō),不會(huì)的不說(shuō)),關(guān)鍵的幾個(gè)方法
createBeanFactory,getBean,doGetBean,createBean,doCreateBean,createBeanInstance(getDeclaredConstructor,newinstance),populateBean,initializingBean
1、先通過(guò)createBeanFactory創(chuàng)建出一個(gè)Bean工廠(DefaultListableBeanFactory)
2、開始循環(huán)創(chuàng)建對(duì)象,因?yàn)槿萜髦械腷ean默認(rèn)都是單例的,所以優(yōu)先通過(guò)getBean,doGetBean從容器中查找,找不到的話,
3、通過(guò)createBean,doCreateBean方法,以反射的方式創(chuàng)建對(duì)象,一般情況下使用的是無(wú)參的構(gòu)造方法(getDeclaredConstructor,newInstance)
4、進(jìn)行對(duì)象的屬性填充populateBean
5、進(jìn)行其他的初始化操作(initializingBean)
3.描述一下bean的生命周期 ?
背圖:記住圖中的流程
在表述的時(shí)候不要只說(shuō)圖中有的關(guān)鍵點(diǎn),要學(xué)會(huì)擴(kuò)展描述
1、實(shí)例化bean:反射的方式生成對(duì)象
2、填充bean的屬性:populateBean(),循環(huán)依賴的問(wèn)題(三級(jí)緩存)
3、調(diào)用aware接口相關(guān)的方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader對(duì)象的屬性設(shè)置)
4、調(diào)用BeanPostProcessor中的前置處理方法:使用比較多的有(ApplicationContextPostProcessor,設(shè)置ApplicationContext,Environment,ResourceLoader,EmbeddValueResolver等對(duì)象)
5、調(diào)用initmethod方法:invokeInitmethod(),判斷是否實(shí)現(xiàn)了initializingBean接口,如果有,調(diào)用afterPropertiesSet方法,沒(méi)有就不調(diào)用
6、調(diào)用BeanPostProcessor的后置處理方法:spring的aop就是在此處實(shí)現(xiàn)的,AbstractAutoProxyCreator
注冊(cè)Destuction相關(guān)的回調(diào)接口:鉤子函數(shù)
7、獲取到完整的對(duì)象,可以通過(guò)getBean的方式來(lái)進(jìn)行對(duì)象的獲取
8、銷毀流程,1;判斷是否實(shí)現(xiàn)了DispoableBean接口,2,調(diào)用destroyMethod方法
4.Spring 是如何解決循環(huán)依賴的問(wèn)題的?
三級(jí)緩存,提前暴露對(duì)象,aop
總:什么是循環(huán)依賴問(wèn)題,A依賴B,B依賴A
分:先說(shuō)明bean的創(chuàng)建過(guò)程:實(shí)例化,初始化(填充屬性)
1、先創(chuàng)建A對(duì)象,實(shí)例化A對(duì)象,此時(shí)A對(duì)象中的b屬性為空,填充屬性b
2、從容器中查找B對(duì)象,如果找到了,直接賦值不存在循環(huán)依賴問(wèn)題(不通),找不到直接創(chuàng)建B對(duì)象
3、實(shí)例化B對(duì)象,此時(shí)B對(duì)象中的a屬性為空,填充屬性a
4、從容器中查找A對(duì)象,找不到,直接創(chuàng)建
形成閉環(huán)的原因
此時(shí),如果仔細(xì)琢磨的話,會(huì)發(fā)現(xiàn)A對(duì)象是存在的,只不過(guò)此時(shí)的A對(duì)象不是一個(gè)完整的狀態(tài),只完成了實(shí)例化但是未完成初始化,如果在程序調(diào)用過(guò)程中,擁有了某個(gè)對(duì)象的引用,能否在后期給他完成賦值操作,可以優(yōu)先把非完整狀態(tài)的對(duì)象優(yōu)先賦值,等待后續(xù)操作來(lái)完成賦值,相當(dāng)于提前暴露了某個(gè)不完整對(duì)象的引用,所以解決問(wèn)題的核心在于實(shí)例化和初始化分開操作,這也是解決循環(huán)依賴問(wèn)題的關(guān)鍵,
當(dāng)所有的對(duì)象都完成實(shí)例化和初始化操作之后,還要把完整對(duì)象放到容器中,此時(shí)在容器中存在對(duì)象的幾個(gè)狀態(tài),完成實(shí)例化=但未完成初始化,完整狀態(tài),因?yàn)槎荚谌萜髦?#xff0c;所以要使用不同的map結(jié)構(gòu)來(lái)進(jìn)行存儲(chǔ),此時(shí)就有了一級(jí)緩存和二級(jí)緩存,如果一級(jí)緩存中有了,那么二級(jí)緩存中就不會(huì)存在同名的對(duì)象,因?yàn)樗麄兊牟檎翼樞蚴?,2,3這樣的方式來(lái)查找的。一級(jí)緩存中放的是完整對(duì)象,二級(jí)緩存中放的是非完整對(duì)象
為什么需要三級(jí)緩存?三級(jí)緩存的value類型是ObjectFactory,是一個(gè)函數(shù)式接口,存在的意義是保證在整個(gè)容器的運(yùn)行過(guò)程中同名的bean對(duì)象只能有一個(gè)。
如果一個(gè)對(duì)象需要被代理,或者說(shuō)需要生成代理對(duì)象,那么要不要優(yōu)先生成一個(gè)普通對(duì)象?要
普通對(duì)象和代理對(duì)象是不能同時(shí)出現(xiàn)在容器中的,因此當(dāng)一個(gè)對(duì)象需要被代理的時(shí)候,就要使用代理對(duì)象覆蓋掉之前的普通對(duì)象,在實(shí)際的調(diào)用過(guò)程中,是沒(méi)有辦法確定什么時(shí)候?qū)ο蟊皇褂?#xff0c;所以就要求當(dāng)某個(gè)對(duì)象被調(diào)用的時(shí)候,優(yōu)先判斷此對(duì)象是否需要被代理,類似于一種回調(diào)機(jī)制的實(shí)現(xiàn),因此傳入lambda表達(dá)式的時(shí)候,可以通過(guò)lambda表達(dá)式來(lái)執(zhí)行對(duì)象的覆蓋過(guò)程,getEarlyBeanReference()
因此,所有的bean對(duì)象在創(chuàng)建的時(shí)候都要優(yōu)先放到三級(jí)緩存中,在后續(xù)的使用過(guò)程中,如果需要被代理則返回代理對(duì)象,如果不需要被代理,則直接返回普通對(duì)象
4.1緩存的放置時(shí)間和刪除時(shí)間
三級(jí)緩存:createBeanInstance之后:addSingletonFactory
二級(jí)緩存:第一次從三級(jí)緩存確定對(duì)象是代理對(duì)象還是普通對(duì)象的時(shí)候,同時(shí)刪除三級(jí)緩存 getSingleton
一級(jí)緩存:生成完整對(duì)象之后放到一級(jí)緩存,刪除二三級(jí)緩存:addSingleton
5.Bean Factory與FactoryBean有什么區(qū)別?
相同點(diǎn):都是用來(lái)創(chuàng)建bean對(duì)象的
不同點(diǎn):使用BeanFactory創(chuàng)建對(duì)象的時(shí)候,必須要遵循嚴(yán)格的生命周期流程,太復(fù)雜了,,如果想要簡(jiǎn)單的自定義某個(gè)對(duì)象的創(chuàng)建,同時(shí)創(chuàng)建完成的對(duì)象想交給spring來(lái)管理,那么就需要實(shí)現(xiàn)FactroyBean接口了
isSingleton:是否是單例對(duì)象
getObjectType:獲取返回對(duì)象的類型
getObject:自定義創(chuàng)建對(duì)象的過(guò)程(new,反射,動(dòng)態(tài)代理)
6.Spring中用到的設(shè)計(jì)模式?
單例模式:bean默認(rèn)都是單例的
原型模式:指定作用域?yàn)閜rototype
工廠模式:BeanFactory
模板方法:postProcessBeanFactory,onRefresh,initPropertyValue
策略模式:XmlBeanDefinitionReader,PropertiesBeanDefinitionReader
觀察者模式:listener,event,multicast
適配器模式:Adapter
裝飾者模式:BeanWrapper
責(zé)任鏈模式:使用aop的時(shí)候會(huì)先生成一個(gè)攔截器鏈
代理模式:動(dòng)態(tài)代理
委托者模式:delegate
。。。。。。。。。
7.Spring的AOP的底層實(shí)現(xiàn)原理?
動(dòng)態(tài)代理
aop是ioc的一個(gè)擴(kuò)展功能,先有的ioc,再有的aop,只是在ioc的整個(gè)流程中新增的一個(gè)擴(kuò)展點(diǎn)而已:BeanPostProcessor
總:aop概念,應(yīng)用場(chǎng)景,動(dòng)態(tài)代理
分:
bean的創(chuàng)建過(guò)程中有一個(gè)步驟可以對(duì)bean進(jìn)行擴(kuò)展實(shí)現(xiàn),aop本身就是一個(gè)擴(kuò)展功能,所以在BeanPostProcessor的后置處理方法中來(lái)進(jìn)行實(shí)現(xiàn)
1、代理對(duì)象的創(chuàng)建過(guò)程(advice,切面,切點(diǎn))
2、通過(guò)jdk或者cglib的方式來(lái)生成代理對(duì)象
3、在執(zhí)行方法調(diào)用的時(shí)候,會(huì)調(diào)用到生成的字節(jié)碼文件中,直接回找到DynamicAdvisoredInterceptor類中的intercept方法,從此方法開始執(zhí)行
4、根據(jù)之前定義好的通知來(lái)生成攔截器鏈
5、從攔截器鏈中依次獲取每一個(gè)通知開始進(jìn)行執(zhí)行,在執(zhí)行過(guò)程中,為了方便找到下一個(gè)通知是哪個(gè),會(huì)有一個(gè)CglibMethodInvocation的對(duì)象,找的時(shí)候是從-1的位置一次開始查找并且執(zhí)行的。
8.Spring的事務(wù)是如何回滾的?
spring的事務(wù)管理是如何實(shí)現(xiàn)的?
總:spring的事務(wù)是由aop來(lái)實(shí)現(xiàn)的,首先要生成具體的代理對(duì)象,然后按照aop的整套流程來(lái)執(zhí)行具體的操作邏輯,正常情況下要通過(guò)通知來(lái)完成核心功能,但是事務(wù)不是通過(guò)通知來(lái)實(shí)現(xiàn)的,而是通過(guò)一個(gè)TransactionInterceptor來(lái)實(shí)現(xiàn)的,然后調(diào)用invoke來(lái)實(shí)現(xiàn)具體的邏輯
分:1、先做準(zhǔn)備工作,解析各個(gè)方法上事務(wù)相關(guān)的屬性,根據(jù)具體的屬性來(lái)判斷是否開始新事務(wù)
2、當(dāng)需要開啟的時(shí)候,獲取數(shù)據(jù)庫(kù)連接,關(guān)閉自動(dòng)提交功能,開起事務(wù)
3、執(zhí)行具體的sql邏輯操作
4、在操作過(guò)程中,如果執(zhí)行失敗了,那么會(huì)通過(guò)completeTransactionAfterThrowing看來(lái)完成事務(wù)的回滾操作,回滾的具體邏輯是通過(guò)doRollBack方法來(lái)實(shí)現(xiàn)的,實(shí)現(xiàn)的時(shí)候也是要先獲取連接對(duì)象,通過(guò)連接對(duì)象來(lái)回滾
5、如果執(zhí)行過(guò)程中,沒(méi)有任何意外情況的發(fā)生,那么通過(guò)commitTransactionAfterReturning來(lái)完成事務(wù)的提交操作,提交的具體邏輯是通過(guò)doCommit方法來(lái)實(shí)現(xiàn)的,實(shí)現(xiàn)的時(shí)候也是要獲取連接,通過(guò)連接對(duì)象來(lái)提交
6、當(dāng)事務(wù)執(zhí)行完畢之后需要清除相關(guān)的事務(wù)信息cleanupTransactionInfo
如果想要聊的更加細(xì)致的話,需要知道TransactionInfo,TransactionStatus,
9.談一下spring事務(wù)傳播?
傳播特性有幾種?7種
Required,Requires_new,nested,Support,Not_Support,Never,Mandatory
某一個(gè)事務(wù)嵌套另一個(gè)事務(wù)的時(shí)候怎么辦?
A方法調(diào)用B方法,AB方法都有事務(wù),并且傳播特性不同,那么A如果有異常,B怎么辦,B如果有異常,A怎么辦?
總:事務(wù)的傳播特性指的是不同方法的嵌套調(diào)用過(guò)程中,事務(wù)應(yīng)該如何進(jìn)行處理,是用同一個(gè)事務(wù)還是不同的事務(wù),當(dāng)出現(xiàn)異常的時(shí)候會(huì)回滾還是提交,兩個(gè)方法之間的相關(guān)影響,在日常工作中,使用比較多的是required,Requires_new,nested
分:1、先說(shuō)事務(wù)的不同分類,可以分為三類:支持當(dāng)前事務(wù),不支持當(dāng)前事務(wù),嵌套事務(wù)
2、如果外層方法是required,內(nèi)層方法是,required,requires_new,nested
3、如果外層方法是requires_new,內(nèi)層方法是,required,requires_new,nested
4、如果外層方法是nested,內(nèi)層方法是,required,requires_new,nested
找工作:
1、面試之前一定要調(diào)整好心態(tài),不管你會(huì)多少東西,干就完了,出去面試就一個(gè)心態(tài)好,讓自己超常發(fā)揮
2、得失心不要太重,全中國(guó)企業(yè)很多,好公司也有很多,沒(méi)必要在一棵樹上吊死,你可以有心儀的公司,留到最后,等你準(zhǔn)備充分再去
3、找工作永遠(yuǎn)不可能準(zhǔn)備好,很多同學(xué)慫,心態(tài)不好,不敢出去面試,我要準(zhǔn)備,先按照你的技術(shù)儲(chǔ)備取嘗試一些公司(我就是來(lái)試水的)面試回來(lái)之后做總結(jié),做好準(zhǔn)備,不斷總結(jié),復(fù)盤,這樣才能成長(zhǎng)
4、希望大家保持好信息互通,樂(lè)于分享
總結(jié)
以上是生活随笔為你收集整理的Springcloud整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 代数-导学
- 下一篇: Spring的@Transactiona