FactoryBean的创建流程
2023-02-18 21:22:24 0 举报
FactoryBean的创建流程
作者其他创作
大纲/内容
去掉FACTORY_BEAN_PREFIX
getBean(FACTORY_BEAN_PREFIX + beanName)
Class#isAssignableFrom()方法
如果是单例的情况,则将调用getObject()方法得到的对象缓存在FactoryBeanRegistrySupport.factoryBeanObjectCache中
返回去掉了FACTORY_BEAN_PREFIX的beanName
从单例池中去获取
isFactoryBean(beanName)
factoryBeanObjectCache:key:Xxxvalue:FactoryBean#getObject()方法返回的对象
得到name对应的唯一标识名称
如果是FactoryBean
将创建的Bean放入单例池,key:Xxxvalue:FactoryBean实例
如果是FactoryBean,一般情况下则只创建了FactoryBean,并放入单例池中,并没有调用FactoryBean#getObject()方法
name是&Xxx,sharedInstance如果是NullBean,则直接返回。sharedInstance如果不是FactoryBean,则抛异常。
org.springframework.beans.factory.support.AbstractBeanFactory#isFactoryBean(String)方法详解作用:判断是否为FactoryBean
getSingleton(beanName)
如果未获取到Bean
创建FactoryBean的流程
这一段属于创建FactoryBean的过程
从org.springframework.beans.factory.support.FactoryBeanRegistrySupport.factoryBeanObjectCache中去找
缓存对应关系,key:FACTORY_BEAN_PREFIX + beanNamevalue:beanName
创建Bean
从单例池中去获取Bean
transformedBeanName(name)
getBean(beanName)
如果是getBean(FACTORY_BEAN_PREFIX + beanName),则这一步就返回了,返回的是一个FactoryBean,并没有调用FactoryBean#getObject方法
FactoryBean是否为当前类的类型或者为当前类的父类
name:&XxxbeanName:XxxsharedInstance:从单例池中获取的Bean
String beanName = transformedBeanName(name)
name:&XxxbeanName:XxxsharedInstance:从单例池中获取的Bean
调用FactoryBean的getObject()方法
getBean(FACTORY_BEAN_PREFIX + beanName)
如果sharedInstance不是FactoryBean或者name是以&开头的,则直接返回
如果获取到的FactoryBean是SmartFactoryBean&& SmartFactoryBean#isEagerInit方法返回true
如果有,直接返回
如果当前容器中没有beanName对应的BeanDefinition&& 当前容器的父容器是ConfigurableBeanFactory的实例,则递归地在父容器中查找并判断是否为FactoryBean
如果获取到了Bean
如果获取到了Bean,则直接判断获取到的Bean是否为FactoryBean的实例,如果是,则返回true,不是,则返回false。
0 条评论
下一页