Spring?IOC容器啟動示例分析
一、簡介
Spring核心有兩個:
- IOC:控制反轉(zhuǎn)
- AOP:面向切面編程
相信大家在項(xiàng)目中都使用過Spring進(jìn)行開發(fā),都知道Spring非常強(qiáng)大,那么在熟練掌握Spring進(jìn)行開發(fā)后,我們有必要去了解一下其中的原理,Spring工作原理也是面試中必問的一個環(huán)節(jié),先來看看幾道常見的面試題,想想看,如果被面試官問到,你會怎么答?
- Spring IOC的工作原理?
- Spring Bean的生命周期是怎樣的?
- Spring 中使用到了哪些設(shè)計(jì)模式?
- Spring是如何解決循環(huán)依賴的?
- BeanFactory和FactoryBean的區(qū)別是什么?
- ....
顯然,我們需要從源碼中獲取我們想要的答案,本篇文章我們先來分析一下Spring中IOC容器整個初始化過程,本篇文章暫且先不詳細(xì)分析源碼實(shí)現(xiàn),先把整個流程理清,后面再針對其中一些重要的環(huán)節(jié)逐個分析源碼是如何實(shí)現(xiàn)的,這樣可能沒那么懵,不然一進(jìn)來就直接一個一個細(xì)節(jié)去摳,可能跟著跟著不知道從哪個方法進(jìn)來的了。
二、IOC整體流程
Spring IOC的核心工廠類其實(shí)就是BeanFactory,從名字上也很好理解,生產(chǎn) bean 的工廠,它負(fù)責(zé)生產(chǎn)和管理各個 bean 實(shí)例。在項(xiàng)目中我們更多的是使用它的子類或者實(shí)現(xiàn)類,像常見的AbstractApplicationContext、ApplicationContext、DefaultListableBeanFactory、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等等。
我們先來回顧一下最基本的啟動 Spring 容器的例子:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
System.out.println(applicationContext.getBean("student"));如上代碼就可以利用XML配置文件來啟動一個 Spring 容器。
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent);
// 1、設(shè)置配置文件的路徑
setConfigLocations(configLocations);
if (refresh) {
//2、容器刷新方法:IOC核心方法就是refresh()
refresh();
}
}在ClassPathXmlApplicationContext的構(gòu)造方法中,我們可以看到有一個refresh()方法,它是整個IOC容器的核心。
refresh()主要做了下述12件事情,先說個大概:
1、prepareRefresh()
容器刷新前的一些預(yù)處理工作。
2、obtainFreshBeanFactory()
創(chuàng)建DefaultListableBeanFactory工廠,給bean工廠設(shè)置一些屬性,加載配置文件信息,封裝成bean定義信息。
3、prepareBeanFactory(beanFactory)
同樣,設(shè)置bean工廠的一些屬性,如添加一些BeanPostProcessor增強(qiáng)器等。
4、postProcessBeanFactory(beanFactory)
模板方法,留給子類擴(kuò)展實(shí)現(xiàn)。
5、invokeBeanFactoryPostProcessors(beanFactory)
執(zhí)行BeanFactoryPostProcessor的postProcessBeanFactory ()增強(qiáng)方法。
6、registerBeanPostProcessors(beanFactory)
注冊BeanPostProcessor增強(qiáng)器,注意這里只是注冊,真正是在初始化階段的前后執(zhí)行。
7、initMessageSource()
初始化MessageSource,國際化處理。
8、initApplicationEventMulticaster()
初始化事件多播器。
9、onRefresh()
模板方法,留給子類擴(kuò)展實(shí)現(xiàn)。
10、registerListeners()
注冊一些監(jiān)聽器。
11、finishBeanFactoryInitialization(beanFactory)
IOC容器創(chuàng)建最重要的一個步驟:完成非懶加載的單例bean對象的實(shí)例化,包括反射創(chuàng)建bean對象、屬性填充、循環(huán)依賴的處理、bean的初始化等等。
12、finishRefresh()
容器刷新完成之后的一些處理工作。
前面我們通過文字描述了refresh()方法主要的處理流程,下面通過兩張圖來說明,會更加形象,好理解一點(diǎn):


這里可能稍微就涉及到一些細(xì)節(jié)了,有些許復(fù)雜,大家可以先過幾遍,有個印象后自己再去看源碼,相信會更加清晰里面的處理邏輯。
到此這篇關(guān)于Spring IOC容器啟動示例分析的文章就介紹到這了,更多相關(guān)Spring IOC容器啟動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程
循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下2022-02-02
詳解如何更改SpringBoot TomCat運(yùn)行方式
這篇文章主要介紹了詳解如何更改SpringBoot TomCat運(yùn)行方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Java實(shí)現(xiàn)級聯(lián)下拉結(jié)構(gòu)的示例代碼
在開發(fā)過程中,會遇到很多的實(shí)體需要將查出的數(shù)據(jù)處理為下拉或者級聯(lián)下拉的結(jié)構(gòu),提供給前端進(jìn)行展示。本文為大家介紹了java封裝下拉和級聯(lián)下拉的通用工具類,需要的可以參考一下2022-06-06
SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用
本篇向小伙伴介紹springboot配置文件的配置,已經(jīng)全局配置參數(shù)如何使用的。需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-01-01
Springboot集成mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置詳解流程
在日常開發(fā)中,若遇到多個數(shù)據(jù)源的需求,怎么辦呢?通過springboot集成mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置,簡單嘗試一下,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Spring零基礎(chǔ)入門WebFlux響應(yīng)式編程
Spring 提供了兩個并行堆棧,一種是基于帶有 Spring MVC 和 Spring Data 結(jié)構(gòu)的 Servlet API,另一個是完全反應(yīng)式堆棧,它利用了 Spring WebFlux 和 Spring Data 的反應(yīng)式存儲庫,這篇文章主要介紹了Spring-webflux 響應(yīng)式編程,需要的朋友可以參考下2022-10-10
SpringBoot http請求注解@RestController原理解析
這篇文章主要介紹了SpringBoot http請求注解@RestController原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java List Object[]轉(zhuǎn)換成List T的實(shí)例
這篇文章主要介紹了Java List Object[]轉(zhuǎn)換成List T的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

