doGetBean 方法
- protected <T> T doGetBean(
- final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
- throws BeansException {
- // 从缓存中获取 bean 实例
- Object sharedInstance = getSingleton(beanName);
- // mbd.isSingleton() 用于判断 bean 是否是单例模式
- if (mbd.isSingleton()) {
- // 获取 bean 实例
- sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
- @Override
- public Object getObject() throws BeansException {
- try {
- // 创建 bean 实例,createBean 返回的 bean 实例化好的
- return createBean(beanName, mbd, args);
- }
- catch (BeansException ex) {
- destroySingleton(beanName);
- throw ex;
- }
- }
- });
- // 后续的处理操作
- bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
- }
- // …
- // 返回 bean 实例
- return (T) bean;
- }
- 按照在源码分析的流程图中可以看到,这一部分是从 getSingleton 先判断是否有实例对象,对于第一次进入是肯定没有对象的,要继续往下走。
- 在判断 mbd.isSingleton() 单例以后,开始使用基于 ObjectFactory 包装的方式创建 createBean,进入后核心逻辑是开始执行 doCreateBean 操作。
doCreateBean 方法
- protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
- throws BeanCreationException {
- // 创建 bean 实例,并将 bean 实例包装到 BeanWrapper 对象中返回
- instanceWrapper = createBeanInstance(beanName, mbd, args);
- // 添加 bean 工厂对象到 singletonFactories 缓存中
- addSingletonFactory(beanName, new ObjectFactory<Object>() {
- @Override
- public Object getObject() throws BeansException {
- // 获取原始对象的早期引用,在 getEarlyBeanReference 方法中,会执行 AOP 相关逻辑。若 bean 未被 AOP 拦截,getEarlyBeanReference 原样返回 bean。
- return getEarlyBeanReference(beanName, mbd, bean);
- }
- });
- try {
- // 填充属性,解析依赖关系
- populateBean(beanName, mbd, instanceWrapper);
- if (exposedObject != null) {
- exposedObject = initializeBean(beanName, exposedObject, mbd);
- }
- }
- // 返回 bean 实例
- return exposedObject;
- }
- 在 doCreateBean 方法中包括的内容较多,但核心主要是创建实例、加入缓存以及最终进行属性填充,属性填充就是把一个 bean 的各个属性字段涉及到的类填充进去。
- createBeanInstance,创建 bean 实例,并将 bean 实例包装到 BeanWrapper 对象中返回
- addSingletonFactory,添加 bean 工厂对象到 singletonFactories 缓存中
- getEarlyBeanReference,获取原始对象的早期引用,在 getEarlyBeanReference 方法中,会执行 AOP 相关逻辑。若 bean 未被 AOP 拦截,getEarlyBeanReference 原样返回 bean。
- populateBean,填充属性,解析依赖关系。也就是从这开始去找寻 A 实例中属性 B,紧接着去创建 B 实例,最后在返回回来。
getSingleton 三级缓存
- protected Object getSingleton(String beanName, boolean allowEarlyReference) {
- // 从 singletonObjects 获取实例,singletonObjects 是成品 bean
- Object singletonObject = this.singletonObjects.get(beanName);
- // 判断 beanName ,isSingletonCurrentlyInCreation 对应的 bean 是否正在创建中
- if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
- synchronized (this.singletonObjects) {
- // 从 earlySingletonObjects 中获取提前曝光未成品的 bean
- singletonObject = this.earlySingletonObjects.get(beanName);
- if (singletonObject == null && allowEarlyReference) {
- // 获取相应的 bean 工厂
- ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
- if (singletonFactory != null) {
- // 提前曝光 bean 实例,主要用于解决AOP循环依赖
- singletonObject = singletonFactory.getObject();
- // 将 singletonObject 放入缓存中,并将 singletonFactory 从缓存中移除
- this.earlySingletonObjects.put(beanName, singletonObject);
- this.singletonFactories.remove(beanName);
- }
- }
- }
- }
- return (singletonObject != NULL_OBJECT ? singletonObject : null);
- }
- singletonObjects.get(beanName),从 singletonObjects 获取实例,singletonObjects 是成品 bean
- isSingletonCurrentlyInCreation,判断 beanName ,isSingletonCurrentlyInCreation 对应的 bean 是否正在创建中
- allowEarlyReference,从 earlySingletonObjects 中获取提前曝光未成品的 bean
- singletonFactory.getObject(),提前曝光 bean 实例,主要用于解决AOP循环依赖
综上,是一个处理循环依赖的代码流程,这部分提取出来的内容主要为核心内容,并没有长篇大论的全部拆取出来,大家在调试的时候会涉及的比较多,尽可能要自己根据流程图操作调试几遍。