Spring框架-Spring Ioc实现原理

184 阅读2分钟

Spring.png

IOC容器的初始化

ioc容器本质上是一个beanDefinitionMap,注册即将BeanDefinition put到map中。

  • 初始化的入口在容器实现中的refresh()调用来完成
  • loadBeanDefinition实现对bean定义载入ioc容器:
  1. 通过ResourceLoader来完成资源文件的定位,可以从类路径,文件系统,url等方式来定位资源位置。
  2. 通过BeanDefinitionReader来完成定义信息的解析和Bean信息的的注册,从而得到bean的定义信息BeanDefinition。
  3. BeanDefinitionRegistry实现将BeanDefinition保存在beanDefinitionMap中。
  • 通过BeanFactory(Bean容器) 和 ApplicationContext(应用容器)两个容器享受Spring Ioc的服务。

Bean的实例化

  • 解析bean的真正name,如果bean是工厂类,name前缀会加&,需要去掉
  • 无参单例先从缓存中尝试获取
  • 如果bean实例还在创建中,则直接抛出异常
  • 如果bean definition 存在于父的bean工厂中,委派给父Bean工厂获取
  • 标记这个beanName的实例正在创建
  • 确保它的依赖也被初始化
  • 真正创建
    • 单例时
    • 原型时
    • 根据bean的scope创建

Spring Bean的生命周期

image.png 中文简单表述:

  1. BeanFactoryPostProcessor的处理方法
  2. InstantiationAwareBeanPostProcessor的postProcessBeforeInitialzation
  3. bean的实例化(构造函数)
  4. 属性值注入(setter)
  5. InstantiationAwareBeanPostProcessor的后置方法
  6. 执行一系列Aware接口的方法
  7. BeanPostProcessor前置处理(Spring Aop)
  8. 执行InitializingBean接口的afterPropertiesSet方法或者@PostConstruct注解方法
  9. Bean自定义的init方法
  10. BeanPostProcessor后置处理
  11. 如果Bean实现了DisposableBean接口,执行destroy()方法或者@PreDestroy注解方法
  12. Bean自定义的destroy方法

三级缓存和循环依赖

Spring只是解决了单例模式下属性依赖的循环问题

一级缓存singletonObjects(初始化完备的Bean) 二级缓存earlySingletonObjects(还没进行属性注入,由三级缓存放进来) 三级缓存singletonFactories(value是一个对象工厂)

  1. 三级缓存是一个对象工厂,他可以拿到代理对象(考虑Aop)
  2. 二级缓存是考虑性能,不需要一直去工厂里面获取