1. 程式人生 > >Spring原始碼分析(二)-Spring IoC容器的初始化No.1

Spring原始碼分析(二)-Spring IoC容器的初始化No.1

Spring IoC容器的初始化

Spring原始碼分析(一)中提到了很多類,比如BeanDefinition、BeanDefinitionReader、BeanDefintionParser、BeanWrapper等都是ApplicationContext中需要使用的類,都可以從Spring原始碼中的註釋中瞭解

IoC容器的初始化時由前面介紹的AbstractApplicationContext.refresh方法來啟動的,具體來說,這個啟動包括Bean的載入過程和Bean的例項化過程:

  • Bean的載入過程分為,BeanDefinition的Resource定位、載入和註冊
  • Bean的例項化過程分為,Bean的建立和依賴注入

refresh()原始碼:

    @Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory
beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); //
Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex); // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }

Bean載入過程

BeanDefinition的Resource定位

實現路徑:refresh()=>obtainFreshBeanFactory()=>refreshBeanFactory()=>loadBeanDefinitions()….DefaultResourceLoader.getResource()
這個Resource定位指的是BeanDefinition的資源定位,它由ResourceLoader完成的

BeanDefinition的載入和解析

這個過程是把使用者定義好的Bean表示成IoC容器內部的資料結構,即BeanDefinition
實現路徑:refresh()=>obtainFreshBeanFactory()=>refreshBeanFactory()=>loadBeanDefinitions()
其中牽扯到很多類,XmlBeanDefinitionReader、BeanDefinitionParserDelegate等等,可以DeBug進去
最後會發現Spring也是用的ClassLoader載入的class檔案,將class資訊封裝成BeanDefinition,也就是之前被註解的類通過讀取class檔案的方式在這被載入(在類ClassPathBeanDefinitionScanner中實現)

BeanDefinition在IoC容器中註冊

實現路徑:refresh()=>obtainFreshBeanFactory()=>refreshBeanFactory()=>loadBeanDefinitions()……DefaultListableBeanFactory.registerBeanDefinition
最終DeBug的話會調到該方法,哎,只能說Spring好深,DefaultListableBeanFactory繼承了BeanDefinitionRegistry介面,處處可以發現Spring面向介面的程式設計思想,職責分明

    /** Map of bean definition objects, keyed by bean name */
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);

所有的BeanDefinition都會存放在這個ConcurrentHashMap中

總結

至此Bean的載入過程到此結束,下一章重點分析bean的例項化和依賴注入

相關推薦

Spring原始碼分析-Spring IoC容器初始No.2

Spring原始碼分析(一)-Spring IoC容器的初始化No.1中已經分析了Bean的載入過程,本章將分析Bean的例項化過程 本章圍繞refresh().finishBeanFactoryInitialization(beanFactory)方法,

Spring原始碼分析-Spring IoC容器初始No.1

Spring IoC容器的初始化 Spring原始碼分析(一)中提到了很多類,比如BeanDefinition、BeanDefinitionReader、BeanDefintionParser、BeanWrapper等都是ApplicationContext中

