欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?IOC容器啟動示例分析

 更新時間:2023年02月14日 11:22:22   作者:每天都要進步一點點  
這篇文章主要給大家介紹了Spring?IOC基于注解啟動的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

一、簡介

Spring核心有兩個:

  • IOC:控制反轉(zhuǎn)
  • AOP:面向切面編程

相信大家在項目中都使用過Spring進行開發(fā),都知道Spring非常強大,那么在熟練掌握Spring進行開發(fā)后,我們有必要去了解一下其中的原理,Spring工作原理也是面試中必問的一個環(huán)節(jié),先來看看幾道常見的面試題,想想看,如果被面試官問到,你會怎么答?

  • Spring IOC的工作原理?
  • Spring Bean的生命周期是怎樣的?
  • Spring 中使用到了哪些設(shè)計模式?
  • Spring是如何解決循環(huán)依賴的?
  • BeanFactory和FactoryBean的區(qū)別是什么?
  • ....

顯然,我們需要從源碼中獲取我們想要的答案,本篇文章我們先來分析一下Spring中IOC容器整個初始化過程,本篇文章暫且先不詳細分析源碼實現(xiàn),先把整個流程理清,后面再針對其中一些重要的環(huán)節(jié)逐個分析源碼是如何實現(xiàn)的,這樣可能沒那么懵,不然一進來就直接一個一個細節(jié)去摳,可能跟著跟著不知道從哪個方法進來的了。

二、IOC整體流程

Spring IOC的核心工廠類其實就是BeanFactory,從名字上也很好理解,生產(chǎn) bean 的工廠,它負責(zé)生產(chǎn)和管理各個 bean 實例。在項目中我們更多的是使用它的子類或者實現(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增強器等。

4、postProcessBeanFactory(beanFactory)

模板方法,留給子類擴展實現(xiàn)。

5、invokeBeanFactoryPostProcessors(beanFactory)

執(zhí)行BeanFactoryPostProcessor的postProcessBeanFactory ()增強方法。

6、registerBeanPostProcessors(beanFactory)

注冊BeanPostProcessor增強器,注意這里只是注冊,真正是在初始化階段的前后執(zhí)行。

7、initMessageSource()

初始化MessageSource,國際化處理。

8、initApplicationEventMulticaster()

初始化事件多播器。

9、onRefresh()

模板方法,留給子類擴展實現(xiàn)。

10、registerListeners()

注冊一些監(jiān)聽器。

11、finishBeanFactoryInitialization(beanFactory)

IOC容器創(chuàng)建最重要的一個步驟:完成非懶加載的單例bean對象的實例化,包括反射創(chuàng)建bean對象、屬性填充、循環(huán)依賴的處理、bean的初始化等等。

12、finishRefresh()

容器刷新完成之后的一些處理工作。

前面我們通過文字描述了refresh()方法主要的處理流程,下面通過兩張圖來說明,會更加形象,好理解一點:

這里可能稍微就涉及到一些細節(jié)了,有些許復(fù)雜,大家可以先過幾遍,有個印象后自己再去看源碼,相信會更加清晰里面的處理邏輯。

到此這篇關(guān)于Spring IOC容器啟動示例分析的文章就介紹到這了,更多相關(guān)Spring IOC容器啟動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Springboot實現(xiàn)攔截器的兩種方式

    淺談Springboot實現(xiàn)攔截器的兩種方式

    本文詳細的介紹了Springboot攔截器的兩種方式實現(xiàn),一種就是用攔截器,一種就是過濾器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性

    淺析Spring boot 中 logback 配置<springPropert

    這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 詳解Spring不同數(shù)據(jù)庫異常如何抽象的

    詳解Spring不同數(shù)據(jù)庫異常如何抽象的

    根據(jù)spring-jdbc中的定義,所有的數(shù)據(jù)操作異常都會轉(zhuǎn)換為 DataAccessException,下面這篇文章主要給大家介紹了關(guān)于Spring不同數(shù)據(jù)庫異常如何抽象的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Mybatis通過數(shù)據(jù)庫表自動生成實體類和xml映射文件

    Mybatis通過數(shù)據(jù)庫表自動生成實體類和xml映射文件

    這篇文章主要介紹了Mybatis通過數(shù)據(jù)庫表自動生成實體類和xml映射文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼圖文詳解

    IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼圖文詳解

    這篇文章主要介紹了IDEA利用自帶Axis工具和wsdl文件反向生成服務(wù)端客戶端代碼詳細流程,在這里小編使用的是idea2021.1最新開發(fā)工具,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2021-05-05
  • java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較

    這篇文章主要介紹了從源碼的角度淺析HashMap、TreeMap元素的存儲和獲取元素的邏輯;從Map與Set之間的關(guān)系淺析常用的Set中元素的存儲和判斷是否重復(fù)的邏輯,需要的朋友可以參考下
    2017-01-01
  • 詳解Java8中Optional的常見用法

    詳解Java8中Optional的常見用法

    Opitonal是java8引入的一個新類,目的是為了解決空指針異常問題。本文將通過示例為大家詳細講講Optional的常見用法,需要的可以參考一下
    2022-09-09
  • SpringBoot導(dǎo)出Excel表格到指定路徑的代碼詳解

    SpringBoot導(dǎo)出Excel表格到指定路徑的代碼詳解

    Spring Boot導(dǎo)出Excel通常涉及到使用第三方庫如Apache POI或者XlsxWriter等,它們能幫助你在Spring應(yīng)用中生成并下載Excel文件,那么SpringBoot如何導(dǎo)出Excel表格到指定路徑,本文將給大家詳細的介紹一下
    2024-07-07
  • 詳解Java中Iterable與Iterator用法

    詳解Java中Iterable與Iterator用法

    在本文中小編給大家分享了關(guān)于Java中Iterable與Iterator的用法知識點內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2018-10-10
  • 詳解SpringBoot 處理異常的幾種常見姿勢

    詳解SpringBoot 處理異常的幾種常見姿勢

    這篇文章主要介紹了詳解SpringBoot 處理異常的幾種常見姿勢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論