Java Bean获取流程

Interface TypeConverter,Class AbstractBeanFactory

   1.方法doGetBean(final String beanName, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly)

     (1).转换对应的BeanName transformedBeanName(String name)

        去除FactoryBean 的修饰符"&"

        取指定alias所表示的最终beanName为最终指向Bean

     (2).尝试从缓存中加载单例,Object getSingleton(beanName) 检查缓存中对应的已经加载的Bean 返回Object sharedInstance,首先从singletonObjects,没有再从earlySingletonObjects,最后从singletonFactories

        singletonObjects 保存beanName和创建bean实例之间关系

        singletonFactories 保存beanName 和创建bean 工厂之间关系

        earlySingletonObjects 保存BeanName 和创建bean 实例之间的关系,与singletonObjects 的不同之处在于,当一个单例bean 被放到这里面后,那么当bean 还在创建过程中,就可以通过getBean 方法获取到了,其目的是用来检测循环引用。           

        registeredSingletons  保存当前所有巳注册的bean 。

    (3).bean的实例化 (sharedInstance != null && args == null)为true,执行Object getObjectForBeanInstance(Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd)   返回对应的实例,有时候存在诸如BeanFactory的情况并不是直接返回实例本身而是返回指定方法返回的实例

     (4).原型模式的依赖检查,boolean isSingletonCurrentlyInCreation(beanName) 只有在单例情况下才会尝试解决循环依赖,例如:A有B的属性,B中有A的属性,那么当依赖注入的时候,就会产生当A 还未创建完的时候因为对于B 的创建再次返回创建A,造成循环依赖。

     (5).检测 parentBeanFactory (parentBeanFactory != null && !containsBeanDefinition(beanName)) 如果当前不存在beanName,调用方法parentBeanFactory.getBean去父类工厂中寻找,父类工厂通常为空

     (6).将存储XML 配置文件的GernericBeanDefinition 转换为RootBeanDefinition  RootBeanDefinition getMergedLocalBeanDefinition(String beanName),如指定BeanName是子Bean的话,同时会合并父类的相关属性Text

     (7).寻找依赖在Spring的加载顺序中,在初始化某一个bean的时候首先会初始化这个bean 所对应的依赖。获取String[] dependsOn = mbd.getDependsOn(),初始化registerDependentBean(dep, beanName)

     (8).针对不同的scope 进行bean 的创建,根据bean的属性(singleton.prototype.scope.request进行实例化)默认singleton,Spring 会根据不同的配置进行不同的初始化策略。

     (9).类型转换 ,通常对该方法的调用参数requiredType是为空的,如果指定的需求类型不为空需要进行类型转换,否则直接强制转换,T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType)

猜你喜欢

转载自blog.csdn.net/qq_37080232/article/details/87857207
今日推荐