Spring
从概念态--->定义态的过程
1、实例化一个ApplicationContext的对象;
2:调用bean工厂后置处理器完成扫描;
3:循环解析扫描出来的类信息;
4、实例化一个BeanDefinition对象来存储解析出来的信息;
5、把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来,
以便后面实例化bean;
6、再次调用其他bean工厂后置处理器;
从定义态到纯净态
7:当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等
等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用
finishBeanFactoryInitialization方法来实例化单例的bean,实例化之前spring要做验证,
需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototype,是否
abstract等等;
8:如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实
例化对象是通过构造方法反射,故而需要知道用哪个构造方法;
9:推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说
的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean,
最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean;
从纯净态到成熟态
10:spring处理合并后的beanDefinition
11:判断是否需要完成属性注入
12:如果需要完成属性注入,则开始注入属性
初始化
13、判断bean的类型回调Aware接口
14、调用生命周期回调方法
15、如果需要代理则完成代理
创建完成
16、put到单例池——bean完成——存在Spring容器当中
SpringIOC流程图

Spring中非常非常多的扩展接口,当然你也不需要全部回答,可以挑重点回答:
1. 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
/***
- 作用: 在注册BeanDefinition的可以对beanFactory进行扩展 后
- 调用时机: Ioc加载时注册BeanDefinition 的时候会调用
*/
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
2.执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法:
/***
*作用:动态注册BeanDefinition
* 调用时机: Ioc加载时注册BeanDefinition 的时候会调用
*/ 6 @Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
RootBeanDefinition beanDefinition = new RootBeanDefinition(Car.class);
registry.registerBeanDefinition("car",beanDefinition);
}
3. 加载BeanPostProcessor实现类 : 在Bean的生命周期会调用9次Bean的后置处理器
4. 创建所有单例bean
初始化阶段:
5. 初始化阶段调用XXXAware接口的SetXXXAware方法 :
生命周期回调: 初始化、销毁
6. 执行BeanPostProcessor实现类的postProcessBeforeInitialization方法
7. 执行InitializingBean实现类的afterPropertiesSet方法
8. 执行bean的init-method属性指定的初始化方法
9. 执行BeanPostProcessor实现类的postProcessAfterInitialization方法
10. 初始化完成
11. 关闭容器,执行DiposibleBean实现类的destory
12. 执行bean的destroy-method属性指定的初始化方法

浙公网安备 33010602011771号