亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?IOC容器啟動(dòng)示例分析

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

一、簡介

Spring核心有兩個(gè):

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

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

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

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

二、IOC整體流程

Spring IOC的核心工廠類其實(shí)就是BeanFactory,從名字上也很好理解,生產(chǎn) bean 的工廠,它負(fù)責(zé)生產(chǎn)和管理各個(gè) bean 實(shí)例。在項(xiàng)目中我們更多的是使用它的子類或者實(shí)現(xiàn)類,像常見的AbstractApplicationContext、ApplicationContext、DefaultListableBeanFactory、ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等等。

我們先來回顧一下最基本的啟動(dòng) Spring 容器的例子:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-config.xml");
System.out.println(applicationContext.getBean("student"));

如上代碼就可以利用XML配置文件來啟動(dòng)一個(gè) 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)造方法中,我們可以看到有一個(gè)refresh()方法,它是整個(gè)IOC容器的核心。

refresh()主要做了下述12件事情,先說個(gè)大概:

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)

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

7、initMessageSource()

初始化MessageSource,國際化處理。

8、initApplicationEventMulticaster()

初始化事件多播器。

9、onRefresh()

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

10、registerListeners()

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

11、finishBeanFactoryInitialization(beanFactory)

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

12、finishRefresh()

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

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

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

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

相關(guān)文章

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

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

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

    淺析Spring boot 中 logback 配置<springPropert

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

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

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

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

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

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

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

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

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

    詳解Java8中Optional的常見用法

    Opitonal是java8引入的一個(gè)新類,目的是為了解決空指針異常問題。本文將通過示例為大家詳細(xì)講講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表格到指定路徑,本文將給大家詳細(xì)的介紹一下
    2024-07-07
  • 詳解Java中Iterable與Iterator用法

    詳解Java中Iterable與Iterator用法

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

    詳解SpringBoot 處理異常的幾種常見姿勢(shì)

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

最新評(píng)論