容器內部的運行的原理:
Spring啓動的時候讀取應用程度提供的bean配置並在Spring容器中生成一份相應的bean配置註冊表,然後根據這張註冊寶去是實例化bean,裝配好bean之間的依賴關係後爲上層提供準備就緒的運行環境,Spring提供一個配置文件描述bean和bean之間的依賴關係,利於Java的反射功能實例化bean,並在建立bean之間的依賴關係。
Spring IOC支持的功能:
- 依賴註冊
- 依賴檢查
- 自動裝配
- 支持集合
- 指定初始化方法和銷燬方法
- 支持回調方法
Spring是如何設計容器的??
從Spring IOC容器的兩個接口來說:BeanFactory和ApplicationContext
BeanFactory:Spring框架最核心的接口
提供了IOC的各種配置機制,包含了Bean的各種定義便於實例化bean,建立了bean之間的依賴關係,Bean的生命週期的控制也是它負責的。
BeanFactory是一個頂級接口:
在BeanFactory基礎上又設計了一個更高級的接口,就是ApplicationContext,是BeanFactory的子接口之一。
二者比較來看,BeanFactory是Spring框架的基礎設施,面向Spring,ApplicationContext面向使用Spring框架的開發者。
ApplicationContext功能如下:
- BeanFactory:能夠管理,裝配Bean
- ResourcePatternResolver:能夠加載資源文件
- MessageSource:能夠實現國際化等功能
- ApplicationEventPublisher:能夠註冊監聽器,實現監聽機制
getBean方法的代碼邏輯:
- 轉換beanName
- 從緩存中加載實例
- 實例化Bean
- 檢測parentBeanFactory
- 初始化依賴的Bean
- 創建Bean
- 檢查Bean符合要求之後將Bean進行返回
Spring方面的經典考題:
- SpringBean的五個作用域
Singleton:Spring的默認作用域,爲每一個IOC容器創建唯一的Bean實例,適合有狀態的Bean。
prototype:針對每個getBean請求,容器都會創建一個bean實例,所以適合無狀態的Bean,創建prototype成本是很高的。
如果是web容器,則額外支持以下三種作用域:
request:會爲每個Http請求創建一個Bean實例
session:會爲每個session創建一個Bean實例
globalSession:會爲每個全局Http Session 創建一個Bean實例,該作用域僅僅對Portlet有效。
- Spring Bean的生命週期
容器創建之後會解析,並且創建出來bean,Spring Bean的生命週期主要有創建和銷燬:
創建Bean:
- 實例化Bean對象,以及設置Bean屬性;
- 通過使用各種Aware接口,注入Bean對容器基礎設施的依賴,讓容器感知到Bean的存在;
- 緊接着調用BeanPostProcessor的前置初始化方法postProcessBeforeInitialization,主要是在Spring Bean完成初始化實例之後,添加一些自定義的處理邏輯;
- 如果實現InitializingBean.afterPropertiesSet,會針對自定義初始化的Bean去做一些自定義的事情;
- 之後定義Bean init,初始化Bean;
- 調用BeanPostProcessor的後置初始化方法postProcessAfterInitialization,做一些Bean初始化實例之後的自定義工作,最後就成功創建了Bean。
銷燬Bean:
- 如果Bean實現了DisposableBean接口,就會調用destroy方法;
- 如果配置了destroy-method屬性,則會調用其配置的銷燬方法。