Spring中的Bean代表被Spring IOC容器管理的对象。IOC容器通过配置文件的Bean标签或者注解,创建Bean对象并管理其生命周期。
Spring Bean的生命周期是指从 Bean 实例化,即通过反射创建出对象之后,到成为一个完整对 象,最终存 储到单例池中的过程。 大体上分为三个阶段:
第一阶段:Bean的实例化阶段。Spring框架会取出BeanDefinition的信息,判断当前Bean的范围是否是singleton, 是否延迟加载,是否FactoryBean等,最终将一个普通singleton的Bean通过反射进行实例化;
第二阶段:Bean的初始化阶段。Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware 接口方法、BeanPostProcessor方法、InitializingBean接口的初始化方法、执行自定义初始化init方法等。
第三阶段:Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池singletonObjects中,即完成了Spring Bean的整个生命周期。
下面分别介绍实例化与初始化阶段的具体流程:
Bean的实例化:
加载xml配置文件,解析获取配置中的每个的信息,封装成一个个的BeanDefinition对象;
2.将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中;
3.执行Bean工厂后处理器BeanFactoryPostProcessor,目的是动态注册BeanDefinition,动态修改BeanDefinition,以及动态修改Bean;
4.ApplicationContext底层遍历beanDefinitionMap,创建Bean实例对象;
5.创建好的Bean实例对象,被存储到一个名为singletonObjects的Map<String,Object>中;
当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例并返回。
Bean的初始化:
1.Bean实例的属性注入,有以下几种情况:1.注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去; 2.注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没 有引用对象,则先创建被注入对象Bean实例(完成整个生命周期)后,再进行注入操作;3.注入双向对象引用属性时,涉及到循环引用(循环依赖),通过三级缓存解决;
2.Aware接口属性注入:Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源。通过该接口,可以对spring相应资源进行操作。例如ApplicationContextAware、BeanNameAware;
3.调用后处理器BeanPostProcessor的postProcessBeforeInitialization()方法;
4.调用InitializingBean接口的初始化方法afterPropertiesSet();
5.调用自定义初始化方法init();
6.调用后处理器BeanPostProcessor的postProcessAfterInitialization()方法;
Bean后处理器类似于Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor,会在流程节点上被Spring自动调用,以实现对Bean的动态修改。
经过实例化与初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池singletonObjects中,即完成了Spring Bean的整个生命周期,Bean可以正常使用及销毁。