Spring @Compoment bean注册过程

99 阅读2分钟

Spring @Compoment bean注册过程

@ComponentScan注册bean

  1. 扫描path解析到BeanDefinitionHolder
  2. 赋值到BeanDefinitionRegistry.beanDefinitionMap
org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass

protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
      throws IOException {
   ....

   // Process any @ComponentScan annotations
   Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
         sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
   if (!componentScans.isEmpty() &&
         !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
      for (AnnotationAttributes componentScan : componentScans) {
         // The config class is annotated with @ComponentScan -> perform the scan immediately
         Set<BeanDefinitionHolder> scannedBeanDefinitions =
               this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
         // Check the set of scanned definitions for any further config classes and parse recursively if needed
         for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
            BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();
            if (bdCand == null) {
               bdCand = holder.getBeanDefinition();
            }
            if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {
               parse(bdCand.getBeanClassName(), holder.getBeanName());
            }
         }
      }
   }
   
   ...
}

注册Bean的后置处理器BeanPostProcessor

registerBeanPostProcessors(beanFactory);

AspectJ Aop BeanPostProcessor 增强对象

org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator
extends 
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator
extends
org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator
extends
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
implements 
org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor
extends
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor
extends
org.springframework.beans.factory.config.BeanPostProcessor

实例化Bean

beanfinishBeanFactoryInitialization

1.创建BeanWrapper包装,放在BeanDefinitionMap

instanceWrapper = createBeanInstance(beanName, mbd, args);
BeanUtils#instantiateClass

2.后置处理器修改beanDefinition,修改包装bean对象,如Aop代理对象

getEarlyBeanReference(beanName, mbd, bean)

3.增加到三级缓存singletonFactories, 包装成ObjectFactory

DefaultSingletonBeanRegistry#addSingletonFactory

4.注入bean依赖对象,依赖对象不存在则创建依赖对象bean

populateBean(beanName, mbd, instanceWrapper);

三级转二级核心实现

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
//  一级singletonObjects不存在找二级earlySingletonObjects
   Object singletonObject = this.singletonObjects.get(beanName);
   if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
      synchronized (this.singletonObjects) {
//  二级earlySingletonObjects不存在找三级singletonFactories
         singletonObject = this.earlySingletonObjects.get(beanName);
         if (singletonObject == null && allowEarlyReference) {
            ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
            if (singletonFactory != null) {
//  三级singletonFactories找到则放在二级,删除三级
               singletonObject = singletonFactory.getObject();
               this.earlySingletonObjects.put(beanName, singletonObject);
               this.singletonFactories.remove(beanName);
            }
         }
      }
   }
   return singletonObject;
}

5.最后如果是新实例,二级缓存增加到一级singletonObjects

DefaultSingletonBeanRegistry.java:247
if (newSingleton) {
   addSingleton(beanName, singletonObject);
}

创建bean实现核心代码

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {

   // 1.创建BeanWrapper包装
   BeanWrapper instanceWrapper = null;
   if (mbd.isSingleton()) {
      instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
   }
   if (instanceWrapper == null) {
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }
   final Object bean = instanceWrapper.getWrappedInstance();
   Class<?> beanType = instanceWrapper.getWrappedClass();
   if (beanType != NullBean.class) {
      mbd.resolvedTargetType = beanType;
   }

   // 2.允许后置处理器修改BeanDefinition
   synchronized (mbd.postProcessingLock) {
      if (!mbd.postProcessed) {
         try {
            applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
         }
         catch (Throwable ex) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                  "Post-processing of merged bean definition failed", ex);
         }
         mbd.postProcessed = true;
      }
   }

   // 3.增加到三级缓存singletonFactories, 包装成ObjectFactory
   // getEarlyBeanReference会将三级缓存对象包装成proxy,addSingletonFactory再包装成ObjectFactory
   boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
         isSingletonCurrentlyInCreation(beanName));
   if (earlySingletonExposure) {
      if (logger.isTraceEnabled()) {
         logger.trace("Eagerly caching bean '" + beanName +
               "' to allow for resolving potential circular references");
      }
      addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
   }

   //4.注入bean依赖对象,不存在则创建依赖对象
   Object exposedObject = bean;
   try {
      populateBean(beanName, mbd, instanceWrapper);
      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);
      if (earlySingletonReference != null) {
         if (exposedObject == bean) {
            exposedObject = earlySingletonReference;
         }
         else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
            String[] dependentBeans = getDependentBeans(beanName);
            Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
            for (String dependentBean : dependentBeans) {
               if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                  actualDependentBeans.add(dependentBean);
               }
            }
            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 " +
                     "'getBeanNamesOfType' 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;
}