IOC容器的初始化
ioc容器本质上是一个beanDefinitionMap,注册即将BeanDefinition put到map中。
- 初始化的入口在容器实现中的refresh()调用来完成
- loadBeanDefinition实现对bean定义载入ioc容器:
- 通过ResourceLoader来完成资源文件的定位,可以从类路径,文件系统,url等方式来定位资源位置。
- 通过BeanDefinitionReader来完成定义信息的解析和Bean信息的的注册,从而得到bean的定义信息BeanDefinition。
- BeanDefinitionRegistry实现将BeanDefinition保存在beanDefinitionMap中。
- 通过BeanFactory(Bean容器) 和 ApplicationContext(应用容器)两个容器享受Spring Ioc的服务。
Bean的实例化
- 解析bean的真正name,如果bean是工厂类,name前缀会加&,需要去掉
- 无参单例先从缓存中尝试获取
- 如果bean实例还在创建中,则直接抛出异常
- 如果bean definition 存在于父的bean工厂中,委派给父Bean工厂获取
- 标记这个beanName的实例正在创建
- 确保它的依赖也被初始化
- 真正创建
- 单例时
- 原型时
- 根据bean的scope创建
Spring Bean的生命周期
中文简单表述:
- BeanFactoryPostProcessor的处理方法
- InstantiationAwareBeanPostProcessor的postProcessBeforeInitialzation
- bean的实例化(构造函数)
- 属性值注入(setter)
- InstantiationAwareBeanPostProcessor的后置方法
- 执行一系列Aware接口的方法
- BeanPostProcessor前置处理(Spring Aop)
- 执行InitializingBean接口的afterPropertiesSet方法或者@PostConstruct注解方法
- Bean自定义的init方法
- BeanPostProcessor后置处理
- 如果Bean实现了DisposableBean接口,执行destroy()方法或者@PreDestroy注解方法
- Bean自定义的destroy方法
三级缓存和循环依赖
Spring只是解决了单例模式下属性依赖的循环问题
一级缓存singletonObjects(初始化完备的Bean) 二级缓存earlySingletonObjects(还没进行属性注入,由三级缓存放进来) 三级缓存singletonFactories(value是一个对象工厂)
- 三级缓存是一个对象工厂,他可以拿到代理对象(考虑Aop)
- 二级缓存是考虑性能,不需要一直去工厂里面获取