springBean整理(一),不為別的,只為面試嗎
一.首先了解 Spring容器(IOC)
1.1ClassPathXmlApplicationContext 與 AnnotationConfigApplicationContext兩
個獲取IOC容器的區別
ClassPathXmlApplicationContext
基於XML元配置,初始化應用上下文
AnnotationConfigApplicationContext
基於Java元配置,初始化應用上下文
** 1.2Spring容器(IOC)容器初始化過程**
上圖是根據spring原始碼來具體分析的,只看這張圖其實剛瞭解spring容器的小夥伴不能快速掌握,下面我根據自己學習的結果具體來談談我對spring容器啟動載入的一些體會,希望可以幫助到大家
1.先談談springIOC,他就是控制翻轉,是一種思想具體實現就靠依賴注入(DI)
2.springIOC大概分為幾個步驟,在這之前我想想一些框架springMVC,等啟動過程中都要載入配置檔案或者註解等,這些都相當於把檔案或者.class先讀取到jvm中…然後進行一些預操作什麼的,在進行一些核心的Handler擴充套件(AOP)例項化等;
3我大概解說一些spring容器啟動步驟
1)通過BeanDefinitionReader驗證解析載入xml,配置類,Annotation,等其他方式的類 (BeanDefinitionReader有xml解析,還有註解的read)載入到BeanDefinition這個容器中(map)
2) 載入到bd中後可以通過BeanFactoryPostProcessor這個擴充套件對bd中的class進行修改
3)容器後處理器BeanPostProcessors 會在具體事例化bd中的bean過程中穿插執行,
4)通過反射根據根據BD資訊獲取合適的Constructor例項化早期物件
5)進行依賴注入例項的屬性
6)根據BD配置呼叫例項init-method方法
7)事件傳播器(釋出和接收定製的事件就是一個監聽器)
8)生命週期LifeCycle介面
二.SpringBean生命週期講解
bean的生命週期理解
就是容器在載入過程中bean例項化過程
大概分為幾個步驟
1)驗證一下BD中的資訊
2)通過bd中的資訊通過反射生成早期物件包裝成一個objectFactory物件放入一級快取
3)進行屬性注入
注:屬性注入會有迴圈依賴注入問題,spring只能解決set迴圈依賴問題,原型依賴無法解決會拋異常,主要是通過一個map中有沒有正在建立的物件來判斷是不是原型依賴或者單例依賴,如果有就拋異常;
4)呼叫init-method方法
5)中間會穿插後bean處理器,aop加強
6)構建成功後放入到單例池中,清除掉二級三級快取中的早期物件
注:bean例項化過程中為啥要三級快取來解決迴圈依賴問題而不用二級快取解決呢?
這塊主要是aop動態代理生成的物件和剛開始bean反射生成的早期物件不是一個,會在棧中有兩個,會有兩個不同的地址,所以需要二級和三級快取完成動態代理aop加強操作
三.FactoryBean 與BeanFactory
BeanFactory:工廠類介面,Spring容器的核心介面,例項化bean、配置bean之間的依賴關係
FactoryBean:例項化bean過程比較複雜時可以考慮使用
api
public interface FactoryBean<T> {
//返回的物件例項
T getObject() throws Exception;
//Bean的型別
Class<?> getObjectType();
//true是單例,false是非單例 在Spring5.0中此方法利用了JDK1.8的新特性變成了default方法,返回true
boolean isSingleton();
}`
相關文章
- 面試官:"Handler的runWithScissors()瞭解嗎?為什麼Google不讓開發者用?"面試Go
- 面試官瘋了嗎,問我為什麼浮點數不精確?面試
- 分享一個作為面試官的面試思路面試
- 為什麼 DNS 協議使用 UDP?只使用了 UDP 嗎?DNS協議UDP
- 不拼花哨,只拼實用:unittest指南,乾貨為王!
- 5 年,只為了一個更好的校驗框架框架
- 面試:你知道為什麼會有 Generator 嗎面試
- Java面試題:為什麼HashMap不建議使用物件作為Key?Java面試題HashMap物件
- 玩遊戲不就是為了快樂嗎? 為何要在《只狼》這種遊戲裡受虐?遊戲
- oracle多列為空與多列不為空的區別小示例Oracle
- 搜尋條件設定為Is Null一定不走索引嗎?Null索引
- comboBox設定為只讀(只選)
- 你想成為一個黑客嗎?黑客
- MySQL的修仙者之旅,不來看看你的修為如何嗎?MySql
- Dave Thomas:一個開發者的為與不為(圖靈訪談)圖靈
- 作為面試官的一些心得面試
- MySQL 配置InnoDB為只讀操作MySql
- DNS 協議為什麼使用 UDP?你確定只使用UDP了嗎?DNS協議UDP
- vue一些不為人知的用法Vue
- 面試官:為什麼 Java 不把基本型別放在堆中?我竟然答不上來。。面試Java型別
- 為什麼過濾器只執行一次?過濾器
- iOS 面試題整理(一)iOS面試題
- 邦芒面試:為什麼你的面試沒回音?逃不過這8種情況面試
- 【Java面試】Redis存線上程安全問題嗎?為什麼?Java面試Redis
- Pycharm中一些不為人知的技巧PyCharm
- 前端資源分享-只為更好前端前端
- InK會成為下一個Qtum嗎?QT
- 可空型別為什麼可以為空?也許會被面試到哦。。。型別面試
- 為什麼建議一個容器中只執行一個程式
- 成為一個高薪的web前端程式設計師很難嗎? 方法不對,一切白費高薪Web前端程式設計師
- Google的通用翻譯機能成為未來的巴別魚嗎?Go
- ReplayingDecoder 解碼器:別以為我有多厲害,也只不過是使用了一下裝飾器模式而已~模式
- 作為獨立開發者 別人不會告訴你的事
- 為何Twitter區別於微信、淘寶,只使用了armeabi-v7a?
- 一張人臉照片,Meta眼鏡識別全部個人資訊,兩位哈佛開發者:只為警醒世人
- 只為好玩:這就是Linux之父的成功學Linux
- 為啥程式設計師下班後只關顯示器從不關電腦?程式設計師
- 分享按鈕的圖示為什麼不統一