Spring获取bean的步骤

1 处理&问题
2 去chache里找
3 处理对象A依赖对象B的问题
4 生成bean
  4.1 处理方法注入 ------lookup-method
  4.2 如果类实现了InstantiationAwareBeanPostProcessor接口就调用其postProcessBeforeInstantiation,如果返回值不为null就调用postProcessAfterInitialization方法,如果还是不为null就返回,省略后面的doCreatBean方法(等于短路了后面),如果postProcessBeforeInstantiation返回的就是null,那就继续往下走,看doCreateBean
  4.3 doCreatBean
      4.3.1 处理工厂方法 factory-method
      4.3.2 允许Annotation修改bean 例如 @resource
      4.3.3 处理循环依赖
4.3.4 调用postProcessAfterInitialization方法,如果返回false,程序就直接返回 等于短路后续的操作
4.3.5 处理 @Autowire
4.3.6 属性注入 @resource
4.3.7 类型转换 调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法 其实就是将字符串转换为需要的对象如把 字符串"2015-12-12"转成date型的对象
      4.3.8 处理 XXAware接口的实现
      4.3.9 处理 postProcessBeforeInitialization
      4.3.10 处理 InitializingBean的afterPropertiesSet
      4.3.11 处理 custom Init方法
      4.3.12 处理 postProcessAfterInitialization

5 存入cache

6 容器关闭时,销毁对象(仅仅适用于Singleton对象)


其中,4.3.4-4.3.7是属性注入
4.3.4-4.3.12 都可作为bean的生命周期考虑

看一个网上流传甚广的bean生命周期图

Spring获取bean的步骤_第1张图片



////////////////////////////////////////////////////////////

以下为2016-04-20增加

其实getBean部分,主要可以分为3个部分

1-InstantiationAwareBeanPostProcessor 的短路与设值

2-XXXAware的处理

3-初始化BeanPostProcessor的Before与after,还有中间的init-method方法

而这三个部分都是BeanPostProcessor

InstantiationAwareBeanPostProcessor 实现了BeanPostProcess

对xxxaware的处理是借用的ApplicationContextAwareProcessor,它也实现了BeanPostProcess

以上为2016-04-20增加

////////////////////////////////////////////////////////////




参考资料
http://997004049-qq-com.iteye.com/blog/1729793
     

你可能感兴趣的:(spring)