一、spring整体生命周期实例化过程

 

java spring 初始化阶段 手动注入bean spring初始化bean过程_实例化

java spring 初始化阶段 手动注入bean spring初始化bean过程_实例化_02

结合图一图二总结步骤

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实例化过程 

 

java spring 初始化阶段 手动注入bean spring初始化bean过程_赋值_03

 

 

java spring 初始化阶段 手动注入bean spring初始化bean过程_生命周期_04

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的垃圾回收器机制来处理。