Spring原始碼分析IoC容器的實現1

    Ioc(Inversion of Control)——“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。理解好Ioc的關鍵是要明確“誰控制誰,控制什麼,為何是反轉(有

Spring原始碼分析IoC容器的實現3

BeanDefinition的載入和解析     這個載入過程,相當於把定義的BeanDefinition在IoC容器中轉化成一個Spring內部表示的資料結構的過程。IoC容器對Bean的管理和依賴注入功能的實現,是通過對其持有的BeanDefinition進

Spring原始碼分析IoC容器的實現2

IoC容器的初始化過程     簡單來說IoC容器的初始化是由refresh()方法啟動的,這個方法標誌著IoC容器的正式啟動。這個啟動包括BeanDefinition的Resouce定位、載入和註冊三個基本過程。     第一

Spring原始碼分析——常用設計模式

代理模式:事情必須做,而自己沒有時間做或者不想做。必須持有被代理物件的引用。包括靜態代理和動態代理兩種代理方式。生活中的場景如火車票代買、簽證辦理等一系列中介類似的活動。在Spring中的體現有JDK動

Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構與設計原理》讀書筆記IOC容器初始過程

通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

spring原始碼剖析Spring預設標籤解析及註冊實現

在使用spring的時候,我也經常會使用到bean標籤,beans標籤,import標籤,aop標籤等。 下面主要為讀者介紹spring的預設的自帶標籤的解析流程。 驗證模式(DTD&XSD) dtd基本已被淘汰,現在spring的驗證模式基本都是採用xsd檔案

nginx原始碼分析5——監聽socket初始

在nginx原始碼分析(4)中,看到了nginx的事件模型,但其中沒有介紹監聽socket的初始化。而對於web server來說,需要通過監聽socket來監聽客戶端的連線等。本篇將會具體介紹這方面的內容。還記得在前文介紹ngx_cycle_t結構時,它具有一個listening屬性,是一個數組,

Spring component-scan原始碼分析 -- @Configuration註解處理

上篇文章Spring component-scan原始碼分析(一) – XML解析分析了Spring解析<context:component-scan …/>標籤時,把掃描到的合適的類封裝成BeanDefinition加入Sping容器中,本篇分析S

Spring原始碼分析IoC容器的依賴注入2

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { //這裡取得在BeanDefinition中設定的property值,這些property來自對BeanDefini

Spring原始碼分析IoC容器的依賴注入1

    依賴注入的過程是使用者第一次向IoC容器索要Bean時才觸發的,當然也有例外,可以在BeanDefinition資訊中通過控制lazy-init屬性來讓容器完成對Bean的預例項化。這個預例項化實際上也是一個完成依賴注入的過程,但它是在初始化的過程中完成的。

SpringIOC原始碼分析spring ioc 容器的載入流程

轉載自:https://blog.csdn.net/a724888/article/details/72716632 一:spring ioc 容器的載入流程 1.目標:熟練使用spring,並分析其原始碼,瞭解其中的思想。這篇主要介紹spring ioc 容器的載入2.前提條件:會使用de

Spring原始碼分析——AOP、DI、IOCIOC容器原理

面向切面程式設計(Aspect Oriented Programming):面向切面程式設計也可以稱為面向規則程式設計,其目的是為了將多個類中具有一定規律性的程式碼在開發時將其按一定規則拆分後各自獨立編

SpringBoot 原始碼解析 ----- Spring Boot精髓:啟動流程原始碼分析

本文從原始碼的角度來看看Spring Boot的啟動過程到底是怎麼樣的,為何以往紛繁複雜的配置到如今可以這麼簡便。 入口類 @SpringBootApplication public class HelloWorldMainApplication { public static void main

Spring原始碼解析——元件註冊2

    import com.ken.service.BookService; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.

Spring原始碼解析:obtainFreshBeanFactory

spring的ApplicationContext容器的初始化流程主要由AbstractApplicationContext類中的refresh方法實現。 而refresh()方法中獲取新工廠的主要是由obtainFreshBeanFactory()實現的,後續的操作均是beanFactoty的進一步處理。

Spring 詳解IOC 和DI

1 IOC 理解 Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。 IoC不是一種技術,只是一種思想,一個重要的面向物件程式設計的法則,它

Spring原始碼解析4IOC過程下

上文說到populateBean方法中,對被@Autowired註解的屬性方法進行注入。在這之後,BeanFactory執行applyPropertyValues方法,這個方法中,一個是把之前解析出來的屬性值設定到bean中去;一個是繼續解析出BeanDefinition中定

Spring原始碼分析4---BeanFactoryPostProcessor看見的不一定是真的

在第二編對BeanFactory的分析中,我們老能看見BeanFactoyPostProcessor的身影,那麼在這一節中,我們來詳細的討論一下BeanFactoryPostProcessor的程式碼結構,從中學習他的優秀之處;BeanFactoryPostProcessor