spring中产生bean的几种方式

  1. @Bean

  1. @Import

  1. MyImportSelector implements ImportSelector

  1. MyImportBeanDefinitionRegistarimplements ImportBeanDefinitionRegistrar

  1. FactoryBean

这里着重讲解FactoryBean

spring中产生bean的几种方式_第1张图片

如何判断当前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)

spring中产生bean的几种方式_第2张图片

查看mbd中的属性即可。

手动拼接一个&走生命周期

spring中产生bean的几种方式_第3张图片

注意上图doGetBean的时候会把beanname里面的&去掉,包括多个&的beanname也会把多个&去掉。

如果该bean是factorybean的话,那么第一次加上&的话走了生命周期,单例池就会有该bean,如果是SmartFactoryBean的话第二次执行就会走下面标红的代码来处理getObject逻辑。

spring中产生bean的几种方式_第4张图片

看下如何处理?

org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance

先去缓存中拿:由于是factorybean是不会变动的,所以放入缓存提高查询效率

缓存中第一次肯定拿不到,继续执行标红代码

spring中产生bean的几种方式_第5张图片

org.springframework.beans.factory.support.FactoryBeanRegistrySupport#doGetObjectFromFactoryBean

spring中产生bean的几种方式_第6张图片

放入缓存。

spring中产生bean的几种方式_第7张图片

你可能感兴趣的:(spring)