@Bean
@Import
MyImportSelector implements ImportSelector
MyImportBeanDefinitionRegistarimplements ImportBeanDefinitionRegistrar
FactoryBean
这里着重讲解FactoryBean
如何判断当前bean是否是FactoryBean
org.springframework.beans.factory.support.AbstractBeanFactory#isFactoryBean(java.lang.String)
org.springframework.beans.factory.support.AbstractBeanFactory#isFactoryBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition)
查看mbd中的属性即可。
手动拼接一个&走生命周期
注意上图doGetBean的时候会把beanname里面的&去掉,包括多个&的beanname也会把多个&去掉。
如果该bean是factorybean的话,那么第一次加上&的话走了生命周期,单例池就会有该bean,如果是SmartFactoryBean的话第二次执行就会走下面标红的代码来处理getObject逻辑。
看下如何处理?
org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance
先去缓存中拿:由于是factorybean是不会变动的,所以放入缓存提高查询效率
缓存中第一次肯定拿不到,继续执行标红代码
org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean
放入缓存。