Spring之IoC
Ioc(控制反转)原理
工厂方法+反射
Spring通过IoC容器加载外部资源
DI:在系统运行过程中,动态的向某个对象提供它所需的对象
源码分析(自底向上)
DefaultSingletonBeanRegistry
singletonObjects,只有2个方法可以向其增加
- registerSingleton(String beanName, Object singletonObject)
- getSingleton(String beanName, ObjectFactory<?> singletonFactory)
earlySingletonObjects,只有1个方法可以向其增加,代码如下
- getSingleton(String beanName, boolean allowEarlyReference)
1 | private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); |
FactoryBeanRegistrySupport
核心方法getObjectFromFactoryBean,由FactoryBean创建的Bean单独放个缓存
1 | Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16); |
AbstractBeanFactory
Bean的三层缓存
主要解决循环依赖
singletonObjects:存放最终的beanearlySingletonObjects:存放早期bean,属性未设置,意味着创建中singletonFactories:存放BeanFactory
BeanDefinition
获取和构建
主逻辑ClassPathBeanDefinitionScanner#doScan
ClassPathScanningCandidateComponentProvider#scanCandidateComponents
- 构建ScannedGenericBeanDefinition
- 不初始化字段
ClassPathBeanDefinitionScanner#postProcessBeanDefinition
- 使用
BeanDefinitionDefaults初始化BeanDefinition的各个字段
AnnotationConfigUtils#processCommonDefinitionAnnotations(AnnotatedBeanDefinition, AnnotatedTypeMetadata)
- 解析
Lazy、Primary、DependsOn、Role、Description等注解
最后注册到BeanDefinitionRegistry