Spring bean的加载

Spring 通过反射来实例化Bean


bean的加载流程:

  1. 转化对应的beanName:去除对FactoryBean的修饰符(去除“&”)

  2. 尝试从缓存中加载单例(map中)

  3. bean的实例化(之前获取到的bean是最原始的bean状态;如果bean继承FactroyBean,需要返回的并不是这个类对象,而是getObject()中的实例。ps:如果真的是想获取到工厂,那么传入的beanName前应该添加“&”)

  4. 寻找依赖(在初始化一个bean时,首先会初始化这个bean所对应的依赖)

    1. 循环依赖:两个或多个bean相互持有对方
    2. spring解决循环依赖(只有单例才有可能解决循环依赖):
      1. 构造器注入的循环依赖:抛出异常(BeanCurrentlyInCreatioinException)
      2. setter注入的循环依赖:通过提前暴露单例工厂从而使其他bean能引用到该bean
      3. 非单例的循环依赖:spring无法支持,抛出异常(BeanCurrentlyInCreatioinException)
  5. 针对不同scope进行bean的创建: image

    1. 创建一个对象
    2. 如果是单例,暴露objectFactory
    3. 属性填充
    4. 是否实现Aware(获取相应的资源)
    5. BeanPostProcessor前置处理(后两条是对单个bean进行的处理,此部可以处理所有的bean)
    6. 是否实现InitializingBean,调用afterPropertiesSet方法
    7. 是否配置init-method
    8. BeanPostProcessor后置处理
    9. 是否实现DisposableBean
    10. 是否配置destroy-method
      文章为参考:《Spring源码深度解析》、http://www.cnblogs.com/xrq730/p/5721366.html  后的自我总结。不对之处,望不吝赐教!
原文地址:https://www.cnblogs.com/dengding/p/7390531.html