加载的时机
- 非懒加载
- 在refresh()的finishBeanFactoryInitialization()进行加载
- 懒加载
- 第一次调用beanFacoty.getBean()进行加载
执行getBean()加载
- getBean()
- doGetBean()
- transformedBeanName(beanName)
- 获取真正的BeanName 可能有别名
- 从缓存获取
- getSingleton(beanName)
- 从缓存中获取
- getObjectForBeanInstance(sharedInstance, name, beanName, null)
- 如果能从缓存中获取,则判断是否为FactoryBean,并调用返回
- getSingleton(beanName)
- 缓存中不存在Bean
- isPrototypeCurrentlyInCreation(beanName)
- Prototype模式的Bean 从当前创建Bean的缓存判断是否重复是否存在重复创建,如果是报重复依赖异常
- 判断当前容器是否存在Bean定义,如果不存在则递归从parentBeanFactory中获取Bean
- 存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition,如果指定BeanName,是子Bean的话同时会合并父类的相关属性
- 获取当前Bean的dependsOn,基于depend-on属性或@DependsOn注解设定的
- 判断是否存在重复依赖,如果有则抛异常
- 如果是singleton 调用getSingleton(),传入createBean(beanName, mbd, args)的ObjectFactory参数
-
beforeSingletonCreation(beanName)
- 记录加载状态,用于对循环依赖进行检测
- 实际上记录到singletonsCurrentlyInCreation
-
singletonFactory.getObject()
- 调用工厂创建Bean
- createBean(beanName, mbd, args)
- RootBeanDefinition.prepareMethodOverrides()
- 提前验证当前Bean是否存在配置了look-up的Method
- resolveBeforeInstantiation(beanName, mbdToUse)
- 在生成Bean之前给一个机会生成代理Bean
- 看是否存在InstantiationAwareBeanPostProcessor的类,执行BeanPostProcessors中的Before方法代理生成Bean
- 如果生成了代理类 再调用 全局的BeanPostProcessors的After方法
- doCreateBean(beanName, mbdToUse, args)
- 实际创建执行的Bean
- createBeanInstance(beanName, mbd, args)
- 逻辑极其复杂
- 通过反射或者cglib创建Bean
- 最后返回BeanWrapper
- addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
- 添加到SingletonFactory缓存中
- getEarlyBeanReference
- 如果存在SmartInstantiationAwareBeanPostProcessor,则执行处理器
- 返回原始Bean
- getEarlyBeanReference
- populateBean(beanName, mbd, instanceWrapper)
- 给原始Bean 注入属性、依赖
- initializeBean(beanName, exposedObject, mbd)
- 执行Bean的初始化方法
- applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName)
- BeanPostProcessor的Before方法
- invokeInitMethods(beanName, wrappedBean, mbd)
- 如果继承了InitializingBean接口, 执行afterPropertiesSet()方法
- init-method
- applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
- BeanPostProcessor的After方法
- RootBeanDefinition.prepareMethodOverrides()
-
afterSingletonCreation(beanName);
- singletonsCurrentlyInCreation 移除beanName
-
addSingleton(beanName, singletonObject)
- 将当前单例Bean加入到缓存中,并删除加载Bean过程中所记录的各种辅助状态
- 添加到 singletonObjects
- 从singletonFactories移除
- 从earlySingletonObjects移除
-
- isPrototypeCurrentlyInCreation(beanName)
- 返回单例Bean
- transformedBeanName(beanName)
- doGetBean()
循环依赖
- 不支持循环依赖
- 构造器初始化
- prototype
- IoC不进行缓存 无法解决循环依赖
- 支持循环依赖
- @Autowrie
- Setter