一、spring整体生命周期实例化过程
结合图一图二总结步骤
1、解析xml文件/注解/配置类等,生成environment对象
2.通过BeanDefinitionReader读取加载出bean定义信息,然后存放BeanDefinitionRegistry里,(BeanDefinition 包含是不是单例对象 init-method 销毁方法等属性)
3、创建beanFactory工厂,Spring容器创建BeanFactoryPostProcessorI
4、调用BeanFactoryPostProcessor的postProcessBeanFactory方法(创建工厂需要做的一些前置处理)
5、beanFactory扫描BeanDefinitionRegistry拿出来所有的BeanDefinition 并把实现了PropertyEditor的Bean注册到属性编辑器注册表里
6、注册监听器
7、beanFactory工厂创建/注册BeanPostProcessor实例,对bean实例化前做一些加工(通过反射创建bean对象 实例之前有一些前置操作 属性赋值 以及实例化之后的后置操作等等)
8、调用InstantiationStrategy进行对bean的实例化工作(InstantiationStrategy实例化对象相当于代码中的new 所以没有属性赋值)
9、实例化之后使用BeanWapper对bean进行封装,(beanWapper从BeanDefinitionRegistry获取BeanDefinition,然后获取BeanDefinition中的PropertyValue属性,使用属性编辑器对PropertyValue进行转换得到属性值,在通过反射机制完成bean属性赋值)
属性编辑器-吧字面值转换int/double等类型
10、利用容器中注册BeanPostProcessor实例对实例化后的对象进行加工
问题:
1.beanFactory和FactoryBean区别/用过FactoryBean做过哪些事
答:都是用来生产对象的 beanFactory创建的对象都是基于一个模板(也就是标准对象),但某些时候需要一些特定条件的对象就可以在FactoryBean的getObject按照自己的需要 做一些独特的玩法
二、bean实例化过程
1、在需要创建其他Bean实例的时候创建其他Bean
2、调用Bean的构造方法
3、调用Bean的setter方法为Bean属性赋值
4、如果 bean 实现了 BeanNameAware 接口,Spring 将 bean 的 ID 传递给 setBeanName()方法
5、如果 bean 实现了 BeanFactoryAware 接口,Spring 将调用 setBeanFactory()方法,将 BeanFactory 容器实例传入;
6、如果 bean 实现了 ApplicationContextAware 接口,Spring 将调用 setApplicationContext()方法,将 bean 所在的应用上下文的引用传入进来
7、如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessBeforeInitialization()方法;
8、如果 bean 实现了 InitializingBean 接口,Spring 将调用它们的 afterPropertiesSet()方法。类似地,如果 bean 使用 initmethod 声明了初始化方法,该方法也会被调用;
9、如果 bean 实现了 BeanPostProcessor 接口,Spring 将调用它们的 postProcessAfterInitialization()方法
10、此时,bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
11、如果 bean 实现了 DisposableBean 接口,Spring 将调用它的 destory() 接口方法。同样,如果 bean 使用 destroymethod 声明了销毁方法,该方法也会被调用
四. bean的作用范围和生命周期
①. 单例对象: scope="singleton"一个应用只有一一个对象的实例。它的作用范围就是整个引用。
生命周期:
- 对象出生:当应用加载,创建容器时,对象就被创建了。
- 对象活着:只要容器在,对象-直活着。
- 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
②. 多例对象: scope="prototype"每次访问对象时,都会重新创建对象实例。生命周期:
- 每次访问对象时,都会重新创建对象实例。
- 对象活着:只要对象在使用中,就一直活着。
- 对象死亡:由java的垃圾回收器机制来处理。