IoC源码

发布时间 2023-12-20 00:30:27作者: 梅丹隆

主心骨:

  • 解析配置
  • 定位与注册对象
  • 注入对象

一、Bean与BeanDefinition

1、全局掌握核心接口和类

解决了关键问题:
将对象之间的关系转而用配置来管理

  • 依赖注入:依赖关系在Spring的IoC容器中管理
  • 通过把对象包装在Bean中以达到管理对象和进行额外操作的目的

Bean是Spring的一等公民

  • Bean的本质是java对象,只是这个对象的生命周期有容器来管理
  • 不需要为了创建Bean而在与阿莱的java泪上添加任何额外的限制
  • 对java对象的控制方式体现在配置上

2、Bean的定义

根据配置,生成用来描述Bean的BeanDefinition,常用属性:

  • 作用范围scope(@Scope)
  • 懒加载lazy-init(@Lazy):决定Bean实例是否延迟加载
  • 首选promary(@Primary):设置为true的Bean会是优先的实现类
  • factory-bean和factory-method(@Configuration和@Bean)

3、容器初始化主要做的事情

image.png

  • 解析配置
  • 定位与注册对象

4、BeanDefinition家族成员

image.png

  • RootBeanDefinition:不能为其他BeanDefinition的子类,否则设置parentName时会报异常
  • GenericBeanDefinition:替代RootBeanDefinition,完全替代ChildBeanDefinition

5、简单容器

image.png

5.1、BeanFactory和FactoryBean的区别

BeanFactory

  • 获取FactoryBean实例
  • IOC根接口
  • 定义了如何从缓存中获取Bean实例
  • applicationContext.getBean中参数beanName前加“&”获取的是FactoryBean实例,不加“&”获取的是FactoryBean.getObject()生成的bean实例 --> FACTORY_BEAN_PREFIX

FactoryBean:

  • 生成普通的Bean的
  • Spring会根据实现FactoryBean接口的Bean实现的getObject方法,生成Bean

5.2、二级接口

5.2.1、ListableBeanFactory

  • 以列表形式提供Bean的相关信息
  • 批量列出工厂生产实例的信息

5.2.2、HierarhicalBeanFacory

  • 允许BeanFactory进行工厂分层

5.2.3、AutowireCapableBeanFactory

  • 赋予容器自动装配Bean的能力
    :::warning
    组建扫描:
    自动发现应用容器中需要创建的Bean
    自动装配:
    自动满足Bean之间的依赖
    :::

5.2.4、ConfigurableBeanFactory

  • 设置父容器
  • 设置容器的类加载器
  • 属性编辑器
  • 容器通用bean后置处理器
  • 实现singletonBeanRegistry - 提供运行期间向容器注册单例Bean的能力

5.2.5、ConfigurableListableBeanFactory

  • 整合二级接口
  • 忽略自动装配等方法

5.2.6、AbstractAutowireCapableBeanFactory

  • 实现AutowireCapableBeanFactory

5.2.7、DefaultListableBeanFactory

  • 独立运行的IoC容器
  • 实现BeanDefinitionRegistry
  • 包含beanDefinitionMap - 存储容器里所有已经注册过的BeanDefinition实例的载体

6、复杂(高级)容器(上下文)

image.png

6.1、ApplicationContext常用容器

传统的基于XML配置的经典容器:

  • FileSystemXmlApplicationContext:从文件系统加载配置
  • ClassPathXmlApplicaionContext:从classpath加载配置
  • XmlWebApplicationContext:用于Web应用程序的容器

目前比较流行的基于注解的容器:

  • AnnotationConfigServletWebServerApplicationContext:boot模块下
  • AnnotationConfigReactiveWebServerApplicationContext:响应式容器,boot模块下
  • AnnotationConfigApplicationContext:web应用常使用

容器的共性:

  • refresh()大致相同

模版方法模式:
image.png

7、Resource、ResourceLoader和容器之间的关系

image.png

7.1、根据资源自制自动选择正确的Resource

强大的加载资源的方式:

  • 自动识别“classpath:”、“file:”等资源地址前缀
  • 支持自动解析Ant风格带通配符的资源地址
    • Ant:路径匹配表达式,用来对URI进行匹配
      • ? 匹配任何单字符
        • 匹配0或任意数量的字符
      • ** 匹配0或更多的目录
      • image.png

7.2、ResourceLoader

实现不同的Resource加载策略,按需返回特定类型的Resource
image.png

7.3、BeanDefinitionReader

资源加在利器使用者

  • 读取BeanDefinition
  • BeanDefinitionRegistry

image.png

7.3.1、学习过程关键词

  • location
  • Resource
  • ResourceLoader
  • BeanDefinitionReader
  • BeanDefinitionRegistry
  • DefaultListableBeanFactory

7.4、BeanDefinition

8、容器初始化

8.1、后置处理器PostProcessor

本身也是一种需要注册到容器里的Bean

  • 其里面的方法会在特定的时机被容器调用
  • 实现不改变容器或者Bean核心逻辑的情况下对Bean进行扩展
  • 对Bean进行包装、影响其行为、修改Bean的内容等

大类分为容器级别的后置处理器以及Bean级别的后置处理器

  • BeanDefinitionRegistryPostProcessor
  • BeanFactoryPostProcessor
  • BeanPostProcessor
    • postProcessorBeforeInitialization
    • postProcessorAfterInitialization

8.2、Aware及其子接口

Aware(可感知的):

  • 从Bean里获取到容器实例并对其进行操作