hazy的面試小筆記之Spring 持續更新

2021-10-21 08:25:52 字數 3327 閱讀 3764

spring 的七種事務傳播

spring的單例是怎麼實現的?(單例登錄檔)

答:維護乙個單例登錄檔,即hashmap,key為beanname, value為對應的bean,如果每次查詢的都是同乙個beanname,就返回同乙個bean

如果是多例模式,則每次都生成新的bean並且不註冊到單例登錄檔中

如果是單例模式,在第一次載入bean的時候鎖住表並將bean新增到單例登錄檔中

spring迴圈依賴的解決方法

答:如果是構造器的依賴迴圈,則無法解決

如果是field的依賴迴圈,spring通過**快取進行解決。

舉例:「a的某個field或者setter依賴了b的例項物件,同時b的某個field或者setter依賴了a的例項物件」這種迴圈依賴的情況。

1、a首先完成了初始化的第一步,並且將自己提前**到singletonfactories中,此時進行初始化的第二步,發現自己依賴物件b,此時就嘗試去get(b),發現b還沒有被create,就去找b

2、接下來輪到b初始化,b在初始化第一步的時候發現自己依賴了物件a,於是嘗試get(a),嘗試一級快取singletonobjects(肯定沒有,因為a還沒初始化完全),嘗試二級快取earlysingletonobjects(也沒有),嘗試**快取singletonfactories,由於a通過objectfactory將自己提前**了,所以b能夠通過objectfactory.getobject拿到a物件(雖然a還沒有初始化完全,但是總比沒有好呀),b拿到a物件後順利完成了初始化階段1、2、3,完全初始化之後將自己放入到一級快取singletonobjects中。

3、此時返回a中,a此時能拿到b的物件順利完成自己的初始化階段2、3,最終a也完成了初始化,進去了一級快取singletonobjects中,4、而且更加幸運的是,由於b拿到了a的物件引用,所以b現在hold住的a物件完成了初始化。

5、因為是需要初始化物件,需要乙個無參構造器,所以構造器的迴圈就不能解決。如果使用了dependon註解也可能造成依賴迴圈

springbean的生命週期

影響多個bean的介面: 1、instantiationawarebeanpostprocessor:包裹bean的例項化即建構函式前後

2、beanpostprocessor:在bean的init方法前後

instantiationawarebeanpostprocessorbefore方法是在例項化bean之前,因此可以利用它來生成**類,取代原本的類,來達到aop的實現,並且在這個方法中會獲取所有需要被**的類,有需要立刻**的就馬上**(有targetsource的情況下),否則都留到初始化時再進行**;after方法可以阻斷後續的賦值操作

beanpostprocessor中的after方法就進行了aop執行

只呼叫一次的介面:1、aware型別的介面 2、生命週期介面;都是需要bean去實現這個介面的

springboot的啟動流程

所謂的***模式,就是獲得所有的***,遍歷它們並把引數傳給它們進行處理,而廣播就是這個遍歷的觸發者

4、banner屬性的設定

7 、refreshcontext(context),bean的例項化完成ioc容器可用的最後一道工序

8、 最後springboot做一些收尾工作

springboot的自動裝配原理

springaop的實現原理

答:在bean例項化之後馬上執行的方法中生成乙個**類代替原先的類進行返回,這個**類就是aop切入之後的類

1、spring預設使用jdk的動態**實現aop,類如果實現了介面,spring就會使用這種方式實現動態**。傳入的引數應該是被**類例項。生成的**類父類是proxy

2、如果被**類沒有實現介面,那麼就要使用cglib**模式,從位元組碼層面去生成子類。因此,被**的類的方法不能是final的,就相當於自動幫我們寫了乙個子類。傳入的引數應該是被**類.class。生成的**類父類是被**類

在spring中,這個aop的實現是在decreatebean的末尾實現的,即例項化之後

beanfactory和factorybean的區別

答:beanfactory是乙個工廠類、ioc容器或物件工廠,用於生成bean例項。而factorybean是乙個特殊的bean,類似於**類。

factorybean是乙個特殊的bean,當容器試圖去獲取這個bean的時候,返回的是factorybean內部getobject()方法返回的物件,通過這種方法我們可以在getobject方法返回之前新增一些額外的功能,比如**等等.

比如我們定義了乙個factorybean:fbean並且object引用了另乙個bean:refedbean,則我們在通過容器去獲取到fbean時,返回的是refedbean

可以搭配實現initializingbean等介面使用,在object獲取到引用的bean之後,生成乙個bean**類替換object

spingioc注入物件過程?

答:spring最重要的功能就是ioc控制翻轉,它主要是生成乙個容器來儲存和管理bean。為了注入物件我們首先得有這個容器,把bean都進行註冊,並且能從這個容器中取出bean。

1、使用resourceloader進行xml配置檔案的載入並且接下來進行解析,如果是以註解的方式則需要掃瞄一下對應的包

2、建立beanfactory工廠類,以便後續從中取出bean。

3、生成對應的beandefinition,包含了bean的類資訊與依賴資訊等等。然後進行bean的初始化

4、註冊bean

hazy的面試小筆記之計網 持續更新

tcp如何保證傳輸可靠性 校驗和,序列號和確認應答號,重傳,流量控制,擁塞控制 答 1 校驗和 3 超時重傳 傳送方等待兩個來回時間沒收到接收訊號,就會重發。接收方接收到重發的包,根據之前是否已經接收到這個包來選擇丟棄或者接收,並最終都會傳送乙個接收訊號ack 4 流量控制 接收端會在確認應答傳送a...

cocos2dx之如何實現自己的sprite

可能在製作遊戲的過程中,用到sprite,但是它本省的方法有限,我需要再次擴充它,那麼我們可以通過繼承得到自定義的sprite 定義如下 ifndef myspritebase h define myspritebase h include cocos2d.h using ns cc class m...

Spring初學者的每一步之配置Spring

以前都有接觸過spring但是都沒有很系統的去學習過,到現在重新去拿起spring的時候,發現都忘的差不多了 好吧,又重新來過,這次呢,從頭開始,希望能夠學得系統一點!現在,開始配置spring 1.首先要匯入springframework的包,在這裡我用的是最新的spring4.2.3 這裡面沒有...