爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      spring源码分析之获取bean

      首页 知识中心 软件开发 文章详情页

      spring源码分析之获取bean

      2024-04-16 02:57:57 阅读次数:46

      java,spring,后端

      获取bean

      在进行获取bean的时候使用getBean方法来进行获取,那么就从getBean来作为入口,看一下获取bean的流程

      ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
      Car car = (Car) context.getBean("car");
      System.out.println(car);
      
      // org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
      public Object getBean(String name) throws BeansException {
         return doGetBean(name, null, null, false);
      }
      

      doGetBean方法

      这个方法比较长,分为很多步

      • transformedBeanName方法,对传入的beanName进行转换,因为传入的name不一定是beanName,也可能是FactoryBean,检查name的前缀是不是&,如果是别名的话,从aliasMap中获取真正的beanName
      • getSingleton方法,从缓存singletonObjects中加载单例,如果加载不成功尝试从singletonFactories中加载
      • getObjectForBeanInstance方法,进行bean的实例化,缓存中记录的是最原始的bean状态,对于FactoryBean需要再次进行处理
      • isPrototypeCurrentlyInCreation方法,原型的依赖检查
      • parentBeanFactory != null && !containsBeanDefinition(beanName),如果parentBeanFactory不为null,且当前加载的XML配置文件中不包含beanName,则会去parentBeanFactory中进行尝试获取
      • mbd.getDependsOn(),寻找依赖
      • 针对不同的scope的bean来进行创建
      // org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
      // 实际获取Bean的方法
      protected <T> T doGetBean(
            final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
            throws BeansException {
      // 获取对应的beanName,可能是FactoryBean,可能是使用别名的
         final String beanName = transformedBeanName(name);
         Object bean;
      
         // Eagerly check singleton cache for manually registered singletons.
        // 检查缓存中或者实例工厂中是否存在该bean,处理已经被创建过的单例bean,这种bean不需要重复创建
        // 在创建单例bean的时候会存在依赖注入的情况,为了避免循环依赖,spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提前曝光,将ObjectFactory加入到缓存中,一旦下一个bean创建时需要依赖上一个bean则直接使用ObjectFactory
         Object sharedInstance = getSingleton(beanName);
         if (sharedInstance != null && args == null) {
            
           // 返回对应的bean,如果是FactoryBean的话是通过指定方法来创建bean
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
         }
      
         else {
            // Fail if we're already creating this bean instance:
            // We're assumably within a circular reference.
           // 只有单例才会解决循环依赖,原型如果存在循环依赖的话就会抛出异常
            if (isPrototypeCurrentlyInCreation(beanName)) {
               throw new BeanCurrentlyInCreationException(beanName);
            }
      
            // Check if bean definition exists in this factory.
           // 检查ioc容器中是否存在BeanDefinition,检查是否能在当前的BeanFactory中取得需要的bean
            BeanFactory parentBeanFactory = getParentBeanFactory();
           // 如果当前的工厂中取不到,则到双亲BeanFactory中去取
            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
               // Not found -> check parent.
               String nameToLookup = originalBeanName(name);
               if (args != null) {
                  // Delegation to parent with explicit args.
                  return (T) parentBeanFactory.getBean(nameToLookup, args);
               }
               else {
                  // No args -> delegate to standard getBean method.
                  return parentBeanFactory.getBean(nameToLookup, requiredType);
               }
            }
      			// 如果不仅仅做类型检查,则是需要创建bean
            if (!typeCheckOnly) {
               markBeanAsCreated(beanName);
            }
      
            try {
              // 根据bean的名字取得BeanDefinition
               final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
               checkMergedBeanDefinition(mbd, beanName, args);
      
               // Guarantee initialization of beans that the current bean depends on.
              // 获取当前Bean所依赖的Bean
               String[] dependsOn = mbd.getDependsOn();
               if (dependsOn != null) {
                 // 递归查找依赖的bean
                  for (String dep : dependsOn) {
                     if (isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                              "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                     }
                    // 缓存依赖调用
                     registerDependentBean(dep, beanName);
                     getBean(dep);
                  }
               }
      
               // Create bean instance.
              // 创建单例bean
               if (mbd.isSingleton()) {
                  sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
                     @Override
                     public Object getObject() throws BeansException {
                        try {
                          // 创建bean
                           return createBean(beanName, mbd, args);
                        }
                        catch (BeansException ex) {
                           // Explicitly remove instance from singleton cache: It might have been put there
                           // eagerly by the creation process, to allow for circular reference resolution.
                           // Also remove any beans that received a temporary reference to the bean.
                           destroySingleton(beanName);
                           throw ex;
                        }
                     }
                  });
                  bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
               }
      		// 创建prototype bean
               else if (mbd.isPrototype()) {
                  // It's a prototype -> create a new instance.
                  Object prototypeInstance = null;
                  try {
                     beforePrototypeCreation(beanName);
                     prototypeInstance = createBean(beanName, mbd, args);
                  }
                  finally {
                     afterPrototypeCreation(beanName);
                  }
                  bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
               }
      
               else {
                 // 其他scope的bean
                  String scopeName = mbd.getScope();
                  final Scope scope = this.scopes.get(scopeName);
                  if (scope == null) {
                     throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                  }
                  try {
                     Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
                        @Override
                        public Object getObject() throws BeansException {
                           beforePrototypeCreation(beanName);
                           try {
                              return createBean(beanName, mbd, args);
                           }
                           finally {
                              afterPrototypeCreation(beanName);
                           }
                        }
                     });
                     bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                  }
                  catch (IllegalStateException ex) {
                     throw new BeanCreationException(beanName,
                           "Scope '" + scopeName + "' is not active for the current thread; consider " +
                           "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
                           ex);
                  }
               }
            }
            catch (BeansException ex) {
               cleanupAfterBeanCreationFailure(beanName);
               throw ex;
            }
         }
      
         // Check if required type matches the type of the actual bean instance.
        // 检查需要的类型是否符合bean的实际类型
         if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {
            try {
               return getTypeConverter().convertIfNecessary(bean, requiredType);
            }
            catch (TypeMismatchException ex) {
               
               throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
            }
         }
         return (T) bean;
      }
      
      getSingleton方法

      从缓存singletonObjects中加载单例,如果加载不成功尝试从singletonFactories中加载

      三级缓存解决循环依赖

      // allowEarlyReference是true,表示允许早期依赖
      protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        // 从singletonObjects缓存中取
        // singletonObjects中存的是beanName和bean实例
        // singletonObjects是一级缓存
         Object singletonObject = this.singletonObjects.get(beanName);
        // 缓存中没有
         if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
           // 锁定全局变量进行处理
            synchronized (this.singletonObjects) {
              // 如果该bean正在进行加载则不进行处理,直接返回
              // earlySingletonObjects中存的是beanName和bean实例,但是与singletonObjects不同的是,存储的是还没进行属性注入操作的Bean的实例,,目的是为了监测循环引用
              // earlySingletonObjects是二级缓存
               singletonObject = this.earlySingletonObjects.get(beanName);
               if (singletonObject == null && allowEarlyReference) {
                 // 从singletonFactories中获取,对于某些方法需要提前进行初始化时则会调用addSingletonFactory方法将对应的ObjectFactory初始化策略存在singletonFactories中
                 // singletonFactories中存的是beanName和创建bean的ObjectFactory工厂
                 // singletonFactories是三级缓存
                  ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                  if (singletonFactory != null) {
                    // 调用ObjectFactory的getObject方法
                     singletonObject = singletonFactory.getObject();
                    // 记录在缓存earlySingletonObjects中,earlySingletonObjects和singletonFactories互斥
                     this.earlySingletonObjects.put(beanName, singletonObject);
                     this.singletonFactories.remove(beanName);
                  }
               }
            }
         }
         return (singletonObject != NULL_OBJECT ? singletonObject : null);
      }
      
      getObjectForBeanInstance获取bean实例

      主要是为了解决FactoryBean的情况

      protected Object getObjectForBeanInstance(
            Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
      
         // Don't let calling code try to dereference the factory if the bean isn't a factory.
        // 如果指定的name是以&为前缀,但是却不是FactoryBean实例,则抛出异常
         if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
            throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
         }
      
         // Now we have the bean instance, which may be a normal bean or a FactoryBean.
         // If it's a FactoryBean, we use it to create a bean instance, unless the
         // caller actually wants a reference to the factory.
        // 正常bean则直接返回
         if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
            return beanInstance;
         }
      // 到这里就都是FactoryBean
         Object object = null;
         if (mbd == null) {
           // 从缓存中加载bean
            object = getCachedObjectForFactoryBean(beanName);
         }
        // 缓存中没有
         if (object == null) {
            // Return bean instance from factory.
            FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
            // Caches object obtained from FactoryBean if it is a singleton.
            if (mbd == null && containsBeanDefinition(beanName)) {
               mbd = getMergedLocalBeanDefinition(beanName);
            }
           // 判断是用户自定义的还是应用程序本身的
            boolean synthetic = (mbd != null && mbd.isSynthetic());
            object = getObjectFromFactoryBean(factory, beanName, !synthetic);
         }
         return object;
      }
      
      getObjectFromFactoryBean
      protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
         if (factory.isSingleton() && containsSingleton(beanName)) {
            synchronized (getSingletonMutex()) {
               Object object = this.factoryBeanObjectCache.get(beanName);
               if (object == null) {
                  object = doGetObjectFromFactoryBean(factory, beanName);
                  // Only post-process and store if not put there already during getObject() call above
                  // (e.g. because of circular reference processing triggered by custom getBean calls)
                  Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
                  if (alreadyThere != null) {
                     object = alreadyThere;
                  }
                  else {
                     if (object != null && shouldPostProcess) {
                        try {
                          // 调用ObjectFactory的后置处理器
                           object = postProcessObjectFromFactoryBean(object, beanName);
                        }
                        catch (Throwable ex) {
                           throw new BeanCreationException(beanName,
                                 "Post-processing of FactoryBean's singleton object failed", ex);
                        }
                     }
                     this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
                  }
               }
               return (object != NULL_OBJECT ? object : null);
            }
         }
         else {
            Object object = doGetObjectFromFactoryBean(factory, beanName);
            if (object != null && shouldPostProcess) {
               try {
                  object = postProcessObjectFromFactoryBean(object, beanName);
               }
               catch (Throwable ex) {
                  throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
               }
            }
            return object;
         }
      }
      
      doGetObjectFromFactoryBean
      private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
            throws BeanCreationException {
      
         Object object;
         try {
           // 权限验证
            if (System.getSecurityManager() != null) {
               AccessControlContext acc = getAccessControlContext();
               try {
                  object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                     @Override
                     public Object run() throws Exception {
                       // 直接调用getObject方法
                           return factory.getObject();
                        }
                     }, acc);
               }
               catch (PrivilegedActionException pae) {
                  throw pae.getException();
               }
            }
            else {
               object = factory.getObject();
            }
         }
         catch (FactoryBeanNotInitializedException ex) {
            throw new BeanCurrentlyInCreationException(beanName, ex.toString());
         }
         catch (Throwable ex) {
            throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
         }
      
         // Do not accept a null value for a FactoryBean that's not fully
         // initialized yet: Many FactoryBeans just return null then.
         if (object == null && isSingletonCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(
                  beanName, "FactoryBean which is currently in creation returned null from getObject");
         }
         return object;
      }
      
      postProcessObjectFromFactoryBean
      // org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean
      protected Object postProcessObjectFromFactoryBean(Object object, String beanName) {
         return applyBeanPostProcessorsAfterInitialization(object, beanName);
      }
      
      public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
      			throws BeansException {
      
      		Object result = existingBean;
      		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
      			result = beanProcessor.postProcessAfterInitialization(result, beanName);
      			if (result == null) {
      				return result;
      			}
      		}
      		return result;
      	}
      
      createBean创建bean
      protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
         
         RootBeanDefinition mbdToUse = mbd;
      
         // 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.
        // 根据设置的className来解析class
         Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
         if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
         }
      
         // Prepare method overrides.
        // 准备方法覆盖
        // 在配置bean的时候配置lookup-method或者replace-method则会进行方法覆盖
         try {
            mbdToUse.prepareMethodOverrides();
         }
         catch (BeanDefinitionValidationException ex) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                  beanName, "Validation of method overrides failed", ex);
         }
      
         try {
            // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
           // BeanPostProcessors来返回代理代替真正的实例
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
               return bean;
            }
         }
         catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                  "BeanPostProcessor before instantiation of bean failed", ex);
         }
      
        // 创建bean
         Object beanInstance = doCreateBean(beanName, mbdToUse, args);
         
         return beanInstance;
      }
      
      resolveBeforeInstantiation

      后置处理器

      protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
         Object bean = null;
        // mbd.beforeInstantiationResolved为false
         if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
            // Make sure bean class is actually resolved at this point.
            if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
               Class<?> targetType = determineTargetType(beanName, mbd);
               if (targetType != null) {
                 // 实例化前处理
                  bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                  if (bean != null) {
                    // 实例化后处理
                     bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                  }
               }
            }
            mbd.beforeInstantiationResolved = (bean != null);
         }
         return bean;
      }
      
      applyBeanPostProcessorsBeforeInstantiation
      protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
         for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
               InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
               Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
               if (result != null) {
                  return result;
               }
            }
         }
         return null;
      }
      
      applyBeanPostProcessorsAfterInitialization
      public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
            throws BeansException {
      
         Object result = existingBean;
         for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
            result = beanProcessor.postProcessAfterInitialization(result, beanName);
            if (result == null) {
               return result;
            }
         }
         return result;
      }
      
      doCreateBean
      protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
            throws BeanCreationException {
      
         // Instantiate the bean.
         BeanWrapper instanceWrapper = null;
         if (mbd.isSingleton()) {
            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
         }
         if (instanceWrapper == null) {
           // 创建bean实例
            instanceWrapper = createBeanInstance(beanName, mbd, args);
         }
         final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
         Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
         mbd.resolvedTargetType = beanType;
      
         // Allow post-processors to modify the merged bean definition.
         synchronized (mbd.postProcessingLock) {
            if (!mbd.postProcessed) {
               try {
               // 处理@Value、@Autowried  调用AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition处理@Autowried和@Value
                  applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
               }
               catch (Throwable ex) {
                  throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                        "Post-processing of merged bean definition failed", ex);
               }
               mbd.postProcessed = true;
            }
         }
      
         // Eagerly cache singletons to be able to resolve circular references
         // even when triggered by lifecycle interfaces like BeanFactoryAware.
        // 是否需要提前曝光    是单例 && 允许循环依赖 && 当前bean正在创建
         boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
               isSingletonCurrentlyInCreation(beanName));
         if (earlySingletonExposure) {
            
           // 在bean初始化完成前将创建实例的ObjectFactory加入singletonFactories中,以便于后期循环依赖使用bean
            addSingletonFactory(beanName, new ObjectFactory<Object>() {
               @Override
               public Object getObject() throws BeansException {
                 // 对bean进行BeanPostProcessor后置处理  SmartInstantiationAwareBeanPostProcessor
                 // AOP中的advice就是在这里处理的
                  return getEarlyBeanReference(beanName, mbd, bean);
               }
            });
         }
      
         // Initialize the bean instance.
         Object exposedObject = bean;
         try {
           // 对bean进行属性注入,在这里如果依赖于其他bean的话,会进行递归创建依赖bean
            populateBean(beanName, mbd, instanceWrapper);
            if (exposedObject != null) {
              // 调用初始化方法,如BeanNameAware#setBeanName,BeanClassLoaderAware#setBeanClassLoader,BeanFactoryAware#setBeanFactory,BeanPostProcessor处理器,InitializingBean#afterPropertiesSet, init-method
               exposedObject = initializeBean(beanName, exposedObject, mbd);
            }
         }
         catch (Throwable ex) {
            if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
               throw (BeanCreationException) ex;
            }
            else {
               throw new BeanCreationException(
                     mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
            }
         }
      
         if (earlySingletonExposure) {
            Object earlySingletonReference = getSingleton(beanName, false);
           // 在检测到有循环依赖的情况下earlySingletonReference不为null
            if (earlySingletonReference != null) {
              // exposedObject == bean表示没有在初始化方法中被改变
               if (exposedObject == bean) {
                  exposedObject = earlySingletonReference;
               }
               else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                  String[] dependentBeans = getDependentBeans(beanName);
                  Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
                  for (String dependentBean : dependentBeans) {
                     if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                     }
                  }
                 // bean创建后其所依赖的bean是已经被创建的,actualDependentBeans不为空表示当前bean创建后其所依赖的bean没有完全创建完,存在循环依赖
                  if (!actualDependentBeans.isEmpty()) {
                     throw new BeanCurrentlyInCreationException(beanName,
                           "Bean with name '" + beanName + "' has been injected into other beans [" +
                           StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
                           "] in its raw version as part of a circular reference, but has eventually been " +
                           "wrapped. This means that said other beans do not use the final version of the " +
                           "bean. This is often the result of over-eager type matching - consider using " +
                           "'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
                  }
               }
            }
         }
      
         // Register bean as disposable.
         try {
            registerDisposableBeanIfNecessary(beanName, bean, mbd);
         }
         catch (BeanDefinitionValidationException ex) {
            throw new BeanCreationException(
                  mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
         }
      
         return exposedObject;
      }
      
      populateBean属性注入

      依赖注入是在这里进行的

      protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
         PropertyValues pvs = mbd.getPropertyValues();
      
         if (bw == null) {
            if (!pvs.isEmpty()) {
               throw new BeanCreationException(
                     mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
            }
            else {
               // Skip property population phase for null instance.
              // 没有可填充的属性
               return;
            }
         }
      
         // 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.
         if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
               if (bp instanceof InstantiationAwareBeanPostProcessor) {
                  InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                  if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                     return;
                  }
               }
            }
         }
      
         int resolvedAutowireMode = mbd.getResolvedAutowireMode();
        // 解析autowired
         if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
            MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
            // Add property values based on autowire by name if applicable.
           // 根据名称自动注入
            if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
               autowireByName(beanName, mbd, bw, newPvs);
            }
            // Add property values based on autowire by type if applicable.
           // 根据类型自动注入
            if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
               autowireByType(beanName, mbd, bw, newPvs);
            }
            pvs = newPvs;
         }
      
         boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
         boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
      
         if (hasInstAwareBpps || needsDepCheck) {
            PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
            if (hasInstAwareBpps) {
               for (BeanPostProcessor bp : getBeanPostProcessors()) {
                  if (bp instanceof InstantiationAwareBeanPostProcessor) {
                     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                     pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                     if (pvs == null) {
                        return;
                     }
                  }
               }
            }
            if (needsDepCheck) {
               checkDependencies(beanName, mbd, filteredPds, pvs);
            }
         }
      // 将属性应用到bean中
         applyPropertyValues(beanName, mbd, bw, pvs);
      }
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/Lxn2zh/article/details/127072159,作者:拾光师,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:一文搞定反射基本API

      下一篇:JavaWeb之请求转发和重定向

      相关文章

      2025-05-14 10:02:58

      java休眠到指定时间怎么写

      java休眠到指定时间怎么写

      2025-05-14 10:02:58
      java , sleep , Thread , util , 方法
      2025-05-14 10:02:58

      java项目多端数据同步解决方案

      多端数据同步是指在多个设备(例如桌面应用、移动应用、Web应用)之间保持数据的一致性。

      2025-05-14 10:02:58
      java , Spring , WebSocket , 同步 , 数据 , 版本号
      2025-05-13 09:49:12

      Java学习(动态代理的思想详细分析与案例准备)(1)

      Java学习(动态代理的思想详细分析与案例准备)(1)

      2025-05-13 09:49:12
      java , 代理 , 代码 , 对象 , 接口 , 方法 , 需要
      2025-05-09 08:50:35

      springboot实战学习(1)(开发模式与环境)

      springboot实战学习(1)(开发模式与环境)

      2025-05-09 08:50:35
      依赖 , 前端 , 后端 , 开发 , 接口 , 数据库 , 文档
      2025-05-09 08:20:32

      基于IDEA的Maven简单工程创建及结构分析

      通过一个 mvn 命令直接让我们创建一个 Maven 的脚手架。

      2025-05-09 08:20:32
      java , Maven , xml , 创建 , 文件 , 文件夹 , 项目
      2025-05-08 09:03:57

      前K个高频元素java

      给定一个非空的整数数组,返回其中出现频率前 前K个高频元素java 高的元素。

      2025-05-08 09:03:57
      java , 元素 , 样例 , 给定
      2025-05-08 09:03:21

      基于java Swing开发的学生成绩管理系统【项目源码+数据库脚本】

      基于java Swing开发的学生成绩管理系统【项目源码+数据库脚本】

      2025-05-08 09:03:21
      java , Swing , 学生 , 源码
      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      本项目是一套基于spring+jsp+mysql实现的Java web论坛系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      Java , jsp , spring , 功能 , 源码
      2025-05-08 09:03:21

      java Swing学生成绩管理系统【项目源码+数据库脚本】

      本项目是一套基于java Swing开发的学生成绩管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      java , 学生 , 成绩 , 数据库 , 源码
      2025-05-08 09:03:07

      spring Bean的作用域和生命周期

      spring Bean的作用域和生命周期

      2025-05-08 09:03:07
      Bean , method , spring , 作用域 , 配置文件
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5238368

      查看更多

      最新文章

      java项目多端数据同步解决方案

      2025-05-14 10:02:58

      Java学习(动态代理的思想详细分析与案例准备)(1)

      2025-05-13 09:49:12

      springboot实战学习(1)(开发模式与环境)

      2025-05-09 08:50:35

      前K个高频元素java

      2025-05-08 09:03:57

      java Swing学生成绩管理系统【项目源码+数据库脚本】

      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      2025-05-08 09:03:21

      查看更多

      热门文章

      JAVA__接口的作用

      2023-04-18 14:14:13

      Java学习之算术运算符两只老虎

      2023-04-19 09:23:13

      排序算法Java版-归并排序算法

      2023-04-24 11:25:19

      JAVA多线程学习笔记

      2023-05-11 06:05:48

      try...catch...finally java

      2023-03-29 09:40:26

      Java:apache.poi读写Excel文件

      2023-02-22 06:40:54

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      java实现连接远程服务器,并可以执行shell命令

      java演练 类与对象 给我一个数字还你一个字符串

      BurpSuite2021 -- 目标模块(Target)

      一文详解Unexpected character (‘“‘ (code 34)): was expecting comma to separate Object entries的问题

      [springMVC学习]7、数据验证及其格式转换(debug源码解析)

      spring && Cobertura && maven &&junit 单元测试以及测试覆盖率

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号