1. 元数据配置阶段
- Bean Definition的加载包括三类
- XmlBeanDefinitionReader
- PropertiesBeanDefinitionReader
- AnnotatedBeanDefinitionReader
getBean(id)
- 初始化BeanDefinition执行合并:getMergedBeanDefinition方法
- BeanDefinition常见的有两种:在BeanDefinitionBuilder里面可以看到对应的创建方法
- RootBeanDefinitionBean 无parent 设置parent会报错
- GenericBeanDefinitionBean 普通的BeanDefinition
- 初始化的时候都会为GenericBeanDefinition,但是如果没有parentBean 经过mergedBeanDefinition 就会变成RootBeanDefinition。
- 如果他有parentBean,会把parentBean 的beanDefinition复制一份,然后进行合并BeanDefinition,子的去覆盖父类一定定义的properties。变成RootBeanDefinition
createBean
- BeanDefinition加载:doResolveBeanClass(mbd,typeToMatch) 第二个参数是指定类型去匹配
- 里面回去调用AbstractBeanDefinition里面的resolveBeanClass(ClassLoader) 通过ClassLoader把Bean的Class<?> 获取返回。
以上是从BeanDefinition变成Class的Bean类加载过程,随后就是实例化过程
- 实例化前的一个非主流生命周期回调:
- resolveBeforeInstantiation回去调用下面的接口方法返回非空就会执行
- InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(beanClass, beanName)
- 继承至自BeanPostProcessor的子接口
- 可以根据beanClass和beanName去return一个Bean去替代BeanDefinition所描述的对象。
doCreateBean(beanName, rootBeanDefinition, args) args是可空的,支持有参和无参构造。
- 实例化
- 传统实例化方式:
- 实例化策略:InstantiationStrategy
- 构造器注入
先回经过一个决定使用哪个构造器来Instantiate对象,通常返回空,这个是个拓展点需要实现
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstrcutors(beanClass, beanName)
调createBeanInstance
—> if preferedConstructors || autowire_constructor || hasConstructorArgs || args != null
return autowireConstructor(beanName, mbd, ctors, null )构造器注入的方式
—>return instantiateBean(beanName, mbd) 无参构造器的方式
根据策略创建对象包装成一个BeanWrapper
- CglibSubclassingInstantiationStrategy生成一个子类实现
- 默认用SimpleInstantiationStrategy 会使用构造器创建
- 如果用的是无参构造所有的对象属性全为空
2. SpringBean的初始化
parent Class Construct > Current Class Construct > postConstruct > afterPropertiesSet > initMethod
- Bean的初始化调用过程:
- @PostConstruct标注的方法 在BeforeInitialization中执行 (需要CommonAnnotationBeanPostProcessor支持)
- 实现InitializingBean接口的afterPropertiesSet()方法
- 自定义初始化方法(initMethod)
- SpringBean初始化中:initialize
- SpringBean初始化后 postProcessAfterInitialization
- SpringBean初始化完成:
- Spring4.1+: SmartInitializingSingletton#afterSingletonsInstantiated()直接启动BeanFactory不会被回调,需要被显示执行,是在DefaultListableBeanFactory中的preInstantiateSingletons中执行的。
3. SpringBean销毁