AbstractAutowireCapableBeanFactory
类的doCreateBean
方法是创建Bean的开始,我们可以将关键代码的调用过程使用如下伪代码表述出来
createBeanInstance(beanName, mbd, args);//创建Bean实例化
populateBean(beanName, mbd, instanceWrapper); // 给bean进行属性赋值
initializeBean(beanName, exposedObject, mbd)
{
invokeAwareMethods(beanName,bean);
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd); // 执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
//scope
registerDisposableBeanIfNecessary(beanName, bean, mbd);//销毁bean
//至此,整个bean的初始化过程就结束了。
Bean生命周期具体过程如下:
- 实例化接口InstantiationAwareBeanPostProcessor :
- 调用者通过
getBean(beanName)
请求某一个Bean - 实例化Before:如果容器注册了
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
接口,则在实例化Bean 之前,将调用 postProcessBeforeInstantiation()方法。根据配置情况调用Bean构造函数 或工厂方法实例化Bean - 实例化After:如果容器注册了
InstantiationAwareBeanPostProcessor
接口,那么在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的Bean 进行一些操作
- 调用者通过
- populateBean设置对象属性:
InstantiationAwareBeanPostProcessor
接口继续执行postProcessProperties
/postProcessPropertyValues
两个方法。- 如果Bean配置了属性信息
BeanDefinition
那么容器在这一步着手将配置值设置到Bean 对应的属性中去。postProcessPropertyValues
已经废弃,推荐使用postProcessProperties
方法 - @Autowired属性填充:Spring对属性Bean进行依赖注入;如果Bean的属性有使用@Autowired注入的属性,则会进行属性填充。前提是要保证属性实例已经存在于Spring容器当中
- 如果Bean配置了属性信息
- 初始化接口BeanPostProcessor
invokeAwareMethod
方法:使用了Spring Aware 你的Bean将会和Spring框架耦合,Spring Aware 的目的是为了让Bean获取Spring容器的服务。- 如果Bean 实现了 BeanNameAware 接口 则将调用 setBeanName 接口方法,将配置文件中该Bean 的对应名称设置到Bean 中去
- 实现BeanClassLoaderAware接口,调用setBeanClassLoader方法
- 如果Bean 实现了 BeanFactoryAware 接口 则将调用 setBeanFactory 接口方法,将BeanFactory容器实例设置到Bean 中去,将BeanFactory实例传进来;
- 如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
- 其他的Aware:
- MessageSourceAware:获得message source,这也可以获得文本信息
- applicationEventPulisherAware:应用事件发布器,可以发布事件,
- ResourceLoaderAware: 获得资源加载器,可以获得外部资源文件的内容;
- 初始化Before:如果BeanFactory 装配了 org.springframework.beans.factory.config.BeanPostProcessor 后处理 ,则将调用
postProcessBeforeInitialization(Object bean, String beanName)
方法 对Bean 进行加工操作,其中,入参Bean 是当前操作的Bean,而BeanName 是当前 Bean 的 配置名,返回对象加工后的Bean。 - 如果Bean实现了 InitializingBean 接口,则将调用接口的afterPropertiesSet 方法。类似的如果在applicationContext 配置文件中通过init-method属性指定了初始化方法,则将执行指定的初始化方法
- 初始化After:如果BeanFactory 装配了 org.springframework.beans.factory.config.BeanPostProcessor 后处理 ,则将调用
postProcessAfterInitialization(Object bean, String beanName)
方法 这个方法在此时调用,容器再次获得了对Bean 的加工机会。此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
- @Scope:如果在
中指定了作用范围 - scope = “prototype” 则将Bean返回给调用者, 由调用者管理Bean 的生命周期,此时Bean是多实例的,多实例Bean在使用getBean获取的时候才创建对象
- 如果 scope = “singleton” ,则将Bean放入 IOC容器的缓存池中,由Spring管理Bean的生命周期,此时Bean都是单实例的,对于单实例Bean对象来说,在Spring容器创建完成后就会对单实例Bean进行实例化
- DisposableBean销毁接口:若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。