劍指Offer(Spring)——IOC容器

容器內部的運行的原理:
在這裏插入圖片描述
Spring啓動的時候讀取應用程度提供的bean配置並在Spring容器中生成一份相應的bean配置註冊表,然後根據這張註冊寶去是實例化bean,裝配好bean之間的依賴關係後爲上層提供準備就緒的運行環境,Spring提供一個配置文件描述bean和bean之間的依賴關係,利於Java的反射功能實例化bean,並在建立bean之間的依賴關係。

Spring IOC支持的功能:

  1. 依賴註冊
  2. 依賴檢查
  3. 自動裝配
  4. 支持集合
  5. 指定初始化方法和銷燬方法
  6. 支持回調方法

Spring是如何設計容器的??

從Spring IOC容器的兩個接口來說:BeanFactory和ApplicationContext

BeanFactory:Spring框架最核心的接口

提供了IOC的各種配置機制,包含了Bean的各種定義便於實例化bean,建立了bean之間的依賴關係,Bean的生命週期的控制也是它負責的。

BeanFactory是一個頂級接口:
在這裏插入圖片描述
在BeanFactory基礎上又設計了一個更高級的接口,就是ApplicationContext,是BeanFactory的子接口之一。

二者比較來看,BeanFactory是Spring框架的基礎設施,面向Spring,ApplicationContext面向使用Spring框架的開發者。

ApplicationContext功能如下:

  1. BeanFactory:能夠管理,裝配Bean
  2. ResourcePatternResolver:能夠加載資源文件
  3. MessageSource:能夠實現國際化等功能
  4. ApplicationEventPublisher:能夠註冊監聽器,實現監聽機制

getBean方法的代碼邏輯:

  1. 轉換beanName
  2. 從緩存中加載實例
  3. 實例化Bean
  4. 檢測parentBeanFactory
  5. 初始化依賴的Bean
  6. 創建Bean
  7. 檢查Bean符合要求之後將Bean進行返回

Spring方面的經典考題:

  1. SpringBean的五個作用域

Singleton:Spring的默認作用域,爲每一個IOC容器創建唯一的Bean實例,適合有狀態的Bean。

prototype:針對每個getBean請求,容器都會創建一個bean實例,所以適合無狀態的Bean,創建prototype成本是很高的。

如果是web容器,則額外支持以下三種作用域:

request:會爲每個Http請求創建一個Bean實例

session:會爲每個session創建一個Bean實例

globalSession:會爲每個全局Http Session 創建一個Bean實例,該作用域僅僅對Portlet有效。

  1. Spring Bean的生命週期

容器創建之後會解析,並且創建出來bean,Spring Bean的生命週期主要有創建和銷燬:

創建Bean:

  1. 實例化Bean對象,以及設置Bean屬性;
  2. 通過使用各種Aware接口,注入Bean對容器基礎設施的依賴,讓容器感知到Bean的存在;
  3. 緊接着調用BeanPostProcessor的前置初始化方法postProcessBeforeInitialization,主要是在Spring Bean完成初始化實例之後,添加一些自定義的處理邏輯;
  4. 如果實現InitializingBean.afterPropertiesSet,會針對自定義初始化的Bean去做一些自定義的事情;
  5. 之後定義Bean init,初始化Bean;
  6. 調用BeanPostProcessor的後置初始化方法postProcessAfterInitialization,做一些Bean初始化實例之後的自定義工作,最後就成功創建了Bean。

銷燬Bean:

  1. 如果Bean實現了DisposableBean接口,就會調用destroy方法;
  2. 如果配置了destroy-method屬性,則會調用其配置的銷燬方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章