springBean整理(一),不為別的,只為面試嗎

langzilige發表於2020-09-30

一.首先了解 Spring容器(IOC)

1.1ClassPathXmlApplicationContext 與 AnnotationConfigApplicationContext兩
個獲取IOC容器的區別

 ClassPathXmlApplicationContext
基於XML元配置,初始化應用上下文
 AnnotationConfigApplicationContext
基於Java元配置,初始化應用上下文

** 1.2Spring容器(IOC)容器初始化過程**
springBean容器初始化流程
上圖是根據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生命週期講解

spring生命週期
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();
}`

相關文章