IOC 容器概述

159 阅读2分钟

IOC 容器概述

rg.springframework.context.ApplicationContext接口代表Spring IoC容器,负责实例化、配置和完成bean。容器通过读取配置元数据来获得关于要实例化、配置和配置元数据以XML、Java注解或Java代码表示。它可以让你表达构成你的应用程序的对象以及这些对象之间丰富的相互依赖关系。

Spring 提供了一些ApplicationContext接口的实现。在独立的应用程序中,创建ClassPathXmlApplicationContextFileSystemXmlApplicationContext实例很常见。虽然 XML 一直定义配置元数据的传统格式式,但您可以通过提供少量的 XML 配置来指示容器使用 Java 注解或代码作为元数据格式,以声明性地启用对这些额外元数据格式的支持。

Spring工作方式的垂直视图。你的应用程序类与配置元数据相结合,这样,在被创建ApplicationContext和初始化后,你就有了一个个配置好的执行系统或应用程序

实例化容器 ApplicationContext

提供ApplicationContext构造函数的一条父母条路径是资源字符串,它让容器从各种外部资源(如本地文件系统、JavaCLASSPATH等)加载配置元数据。

ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);

AnnotationConfigApplicationContext 详解

  • 关系继承图

AnnotationConfigApplicationContext 实例化加载:

new AnnotatedBeanDefinitionReader(this): 注解Bean定义读取器

new ClassPathBeanDefinitionScanner(this): Bean路径扫描器

子类: GenericApplicationContext 实例加载:

new DefaultListableBeanFactory(): Bean Factory 加载

List beanFactoryPostProcessors

ApplicationEventMulticaster applicationEventMulticaster

监听器

Set<ApplicationListener<?>> applicationListeners

Set earlyApplicationEvents;

子类AbstractApplicationContext 实例加载


AnnotatedBeanDefinitionReader 注解Bean定义读取器

  • 注册注解配置处理器

  1. ConfigurationClassPostProcessor: Configuration 注解处理器
  2. AutowiredAnnotationBeanPostProcessor: @Autowired 自动注入处理器
  3. CommonAnnotationBeanPostProcessor: #Resource 注入处理器
  4. EventListenerMethodProcessor: 事件监听方法处理器
  5. DefaultEventListenerFactory: 默认事件监听 工厂

ClassPathBeanDefinitionScanner 注解Bean定义读取器

  • Component.class 注解类扫描加载

IOC 加载流程

new AnnotationConfigApplicationContext()

  1. AnnotationConfigApplicationContext 实例化

    1. new AnnotatedBeanDefinitionReader(this)
    2. new ClassPathBeanDefinitionScanner(this)
  2. register(componentClasses) 注册起始 配置类

    1. reader.register(componentClasses) AnnotatedBeanDefinitionReader.register()讲当前配置类注入到容器中( DefaultListableBeanFactory#Map<String, BeanDefinition> beanDefinitionMap)
  3. refresh() 刷新, 处理容器

    1. prepareBeanFactory(beanFactory);

    2. postProcessBeanFactory(beanFactory);

    3. invokeBeanFactoryPostProcessors(beanFactory);

      解释: Instantiate and invoke all registered BeanFactoryPostProcessor beans, respecting explicit order if given. Must be called before singleton instantiation.

      PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(): 调用BeanFactoryPostProcessors

    4. registerBeanPostProcessors(beanFactory);

      PostProcessorRegistrationDelegate.registerBeanPostProcessors() 注册Bean 后置处理器

    5. initMessageSource();

    6. initApplicationEventMulticaster();

      初始化事件多播器: Initialize the ApplicationEventMulticaster. Uses SimpleApplicationEventMulticaster if none defined in the context.

    7. onRefresh();

    8. registerListeners();

      1. 注册监听器
    9. finishBeanFactoryInitialization(beanFactory);

      1. 处理剩余 Bean
    10. finishRefresh();

加载流程介绍

  • StartMain 启动类
public class StartMain {
  public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext
        = new AnnotationConfigApplicationContext(MainConfig.class);

    Object mainConfig = applicationContext.getBean("mainConfig");
    System.out.println(mainConfig);
  }
}
  • MainConfig 配置类
@Configuration
@ComponentScan("org.springframework.han.bean")
public class MainConfig {
  @Bean
  public School school(){
    return new School();
  }
}
  • 目录基础结构