/** List of bean definition names, in registration order */ List<String> beanDefinitionNames /** Map from bean name to merged RootBeanDefinition */ Map<String, RootBeanDefinition> mergedBeanDefinitions
/** 保存单例对象: bean名 --> bean实例 */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
Tags:(BeanFactory具体对应的子类是DefaultListableBeanFactory)segmentfault
没有则缓存
参考百度脑图: [调用beanFactory.getBean获取/建立实例]节点3d
在上下文刷新时AbstractApplicationContext#refreshcode
// 执行彻底部的BeanFactory后置处理 // ConfigurationClassPostProcessor会加载工程下的class到BeanDefinition // 注册Bean后置处理器 // 根据BeanDefinition实例化全部单例Bean. finishBeanFactoryInitialization(beanFactory);
getBean方法经过Bean后置处理器AutowiredAnnotationBeanPostProcessor注入依赖, 该后置处理器又将调用getBean获取依赖Bean, 例若有以下代码:对象
@Service public class ServiceA { @Autowired ServiceB serviceB; } @Service public class ServiceB { @Autowired ServiceA serviceA; }
BeanFactory会将建立中的bean名保存到singletonsCurrentlyInCreation, 建立中的bean实例保存到singletonFactories。token
被依赖的Bean会先完成初始化
参考图片连接: Spring循环引用逻辑结构图图片
DefaultSingletonBeanRegistry对象的singletonObjects字段, 这里注册的都是依赖已经注入, 且执行完Bean后置处理器的实例ip
/** Cache of singleton objects: bean name --> bean instance */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
BeanCreationException: Circular depends-on relationship between
循环依赖会致使该异常, 如使用@DependsOn注解配置了依赖:get
@Service @DependsOn("permission") public class Role { @Autowired private Permission permission; } @Service @DependsOn("role") public class Permission { @Autowired private Role role; }
Permission,Role互相依赖, 谁没法被建立, BeanFactory将抛出异常BeanCreationException:
Circular depends-on relationship between 'role' and 'permission'
it