Spring-4-IoC依赖注入

调用流程

  • 预实例化,或者手动getBean,都会进入下述流程
  • AbstractBeanFactory.getBean(String name)
  • AbstractBeanFactory.doGetBean(final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)
    • 先看cache:Object sharedInstance = getSingleton(beanName),第一次嘛,自然是null
    • 在parent存在,并且自己的beanDefinitionMap不含该beanName时,才让parent来getBean
    • 把beanName塞进Set alreadyCreated
  • 根据beanName拿到RootBeanDefinition
    • RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName),这里也有一个缓存
  • 利用RootBeanDefinition拿到依赖数组
    • String[] dependsOn = mbd.getDependsOn()
    • 这个和属性注入无关,查看@DependsOn
  • 根据单例,prototype,自定义scope进行处理
  • 利用反射,通过无参构造函数实例化
  • populateBean
    • 属性注入
  • initializeBean

问答

如何保证单例

  • DefaultSingletonBeanRegistry.getSingleton方法中,以singletonObjects作为同步块,并有double check

实例化时什么情况会用cglib

你可能感兴趣的:(Spring-4-IoC依赖注入)