39 lines
1.4 KiB
Markdown
39 lines
1.4 KiB
Markdown
|
## 顺序获取单例
|
|||
|
|
|||
|
1. private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
|
|||
|
2. private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
|
|||
|
3. private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
|
|||
|
|
|||
|
## 循环依赖
|
|||
|
|
|||
|
```java
|
|||
|
// 单例顺序获取失败
|
|||
|
// Fail if we're already creating this bean instance:
|
|||
|
// We're assumably within a circular reference.
|
|||
|
```
|
|||
|
|
|||
|
1. 判断是否存在父类中,如果存在从父类中获取。
|
|||
|
2. 设置正在创建
|
|||
|
3. RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
|
|||
|
4. 判断单例、原型或者其他
|
|||
|
5. 创建bean,检验检测状态
|
|||
|
1. Make sure bean class is actually resolved at this point, and clone the bean definition in case of a dynamically resolved Class which cannot be stored in the shared merged bean definition.
|
|||
|
2. doCreateBean
|
|||
|
1. createBeanInstance
|
|||
|
2. Eagerly cache singletons to be able to resolve circular references even when triggered by lifecycle interfaces like BeanFactoryAware.放入三级缓存中addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean))
|
|||
|
3. Give any InstantiationAwareBeanPostProcessors the opportunity to modify the state of the bean before properties are set. This can be used, for example,to support styles of field injection.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 重要类
|
|||
|
|
|||
|
```java
|
|||
|
|
|||
|
BeanDefinition、ClassLoader
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|