SpringBoot下Spring IOC容器的結構

運行環境:jdk8,springboot-2.2.2java

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

建立Spring IOC容器對象

問題:spring

  • 容器在哪裏建立?
  • 容器的運行時類型是什麼?
// 啓動類
@SpringBootApplication
public class BootApplication {
    public static void main(String[] args) {
            SpringApplication.run(BootApplication.class);
    }
}
// 執行run方法時,建立Spring IOC容器。這裏只是建立了容器對象,容器還未執行refresh方法
context = createApplicationContext();

SpringBoot默認使用的容器類型是AnnotationConfigServletWebServerApplicationContextspringboot

Spring IOC容器結構分析

接下類分析下AnnotationConfigServletWebServerApplicationContextspring-boot

下圖的繼承關係比較「嚇人」,可是重點只有幾個 this

  • GenericApplicationContextcode

    這個類是AnnotationConfigServletWebServerApplicationContext的父類,GenericApplicationContext持有成員變量xml

    private final DefaultListableBeanFactory beanFactory;對象

    此成員變量的初始化是在調用GenericApplicationContext的無參構造器時執行的blog

    public GenericApplicationContext() {
        this.beanFactory = new DefaultListableBeanFactory();
    }
  • DefaultListableBeanFactory繼承

    這個類是建立和管理bean實例的bean工廠

持有成員變量

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

保存最初的BeanDefinition對象

其父類AbstractBeanFactory持有成員變量

private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);

保存最終的BeanDefinition對象,以後會調用其中的BeanDefinition對象做爲模板建立bean實例

​ 其父類DefaultSingletonBeanRegistry持有成員變量

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

​ 保存建立完成的單實例bean

​ 它還持有其餘成員變量保存其餘種類的bean實例

有了上述的繼承關係AnnotationConfigServletWebServerApplicationContext的對象將很是強大,這個對象將能夠建立BeanDefinition和bean實例,管理全部的BeanDefinition和bean實例

補充

DefaultListableBeanFactorybeanDefinitionMapAbstractBeanFactorymergedBeanDefinitions都保存了BeanDefinition對象,那麼建立bean實例時用誰作模板?

AbStractApplicationContext執行finishBeanFactoryInitialization(beanFactory)方法建立剩餘的全部非懶加載的單實例bean時

調用AbstractBeanFactorygetMergedBeanDefinition方法獲取BeanDefinition對象

會先調用抽象方法getBeanDefinition(由DefaultListableBeanFactory實現)

此方法會從DefaultListableBeanFactorybeanDefinitionMap中找BeanDefinition

找不到,拋異常;找到,對其加工,將其put到mergedBeanDefinitions

再從mergedBeanDefinitions中獲取並返回RootBeanDefinition

將其做爲模板建立bean實例

相關文章
相關標籤/搜索