中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Spring框架的面試題有哪些

發布時間:2021-08-07 10:37:18 來源:億速云 閱讀:134 作者:小新 欄目:開發技術

小編給大家分享一下Java中Spring框架的面試題有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

面試題1:Bean 的加載過程是怎樣的?

我們知道, Spring 的工作流主要包括以下兩個環節:

  • 解析,讀 xml 配置,掃描類文件,從配置或者注解中獲取 Bean 的定義信息,注冊一些擴展功能。

  • 加載,通過解析完的定義信息獲取 Bean 實例。

下面是跟蹤了 getBean的調用鏈創建的流程圖,為了能夠很好地理解 Bean 加載流程,省略一些異常、日志和分支處理和一些特殊條件的判斷。

Java中Spring框架的面試題有哪些

從上面的流程圖中,可以看到一個 Bean 加載主要會經歷這么幾個階段(標綠內容):

  • 獲取 BeanName,對傳入的 name 進行解析,轉化為可以從 Map 中獲取到 BeanDefinition 的 bean name。

  • 合并 Bean 定義,對父類的定義進行合并和覆蓋,如果父類還有父類,會進行遞歸合并,以獲取完整的 Bean 定義信息。

  • 實例化,使用構造或者工廠方法創建 Bean 實例。

  • 屬性填充,尋找并且注入依賴,依賴的 Bean 還會遞歸調用 getBean 方法獲取。

  • 初始化,調用自定義的初始化方法。

  • 獲取最終的 Bean,如果是 FactoryBean 需要調用 getObject 方法,如果需要類型轉換調用 TypeConverter 進行轉化。

以上便是Spring對bean解析注冊的全過程,總結一下大致步驟:

  • 加載XML文件,封裝成Resource對象;

  • 調用Reader對象方法讀取XML文件內容,并將相關屬性放到BeanDefinition實例;

  • 將BeanDefinition對象放到BeanFactory對象,用于調用;

追問1:什么是循環依賴?

舉個例子,這里有三個類 A、B、C,然后 A 關聯 B,B 關聯 C,C 又關聯 A,這就形成了一個循環依賴。如果是方法調用是不算循環依賴的,循環依賴必須要持有引用。

Java中Spring框架的面試題有哪些

循環依賴發生的場景:

  • 構造器循環依賴:依賴的對象是通過構造器傳入的,發生在實例化 Bean 的時候。

  • 設值循環依賴:依賴的對象是通過 setter 方法傳入的,對象已經實例化,發生屬性填充和依賴注入的時候。

  • 如果是構造器循環依賴,本質上是無法解決的。比如我們準調用 A 的構造器,發現依賴 B,于是去調用 B 的構造器進行實例化,發現又依賴 C,于是調用 C 的構造器去初始化,結果依賴 A,整個形成一個死結,導致 A 無法創建。

  • 如果是設值循環依賴,Spring 框架只支持單例下的設值循環依賴。Spring 通過對還在創建過程中的單例,緩存并提前暴露該單例,使得其他實例可以引用該依賴。

追問2:循環依賴得解決思路是什么樣的?

Spring解決循環依賴,主要的思路就是依據三級緩存(解鏈)。

在實例化A時調用doGetBean,發現A依賴的B的實例,此時調用doGetBean去實例B,實例化的B的時候發現又依賴A,如果不解決這個循環依賴的話此時的doGetBean將會無限循環下去,導致內存溢出,程序奔潰。

如果Spring引用一個早期對象,并且把這個"早期引用"并將其注入到容器中,讓B先完成實例化,此時A就獲取B的引用,完成實例化。

一級緩存:singletonObjects,存放完全實例化屬性賦值完成的Bean,直接可以使用。
二級緩存:earlySingletonObjects,存放早期Bean的引用,尚未屬性裝配的Bean
三級緩存:singletonFactories,三級緩存,存放實例化完成的Bean工廠。

面試題2:@Resource和@Autowired有什么區別?

  •  @Autowired 根據類型注入

  • @Resource 默認根據名字注入,其次按照類型搜索

  • @Autowired @Qualifie("userService") 兩個結合起來可以根據名字和類型注入,等同于@Resource

1.@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。

2.@Autowired默認按類型裝配(byType),默認情況下必須要求依賴對象必須存在,如果要允許null值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用(@Autowired () @Qualifier ( "xxx" )功能同@Resource),如下:

@Autowired
@Qualifier ( "userDao" )
private UserDao userDao;

3.@Resource默認按照名稱進行裝配(byName),名稱可以通過name屬性進行指定,如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行安裝名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。如果name屬性一旦指定,就只會按照名稱進行裝配。

@Resource (name= "baseDao" )
private BaseDao baseDao;

總結如下:

  • @Autowired默認按byType自動裝配,而@Resource默認byName自動裝配。

  • @Autowired只包含一個參數:required,表示是否開啟自動注入,默認是true。而@Resource包含七個參數,其中最重要的兩個參數是:name 和 type。

  • @Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,則用byName自動裝配,如果指定了type,則用byType自動裝配。

  • @Autowired能夠用在:構造器、方法、參數、成員變量和注解上,而@Resource能用在:類、成員變量和方法上。

  • @Autowired是spring定義的注解,而@Resource是JSR-250定義的注解。

面試題3:Spring 的事務傳播行為有哪些,都有什么作用?

簡單來講,就是當系統中存在兩個事務方法時(我們暫稱為方法A和方法B),如果方法B在方法A中被調用,那么將采用什么樣的事務形式,就叫做事務的傳播特性

比如,A方法調用了B方法(B方法必須使用事務注解),那么B事務可以是一個在A中嵌套的事務,或者B事務不使用事務,又或是使用與A事務相同的事務,這些均可以通過指定事務傳播特性來實現。

傳播行為意義
propagation.REQUIRED表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則會啟動一個新的事務
propagation.SUPPORTS表示當前方法不需要事務上下文,但是如果存在當前事務的話,那么該方法會在這個事務中運行
propagation.MANDATORY表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常
propagation.REQUIRED_NEW表示當前方法必須運行在它自己的事務中。一個新的事務將被啟動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
propagation.NOT_SUPPORTED表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
propagation.NEVER表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常
propagation.NESTED表示如果當前已經存在一個事務,那么該方法將會在嵌套事務中運行。嵌套的事務可以獨立于當前事務進行單獨地提交或回滾。如果當前事務不存在,那么其行為與propagation.REQUIRED一樣。注意各廠商對這種傳播行為的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務

看完了這篇文章,相信你對“Java中Spring框架的面試題有哪些”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇明县| 民丰县| 乐业县| 额尔古纳市| 沙洋县| 余干县| 嵊州市| 长岭县| 吉林市| 永寿县| 公安县| 辽阳县| 贵定县| 诸暨市| 隆安县| 德惠市| 罗定市| 苗栗县| 东丰县| 潮州市| 高陵县| 西丰县| 南城县| 长寿区| 拉萨市| 台东县| 泸水县| 于田县| 遵义市| 甘洛县| 南丹县| 遂宁市| 福贡县| 梓潼县| 尉氏县| 济南市| 高碑店市| 伊宁市| 上蔡县| 巴彦县| 安吉县|