zoukankan      html  css  js  c++  java
  • SpringBean加载过程中,循环依赖的问题(一)


    参考运行代码
    首先我们自定义两个类,并进行循环引用,查看执行效果

    • OrderServiceImpl
    @Service
    public class OrderServiceImpl implements IOrderService {
    
        @Resource
        private IUserService userService;
    
        @Override
        public String getOrderById(Integer id) {
            return "order :"+id;
        }
    
        @Override
        public String getOrderByUser(Integer userId) {
            String user = userService.getUserById(userId);
            return user+"[order]";
        }
    
    
    }
    
    • UserServiceImpl
    @Service
    public class UserServiceImpl implements IUserService {
    
        @Resource
        private IOrderService orderService;
    
    
        @Override
        public String getUsers() {
            return "list users:"+System.currentTimeMillis();
        }
    
        @Override
        public String getUserById(Integer id) {
            return "user:"+id;
        }
    }
    

    启动时,出现了循环依赖的问题,为什么呢?Spring不是解决了吗
    原来是SpringBoot2.6 正式发布:循环依赖默认禁止,需要添加spring.main.allow-circular-references=true才能解决循环依赖的问题。

    Spring是如何解决循环依赖问题的

    populateBean入口

    首先查看依赖字段是在什么时候进行注入的,我们以OrderServiceImpl为例,对OrderServiceImpl进行初始化的时候,首先调用getBean,在执行到doCreateBean的时候,实例化后,进行依赖注入,调用populateBean方法,在populate方法中,执行实例化包装后置处理器的时候,对@Resource注解修饰的字段进行了依赖注入,依赖的是CommonAnnotationBeanPostProcessor通用注解Bean后置处理器,执行后populateBean,继续往下执行

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    			throws BeanCreationException {
    
    		// Instantiate the bean.
    		BeanWrapper instanceWrapper = null;
    		if (mbd.isSingleton()) {
    			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    		}
    		if (instanceWrapper == null) {
    			instanceWrapper = createBeanInstance(beanName, mbd, args);
    		}
    		Object bean = instanceWrapper.getWrappedInstance();
    		Class<?> beanType = instanceWrapper.getWrappedClass();
    		if (beanType != NullBean.class) {
    			mbd.resolvedTargetType = beanType;
    		}
    
    		// Allow post-processors to modify the merged bean definition.
    		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;
    			}
    		}
    
    		// Eagerly cache singletons to be able to resolve circular references
    		// even when triggered by lifecycle interfaces like BeanFactoryAware.
    		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));
    		}
    
    		// Initialize the bean instance.
    		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,"");
    					}
    				}
    			}
    		}
    
    		// 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的过程中,有两次调用InstantiationAwareBeanPostProcessor 类型的后置处理器,但是执行的方法不同,在pvs之前调用的是bp.postProcessAfterInstantiation方法,即实例化之后后置处理方法;而在pvs之后,调用的是bp.postProcessProperties,即后置处理属性方法。

    getBeanPostProcessorCache().instantiationAware返回的后置处理器有四个,这次主要分析的是CommonAnnotationBeanPostProcessor处理器
    0 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@8267}
    1 = {InfrastructureAdvisorAutoProxyCreator@5741} "proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"
    2 = {CommonAnnotationBeanPostProcessor@4834}
    3 = {AutowiredAnnotationBeanPostProcessor@6728}

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    		if (bw == null) {
    			if (mbd.hasPropertyValues()) {
    				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 (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
    				if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    					return;
    				}
    			}
    		}
    
    		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
    
    		int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    		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);
    
    		PropertyDescriptor[] filteredPds = null;
    		if (hasInstAwareBpps) {
    			if (pvs == null) {
    				pvs = mbd.getPropertyValues();
    			}
    			for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
    				PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
    				if (pvsToUse == null) {
    					if (filteredPds == null) {
    						filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    					}
    					pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    					if (pvsToUse == null) {
    						return;
    					}
    				}
    				pvs = pvsToUse;
    			}
    		}
    		if (needsDepCheck) {
    			if (filteredPds == null) {
    				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    			}
    			checkDependencies(beanName, mbd, filteredPds, pvs);
    		}
    
    		if (pvs != null) {
    			applyPropertyValues(beanName, mbd, bw, pvs);
    		}
    	}
    }
    

    CommonAnnotationBeanPostProcessor

    CommonAnnotationBeanPostProcessor有一个成员变量injectionMetadataCache缓存了每个Bean所依赖的需要注入的字段,以类名为key,InjectionMetadata类型对象为值,进行缓存,因此后置处理属性方法从缓存中,拿到了OrderServiceImpl依赖的userService字段,然后调用metadata的inject方法。返回到调用getResource方法,随机执行[autowireResource]自动装配资源方法。

    public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
    		implements InstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable {
    	@Override
    	public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
    		InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);
    		try {
    			metadata.inject(bean, beanName, pvs);
    		}
    		catch (Throwable ex) {
    			throw new BeanCreationException(beanName, "Injection of resource dependencies failed", ex);
    		}
    		return pvs;
    	}
    
    	protected Object getResource(LookupElement element, @Nullable String requestingBeanName)
    			throws NoSuchBeanDefinitionException {
    
    		// JNDI lookup to perform?
    		String jndiName = null;
    		if (StringUtils.hasLength(element.mappedName)) {
    			jndiName = element.mappedName;
    		}
    		else if (this.alwaysUseJndiLookup) {
    			jndiName = element.name;
    		}
    		if (jndiName != null) {
    			if (this.jndiFactory == null) {
    				throw new NoSuchBeanDefinitionException(element.lookupType,
    						"No JNDI factory configured - specify the 'jndiFactory' property");
    			}
    			return this.jndiFactory.getBean(jndiName, element.lookupType);
    		}
    
    		// Regular resource autowiring
    		if (this.resourceFactory == null) {
    			throw new NoSuchBeanDefinitionException(element.lookupType,
    					"No resource factory configured - specify the 'resourceFactory' property");
    		}
    		return autowireResource(this.resourceFactory, element, requestingBeanName);
    	}
    	private class ResourceElement extends LookupElement {
    
    		protected Object getResourceToInject(Object target, @Nullable String requestingBeanName) {
    			return (this.lazyLookup ? buildLazyResourceProxy(this, requestingBeanName) :
    					getResource(this, requestingBeanName));
    		}
      }
    }
    
    • InjectionMetadata
      获取到注入元素后,调用inject方法,然后调用InjectedElement 中field.set(target, getResourceToInject(target, requestingBeanName)),然后调用CommonAnnotationBeanPostProcessor$ResourceElement中的getResourceToInject获取需要注入的元素,
      随机调用CommonAnnotationBeanPostProcessor 中的getResource,根据getResource返回的bean实例,进行依赖注入field.set
    public class InjectionMetadata {
    	public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
    		Collection<InjectedElement> checkedElements = this.checkedElements;
    		Collection<InjectedElement> elementsToIterate =
    				(checkedElements != null ? checkedElements : this.injectedElements);
    		if (!elementsToIterate.isEmpty()) {
    			for (InjectedElement element : elementsToIterate) {
    				element.inject(target, beanName, pvs);
    			}
    		}
    	}
    	public abstract static class InjectedElement {
    		protected void inject(Object target, @Nullable String requestingBeanName, @Nullable PropertyValues pvs)
    				throws Throwable {
    
    			if (this.isField) {
    				Field field = (Field) this.member;
    				ReflectionUtils.makeAccessible(field);
    				field.set(target, getResourceToInject(target, requestingBeanName));
    			}
    			else {
    				if (checkPropertySkipping(pvs)) {
    					return;
    				}
    				try {
    					Method method = (Method) this.member;
    					ReflectionUtils.makeAccessible(method);
    					method.invoke(target, getResourceToInject(target, requestingBeanName));
    				}
    				catch (InvocationTargetException ex) {
    					throw ex.getTargetException();
    				}
    			}
    		}
          }
    }
    

    autowireResource

    在autowireResource方法中调用beanFactory.resolveDependency方法,descriptor=【field:userService】;requestingBeanName=【orderServiceImpl】;autowiredBeanNames=【】,
    经过beanFactory.resolveDependency得到BeanInstance之后,继续向下执行beanFactory.registerDependentBean(autowiredBeanName, requestingBeanName)方法,注册依赖bean,然后返回资源对象

    public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor
    		implements InstantiationAwareBeanPostProcessor, BeanFactoryAware, Serializable {
        protected Object autowireResource(BeanFactory factory, LookupElement element, @Nullable String requestingBeanName)
    			throws NoSuchBeanDefinitionException {
    
    		Object resource;
    		Set<String> autowiredBeanNames;
                    //name = userService
    		String name = element.name;
    
    		if (factory instanceof AutowireCapableBeanFactory) {
    			AutowireCapableBeanFactory beanFactory = (AutowireCapableBeanFactory) factory;
                            //descriptor= field:userService
    			DependencyDescriptor descriptor = element.getDependencyDescriptor();
    			if (this.fallbackToDefaultTypeMatch && element.isDefaultName && !factory.containsBean(name)) {
    				autowiredBeanNames = new LinkedHashSet<>();
    				resource = beanFactory.resolveDependency(descriptor, requestingBeanName, autowiredBeanNames, null);
    				if (resource == null) {
    					throw new NoSuchBeanDefinitionException(element.getLookupType(), "No resolvable resource object");
    				}
    			}
    			else {
    				resource = beanFactory.resolveBeanByName(name, descriptor);
    				autowiredBeanNames = Collections.singleton(name);
    			}
    		}
    		else {
    			resource = factory.getBean(name, element.lookupType);
    			autowiredBeanNames = Collections.singleton(name);
    		}
    
    		if (factory instanceof ConfigurableBeanFactory) {
    			ConfigurableBeanFactory beanFactory = (ConfigurableBeanFactory) factory;
    			for (String autowiredBeanName : autowiredBeanNames) {
    				if (requestingBeanName != null && beanFactory.containsBean(autowiredBeanName)) {
    					beanFactory.registerDependentBean(autowiredBeanName, requestingBeanName);
    				}
    			}
    		}
    
    		return resource;
    	}
    
    }
    
    • registerDependentBean
    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    	/** Map between dependent bean names: bean name to Set of dependent bean names. */
    	//依赖Bean之间的映射,注入类所对应的依赖类的集合
    	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
    
    	/** Map between depending bean names: bean name to Set of bean names for the bean's dependencies. */
    	//依赖Bean之间的映射,依赖类所对应的注入类的集合
    	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);
    	public void registerDependentBean(String beanName, String dependentBeanName) {
    		String canonicalName = canonicalName(beanName);
    
    		synchronized (this.dependentBeanMap) {
    			Set<String> dependentBeans =
    					this.dependentBeanMap.computeIfAbsent(canonicalName, k -> new LinkedHashSet<>(8));
    			if (!dependentBeans.add(dependentBeanName)) {
    				return;
    			}
    		}
    
    		synchronized (this.dependenciesForBeanMap) {
    			Set<String> dependenciesForBean =
    					this.dependenciesForBeanMap.computeIfAbsent(dependentBeanName, k -> new LinkedHashSet<>(8));
    			dependenciesForBean.add(canonicalName);
    		}
    	}
    }
    

    resolveDependency

    经过一系列判断,进入doResolveDependency解析依赖方法,获取到matchingBeans 符合注入的BeanClass,如果实例是一个Class类型,则调用字段描述符的解析候选项方法
    descriptor.resolveCandidate解析Class,经过解析从三级缓存中拿到实例对象,我们继续向下执行,返回result对象,并在finally方法中执行ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint)方法,将当前的注入点设置为上一注入点,在此以OrderService和UserService为例:

    首次加载的是OrderServiceImpl,注入点为UserServiceImpl,
    然后在注入UserServiceImpl时候,角色互转,加载的是UserServiceImpl,注入点为OrderServiceImpl,
    而在此处第一次返回注入对象的时候,注入点为OrderServiceImpl,经过setCurrentInjectionPoint,注入点又变为UserServiceImpl.

    private static final NamedThreadLocal currentInjectionPoint =new NamedThreadLocal<>("Current injection point")本地线程变量

    将实例返回上一层[autowireResource](#autowireResource)
    public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
    		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
    	public Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
    			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
    
    		descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
    		if (Optional.class == descriptor.getDependencyType()) {
    			return createOptionalDependency(descriptor, requestingBeanName);
    		}
    		else if (ObjectFactory.class == descriptor.getDependencyType() ||
    				ObjectProvider.class == descriptor.getDependencyType()) {
    			return new DependencyObjectProvider(descriptor, requestingBeanName);
    		}
    		else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
    			return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);
    		}
    		else {
    			Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(
    					descriptor, requestingBeanName);
    			if (result == null) {
    				result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
    			}
    			return result;
    		}
    	}
    
    	public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,
    			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
                    //将当前字段设置为当前注入点
    		InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);
    		try {
    			Object shortcut = descriptor.resolveShortcut(this);
    			if (shortcut != null) {
    				return shortcut;
    			}
                            //解析到当前类型为 type = com.bail.analyse.springdemo.service.IUserService
    			Class<?> type = descriptor.getDependencyType();
                            //获得的建议值为空
    			Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
    			if (value != null) {
    				if (value instanceof String) {
    					String strVal = resolveEmbeddedValue((String) value);
    					BeanDefinition bd = (beanName != null && containsBean(beanName) ?
    							getMergedBeanDefinition(beanName) : null);
    					value = evaluateBeanDefinitionString(strVal, bd);
    				}
    				TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
    				try {
    					return converter.convertIfNecessary(value, type, descriptor.getTypeDescriptor());
    				}
    				catch (UnsupportedOperationException ex) {
    					// A custom TypeConverter which does not support TypeDescriptor resolution...
    					return (descriptor.getField() != null ?
    							converter.convertIfNecessary(value, type, descriptor.getField()) :
    							converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));
    				}
    			}
                            //解析多个Bean,主要是针对StreamDependencyDescriptor、isArray、Collection、Map类型进行解析
    			Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);
    			if (multipleBeans != null) {
    				return multipleBeans;
    			}
                            //调用寻找自动装配候选项的方法,返回Class Map
    			Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
    			if (matchingBeans.isEmpty()) {
    				if (isRequired(descriptor)) {
    					raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
    				}
    				return null;
    			}
    
    			String autowiredBeanName;
    			Object instanceCandidate;
                            //此时matchingBeans = 1,正好有一个符合条件
    			if (matchingBeans.size() > 1) {
    				autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);
    				if (autowiredBeanName == null) {
    					if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {
    						return descriptor.resolveNotUnique(descriptor.getResolvableType(), matchingBeans);
    					}
    					else {
    						// In case of an optional Collection/Map, silently ignore a non-unique case:
    						// possibly it was meant to be an empty collection of multiple regular beans
    						// (before 4.3 in particular when we didn't even look for collection beans).
    						return null;
    					}
    				}
    				instanceCandidate = matchingBeans.get(autowiredBeanName);
    			}
    			else {
    				// We have exactly one match.
    				Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
    				//autowiredBeanName  = userServiceImpl
    				//instanceCandidate  = com.bail.analyse.springdemo.service.impl.UserServiceImpl
    				autowiredBeanName = entry.getKey();
    				instanceCandidate = entry.getValue();
    			}
    
    			if (autowiredBeanNames != null) {
    				autowiredBeanNames.add(autowiredBeanName);
    			}
                            //如果实例是一个Class类型,则调用字段描述符的解析候选项方法
    			if (instanceCandidate instanceof Class) {
    				instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);
    			}
    			Object result = instanceCandidate;
    			if (result instanceof NullBean) {
    				if (isRequired(descriptor)) {
    					raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
    				}
    				result = null;
    			}
    			if (!ClassUtils.isAssignableValue(type, result)) {
    				throw new BeanNotOfRequiredTypeException(autowiredBeanName, type, instanceCandidate.getClass());
    			}
    			return result;
    		}
    		finally {
    			ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);
    		}
    	}
    
    }
    
    
    • findAutowireCandidates
      BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType, true, descriptor.isEager())方法获取候选项名称,实际上是从BeanDefinitionMap中,根据BeanDefinition类型来判断是否有符合注入字段类型的候选项,如果不是FactoryBean,则调用isTypeMatch()来判断当前BeanDefinition是否符合候选项,最后返回一个result=userServiceImpl -> {Class@4416} "class com.bail.analyse.springdemo.service.impl.UserServiceImpl"
    
    	protected Map<String, Object> findAutowireCandidates(
    			@Nullable String beanName, Class<?> requiredType, DependencyDescriptor descriptor) {
                    //获取候选项的名称,此时candidateNames  = 【userServiceImpl】
    		String[] candidateNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
    				this, requiredType, true, descriptor.isEager());
    		Map<String, Object> result = CollectionUtils.newLinkedHashMap(candidateNames.length);
                    //此处功能有待实践
    		for (Map.Entry<Class<?>, Object> classObjectEntry : this.resolvableDependencies.entrySet()) {
    			Class<?> autowiringType = classObjectEntry.getKey();
    			if (autowiringType.isAssignableFrom(requiredType)) {
    				Object autowiringValue = classObjectEntry.getValue();
    				autowiringValue = AutowireUtils.resolveAutowiringValue(autowiringValue, requiredType);
    				if (requiredType.isInstance(autowiringValue)) {
    					result.put(ObjectUtils.identityToString(autowiringValue), autowiringValue);
    					break;
    				}
    			}
    		}
    		for (String candidate : candidateNames) {
    			//此处判断bean是否不是自我引用和候选选是否满足注入字段,判断符合条件,进入if逻辑
    			if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, descriptor)) {
    				//添加候选键值对
    				addCandidateEntry(result, candidate, descriptor, requiredType);
    			}
    		}
    		if (result.isEmpty()) {
    			boolean multiple = indicatesMultipleBeans(requiredType);
    			// Consider fallback matches if the first pass failed to find anything...
    			DependencyDescriptor fallbackDescriptor = descriptor.forFallbackMatch();
    			for (String candidate : candidateNames) {
    				if (!isSelfReference(beanName, candidate) && isAutowireCandidate(candidate, fallbackDescriptor) &&
    						(!multiple || getAutowireCandidateResolver().hasQualifier(descriptor))) {
    					addCandidateEntry(result, candidate, descriptor, requiredType);
    				}
    			}
    			if (result.isEmpty() && !multiple) {
    				// Consider self references as a final pass...
    				// but in the case of a dependency collection, not the very same bean itself.
    				for (String candidate : candidateNames) {
    					if (isSelfReference(beanName, candidate) &&
    							(!(descriptor instanceof MultiElementDescriptor) || !beanName.equals(candidate)) &&
    							isAutowireCandidate(candidate, fallbackDescriptor)) {
    						addCandidateEntry(result, candidate, descriptor, requiredType);
    					}
    				}
    			}
    		}
    		return result;
    	}
    
    	/**
    	*向候选映射添加一个条目:bean实例(如果可用)或仅解析的类型,
    	*以防止在主要候选选择之前进行bean初始化。进入最后一个else
    	*/
    	private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
    			DependencyDescriptor descriptor, Class<?> requiredType) {
    
    		if (descriptor instanceof MultiElementDescriptor) {
    			Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
    			if (!(beanInstance instanceof NullBean)) {
    				candidates.put(candidateName, beanInstance);
    			}
    		}
    		else if (containsSingleton(candidateName) || (descriptor instanceof StreamDependencyDescriptor &&
    				((StreamDependencyDescriptor) descriptor).isOrdered())) {
    			Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
    			candidates.put(candidateName, (beanInstance instanceof NullBean ? null : beanInstance));
    		}
    		else {
    			candidates.put(candidateName, getType(candidateName));
    		}
    	}
    

    isTypeMatch

    方法中调用了Object beanInstance = getSingleton(beanName, false)来从单例容器中获取实例对象,执行到predictBeanType(beanName, mbd, typesToMatch)方法,预测Bean类型,返回的依然是原目标类型com.bail.analyse.springdemo.service.impl.UserServiceImpl,执行到最后typeToMatch.isAssignableFrom(predictedType)方法,判断接口类型和实现类是一致的,返回true

    
    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    
    	protected boolean isTypeMatch(String name, ResolvableType typeToMatch, boolean allowFactoryBeanInit)
    			throws NoSuchBeanDefinitionException {
    
    		String beanName = transformedBeanName(name);
    		boolean isFactoryDereference = BeanFactoryUtils.isFactoryDereference(name);
    
    		// Check manually registered singletons.singletonObjects不存在单例对象,并且也不在创建过程中,直接返回null
                    //从单例容器中获取实例对象,此时beanName = userServiceImpl;
    		Object beanInstance = getSingleton(beanName, false);
    		if (beanInstance != null && beanInstance.getClass() != NullBean.class) {
    			if (beanInstance instanceof FactoryBean) {
    				if (!isFactoryDereference) {
    					Class<?> type = getTypeForFactoryBean((FactoryBean<?>) beanInstance);
    					return (type != null && typeToMatch.isAssignableFrom(type));
    				}
    				else {
    					return typeToMatch.isInstance(beanInstance);
    				}
    			}
    			else if (!isFactoryDereference) {
    				if (typeToMatch.isInstance(beanInstance)) {
    					// Direct match for exposed instance?
    					return true;
    				}
    				else if (typeToMatch.hasGenerics() && containsBeanDefinition(beanName)) {
    					// Generics potentially only match on the target class, not on the proxy...
    					RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    					Class<?> targetType = mbd.getTargetType();
    					if (targetType != null && targetType != ClassUtils.getUserClass(beanInstance)) {
    						// Check raw class match as well, making sure it's exposed on the proxy.
    						Class<?> classToMatch = typeToMatch.resolve();
    						if (classToMatch != null && !classToMatch.isInstance(beanInstance)) {
    							return false;
    						}
    						if (typeToMatch.isAssignableFrom(targetType)) {
    							return true;
    						}
    					}
    					ResolvableType resolvableType = mbd.targetType;
    					if (resolvableType == null) {
    						resolvableType = mbd.factoryMethodReturnType;
    					}
    					return (resolvableType != null && typeToMatch.isAssignableFrom(resolvableType));
    				}
    			}
    			return false;
    		}
    		else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
    			// null instance registered
    			return false;
    		}
    
    		// No singleton instance found -> check bean definition.
    		BeanFactory parentBeanFactory = getParentBeanFactory();
    		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
    			// No bean definition found in this factory -> delegate to parent.
    			return parentBeanFactory.isTypeMatch(originalBeanName(name), typeToMatch);
    		}
    
    		// Retrieve corresponding bean definition.
    		RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    		BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();
    
    		// Setup the types that we want to match against
    		Class<?> classToMatch = typeToMatch.resolve();
    		if (classToMatch == null) {
    			classToMatch = FactoryBean.class;
    		}
    		Class<?>[] typesToMatch = (FactoryBean.class == classToMatch ?
    				new Class<?>[] {classToMatch} : new Class<?>[] {FactoryBean.class, classToMatch});
    
    
    		// Attempt to predict the bean type
    		Class<?> predictedType = null;
    
    		// We're looking for a regular reference but we're a factory bean that has
    		// a decorated bean definition. The target bean should be the same type
    		// as FactoryBean would ultimately return.
    		if (!isFactoryDereference && dbd != null && isFactoryBean(beanName, mbd)) {
    			// We should only attempt if the user explicitly set lazy-init to true
    			// and we know the merged bean definition is for a factory bean.
    			if (!mbd.isLazyInit() || allowFactoryBeanInit) {
    				RootBeanDefinition tbd = getMergedBeanDefinition(dbd.getBeanName(), dbd.getBeanDefinition(), mbd);
    				Class<?> targetType = predictBeanType(dbd.getBeanName(), tbd, typesToMatch);
    				if (targetType != null && !FactoryBean.class.isAssignableFrom(targetType)) {
    					predictedType = targetType;
    				}
    			}
    		}
    
    		// If we couldn't use the target type, try regular prediction.
    		if (predictedType == null) {
    			predictedType = predictBeanType(beanName, mbd, typesToMatch);
    			if (predictedType == null) {
    				return false;
    			}
    		}
    
    		// Attempt to get the actual ResolvableType for the bean.
    		ResolvableType beanType = null;
    
    		// If it's a FactoryBean, we want to look at what it creates, not the factory class.
    		if (FactoryBean.class.isAssignableFrom(predictedType)) {
    			if (beanInstance == null && !isFactoryDereference) {
    				beanType = getTypeForFactoryBean(beanName, mbd, allowFactoryBeanInit);
    				predictedType = beanType.resolve();
    				if (predictedType == null) {
    					return false;
    				}
    			}
    		}
    		else if (isFactoryDereference) {
    			// Special case: A SmartInstantiationAwareBeanPostProcessor returned a non-FactoryBean
    			// type but we nevertheless are being asked to dereference a FactoryBean...
    			// Let's check the original bean class and proceed with it if it is a FactoryBean.
    			predictedType = predictBeanType(beanName, mbd, FactoryBean.class);
    			if (predictedType == null || !FactoryBean.class.isAssignableFrom(predictedType)) {
    				return false;
    			}
    		}
    
    		// We don't have an exact type but if bean definition target type or the factory
    		// method return type matches the predicted type then we can use that.
    		if (beanType == null) {
    			ResolvableType definedType = mbd.targetType;
    			if (definedType == null) {
    				definedType = mbd.factoryMethodReturnType;
    			}
    			if (definedType != null && definedType.resolve() == predictedType) {
    				beanType = definedType;
    			}
    		}
    
    		// If we have a bean type use it so that generics are considered
    		if (beanType != null) {
    			return typeToMatch.isAssignableFrom(beanType);
    		}
    
    		// If we don't have a bean type, fallback to the predicted type
    		return typeToMatch.isAssignableFrom(predictedType);
    	}
    }
    
    • getSingleton
    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    		// Quick check for existing instance without full singleton lock
    		Object singletonObject = this.singletonObjects.get(beanName);
    		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
    			singletonObject = this.earlySingletonObjects.get(beanName);
    			if (singletonObject == null && allowEarlyReference) {
    				synchronized (this.singletonObjects) {
    					// Consistent creation of early reference within full singleton lock
    					singletonObject = this.singletonObjects.get(beanName);
    					if (singletonObject == null) {
    						singletonObject = this.earlySingletonObjects.get(beanName);
    						if (singletonObject == null) {
    							ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
    							if (singletonFactory != null) {
    								singletonObject = singletonFactory.getObject();
    								this.earlySingletonObjects.put(beanName, singletonObject);
    								this.singletonFactories.remove(beanName);
    							}
    						}
    					}
    				}
    			}
    		}
    		return singletonObject;
    	}
    }
    
    • predictBeanType
      其中在预测类型方法中,执行了SmartInstantiationAwareBeanPostProcessor 类型的后置处理器即智能实例化感知Bean后处理器;此处包括两个后置处理器
      0 = {InfrastructureAdvisorAutoProxyCreator@5741}
      1 = {AutowiredAnnotationBeanPostProcessor@6728}
      并且此时两个后置处理器都为空处理,其中InfrastructureAdvisorAutoProxyCreator不是真正的空处理,而是执行逻辑上的空处理,即不符合条件执行;而AutowiredAnnotationBeanPostProcessor默认为空处理,predictBeanType方法返回的还是原目标类型
    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	@Nullable
    	protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
    		Class<?> targetType = determineTargetType(beanName, mbd, typesToMatch);
    		// Apply SmartInstantiationAwareBeanPostProcessors to predict the
    		// eventual type after a before-instantiation shortcut.
    		if (targetType != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			boolean matchingOnlyFactoryBean = typesToMatch.length == 1 && typesToMatch[0] == FactoryBean.class;
    			for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
    				Class<?> predicted = bp.predictBeanType(targetType, beanName);
    				if (predicted != null &&
    						(!matchingOnlyFactoryBean || FactoryBean.class.isAssignableFrom(predicted))) {
    					return predicted;
    				}
    			}
    		}
    		return targetType;
    	}
    
    }
    

    descriptor

    实际上调用的是BeanFactory的getBean方法。beanName = userServiceImpl,进入新的循环获取IUserService的实例对象,然后同上面一样,执行到populateBean方法,
    在populateBean方法中,执行实例化通知后置处理器InstantiationAwareBeanPostProcessor的postProcessProperties方法。执行到CommonAnnotationBeanPostProcessor的injectionMetadataCache方法,此时注入缓存中缓存的是UserServiceImpl依赖的字段:orderService,进过和上面一样的过程,最后执行到descriptor.resolveCandidate方法,即当前方法,随后进入到getBean("orderServiceImpl")的过程。而再首次获取orderServiceImpl的Bean的过程中,从doCreateBean()方法到populateBean过程中,我们执行了几个方法,对实例化而未初始化的Bean进行了预处理,分别是:earlySingletonExposure,此时我们从三级缓存中获取到了实例对象,返回到resolveDependency处,继续依赖注入

    public class DependencyDescriptor extends InjectionPoint implements Serializable {
    	public Object resolveCandidate(String beanName, Class<?> requiredType, BeanFactory beanFactory)
    			throws BeansException {
    		return beanFactory.getBean(beanName);
    	}
    }
    
    • AbstractBeanFactory
      我们继续分析getBean()方法,在执行到doGetBean的方法时,再次调用getSingleton(beanName)方法,而此时经过首次addSingletonFactory方法的处理,三级缓存中已存在exposedObject,所以可以直接返回orderServiceImpl的实例对象,而在从三级缓存中获取到暴露对象之后,会将获取到的实例对象放入二级缓存,并将工厂对象从三级缓存中去除。
    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    		// Quick check for existing instance without full singleton lock
    		Object singletonObject = this.singletonObjects.get(beanName);
    		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
    			singletonObject = this.earlySingletonObjects.get(beanName);
    			if (singletonObject == null && allowEarlyReference) {
    				synchronized (this.singletonObjects) {
    					// Consistent creation of early reference within full singleton lock
    					singletonObject = this.singletonObjects.get(beanName);
    					if (singletonObject == null) {
    						singletonObject = this.earlySingletonObjects.get(beanName);
    						if (singletonObject == null) {
    							ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
    							if (singletonFactory != null) {
    								singletonObject = singletonFactory.getObject();
    								this.earlySingletonObjects.put(beanName, singletonObject);
    								this.singletonFactories.remove(beanName);
    							}
    						}
    					}
    				}
    			}
    		}
    		return singletonObject;
    	}
    }
    
    • AbstractBeanFactory
      此时经过三级缓存的功能,sharedInstance 不为空,进入到if里面继续执行getObjectForBeanInstance,返回beanInstance之后,我们不在继续执行else里面的操作,此处进行省略。然后执行adaptBeanInstance方法。

    adaptBeanInstance对BeanInstance进行了类型检查,如果不符合类型,会进行一个类型强转动作。如果转换失败,会进行报错。否则直接返回原实例对象。并返回到[descriptor.resolveCandidate]#(descriptor)方法处,继续进行字段依赖注入。

    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    protected <T> T doGetBean(
    			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
    			throws BeansException {
    
    		String beanName = transformedBeanName(name);
    		Object beanInstance;
    
    		// Eagerly check singleton cache for manually registered singletons.
    		Object sharedInstance = getSingleton(beanName);
    		//此时sharedInstance 不为空,进入到if里面继续执行
    		if (sharedInstance != null && args == null) {
    			if (logger.isTraceEnabled()) {
    				if (isSingletonCurrentlyInCreation(beanName)) {
    					logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
    							"' that is not fully initialized yet - a consequence of a circular reference");
    				}
    				else {
    					logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
    				}
    			}
                            //调用getObjectForBeanInstance获取bean实例
    			beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    		}
    
    		else {
    			// Fail if we're already creating this bean instance:
    			。。。。。。
    		}
    		
    		//自适应实例对象
    		return adaptBeanInstance(name, beanInstance, requiredType);
    	}
    
    	<T> T adaptBeanInstance(String name, Object bean, @Nullable Class<?> requiredType) {
    		// Check if required type matches the type of the actual bean instance.
    		if (requiredType != null && !requiredType.isInstance(bean)) {
    			try {
    				//类型强转动作。如果转换失败,会进行报错
    				Object convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
    				if (convertedBean == null) {
    					throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
    				}
    				return (T) convertedBean;
    			}
    			catch (TypeMismatchException ex) {
    				if (logger.isTraceEnabled()) {
    					logger.trace("Failed to convert bean '" + name + "' to required type '" +
    							ClassUtils.getQualifiedName(requiredType) + "'", ex);
    				}
    				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
    			}
    		}
    		return (T) bean;
    	}
    }
    

    earlySingletonExposure

    如果允许早期暴露单例对象,则进行添加单例工厂的方法,允许被依赖类在获取依赖类的时候,从早期单例工厂中获取暴露的实例对象exposedObject

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    		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));
    		}
    
    	protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    		Object exposedObject = bean;
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
    				exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
    			}
    		}
    		return exposedObject;
    	}
    }
    

    addSingletonFactory主要是对三级缓存进行处理,首先对单例容器进行加锁操作,然后判断如果容器中不存在当前实例对象,则在singletonFactories缓存中添加lambda表达式返回的对象,将早期earlySingletonObjects中的对象移除,并在已注册单例容器中添加当前bean的名称。

    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
    	/**正在创建的Bean名称 */
    	private final Set<String> singletonsCurrentlyInCreation =
    			Collections.newSetFromMap(new ConcurrentHashMap<>(16));
    	/** 单例工厂缓存容器: 对象工厂的Bean名称. */
    	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
    
    	/** 早期单例对象缓存容器: 实例Bean的Bean名称. */
    	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
    
    	/** 已注册的单例对象名称集合, 按注册顺序保存的Bean名称. */
    	private final Set<String> registeredSingletons = new LinkedHashSet<>(256);
    	protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    		Assert.notNull(singletonFactory, "Singleton factory must not be null");
    		synchronized (this.singletonObjects) {
    			if (!this.singletonObjects.containsKey(beanName)) {
    				this.singletonFactories.put(beanName, singletonFactory);
    				this.earlySingletonObjects.remove(beanName);
    				this.registeredSingletons.add(beanName);
    			}
    		}
    	}
    }
    

    getObjectForBeanInstance

    调用AbstractAutowireCapableBeanFactory 的getObjectForBeanInstance之后,继续调用父类AbstractBeanFactory的getObjectForBeanInstance方法,默认返回原实例对象

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
            //currentlyCreatedBean 是一个本地线程变量
    	private final NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean");
    	@Override
    	protected Object getObjectForBeanInstance(
    			Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
                    //此时得到的currentlyCreatedBean = null,此处的
    		String currentlyCreatedBean = this.currentlyCreatedBean.get();
    		if (currentlyCreatedBean != null) {
    			registerDependentBean(beanName, currentlyCreatedBean);
    		}
    
    		return super.getObjectForBeanInstance(beanInstance, name, beanName, mbd);
    	}
    }
    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    	protected Object getObjectForBeanInstance(
    			Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {
    
    		// Don't let calling code try to dereference the factory if the bean isn't a factory.
    		if (BeanFactoryUtils.isFactoryDereference(name)) {
    			if (beanInstance instanceof NullBean) {
    				return beanInstance;
    			}
    			if (!(beanInstance instanceof FactoryBean)) {
    				throw new BeanIsNotAFactoryException(beanName, beanInstance.getClass());
    			}
    			if (mbd != null) {
    				mbd.isFactoryBean = true;
    			}
    			return beanInstance;
    		}
    }
    

    currentlyCreatedBean有什么作用?

    after populateBean->UserServiceImpl

    在允许早期暴露单例对象的情况下,populateBean完之后,再次调用getSingleton()方法,此时allowEarlyReference = false,此时beanName为userServiceImpl,而此时UserServiceImpl的缓存对象在三级缓存中,但此时allowEarlyReference = false,所以userServiceImpl只能从一级缓存SingletonObjects和二级缓存earlySingletonObjects缓存中获取实例对象,肯定返回为空,说明当前实例不是早期暴露实例了,而是已经初始化成功的实例了,不像orderServiceImpl是从三级缓存中获取的。而是一步到位生成成功的。

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    			throws BeanCreationException {
          ......
    		//earlySingletonExposure = true
    		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
    				isSingletonCurrentlyInCreation(beanName));
          ......
          if (earlySingletonExposure) {
    			//此时earlySingletonReference  = null
    			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 " +
    								"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
    					}
    				}
    			}
    		}
    		// Register bean as disposable.
    		//将bean注册为一次性销毁,默认逻辑上执行为空
    		try {
    			registerDisposableBeanIfNecessary(beanName, bean, mbd);
    		}
    }
    

    getSingleton

    singletonFactory.getObject()返回创造的单例对象之后,首先调用finally里的afterSingletonCreation(beanName)方法,判断是否排除检查创建状态和将当前bean name从创建bean对象集合中去除。接着调用addSingleton()方法,将单例对象放入一级缓存中,并从二三级缓存中去除。
    调用addSingleton()方法

    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    		Assert.notNull(beanName, "Bean name must not be null");
    		synchronized (this.singletonObjects) {
    			Object singletonObject = this.singletonObjects.get(beanName);
    			if (singletonObject == null) {
    				if (this.singletonsCurrentlyInDestruction) {
    					throw new BeanCreationNotAllowedException(beanName,
    							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
    							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
    				}
    				if (logger.isDebugEnabled()) {
    					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
    				}
    				beforeSingletonCreation(beanName);
    				boolean newSingleton = false;
    				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
    				if (recordSuppressedExceptions) {
    					this.suppressedExceptions = new LinkedHashSet<>();
    				}
    				try {
    					singletonObject = singletonFactory.getObject();
    					newSingleton = true;
    				}
    				......
    				finally {
    					if (recordSuppressedExceptions) {
    						this.suppressedExceptions = null;
    					}
    					afterSingletonCreation(beanName);
    				}
    				if (newSingleton) {
    					addSingleton(beanName, singletonObject);
    				}
    			}
    			return singletonObject;
    		}
    	}
            //判断是否排除检查创建状态和将当前bean name从创建bean对象集合中去除
    	protected void afterSingletonCreation(String beanName) {
    		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
    			throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
    		}
    	}
    	//将单例对象放入一级缓存中,并从二三级缓存中去除。
    	protected void addSingleton(String beanName, Object singletonObject) {
    		synchronized (this.singletonObjects) {
    			this.singletonObjects.put(beanName, singletonObject);
    			this.singletonFactories.remove(beanName);
    			this.earlySingletonObjects.remove(beanName);
    			this.registeredSingletons.add(beanName);
    		}
    	}
    }
    
    

    doGetBean

    调用getSingleton返回beanInstance之后,继续调用getObjectForBeanInstance(sharedInstance, name, beanName, mbd)方法进行处理,随后调用beanCreation.end()方法和adaptBeanInstance,进行类型强转。返回对象

    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    	protected <T> T doGetBean(
    			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
    			throws BeansException {
    
    		String beanName = transformedBeanName(name);
    		Object beanInstance;
    
    		// Eagerly check singleton cache for manually registered singletons.
    		Object sharedInstance = getSingleton(beanName);
    		if (sharedInstance != null && args == null) {
    			if (logger.isTraceEnabled()) {
    				if (isSingletonCurrentlyInCreation(beanName)) {
    					logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
    							"' that is not fully initialized yet - a consequence of a circular reference");
    				}
    				else {
    					logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
    				}
    			}
    			beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    		}
    
    		else {
    			.....
    
    				// Create bean instance.
    				if (mbd.isSingleton()) {
    					sharedInstance = getSingleton(beanName, () -> {
    						try {
    							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;
    						}
    					});
    					beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    				}
    
    				。。。。。。
    		
    			}
    			catch (BeansException ex) {
    				beanCreation.tag("exception", ex.getClass().toString());
    				beanCreation.tag("message", String.valueOf(ex.getMessage()));
    				cleanupAfterBeanCreationFailure(beanName);
    				throw ex;
    			}
    			finally {
    				beanCreation.end();
    			}
    		}
    
    		return adaptBeanInstance(name, beanInstance, requiredType);
    	}
    
    }
    

    after populateBean->OrderServiceImpl

    和UserServiceImpl不同之处在于,OrderServiceImpl是在循环依赖过程中,从三级缓存中获取的,所以导致在populateBean之后,从缓存中获取时,得到是提前暴露的实例对象,

    
    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    			throws BeanCreationException {
    
    		// Instantiate the bean.
    		BeanWrapper instanceWrapper = null;
    		if (mbd.isSingleton()) {
    			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    		}
    		if (instanceWrapper == null) {
    			instanceWrapper = createBeanInstance(beanName, mbd, args);
    		}
    		Object bean = instanceWrapper.getWrappedInstance();
    		Class<?> beanType = instanceWrapper.getWrappedClass();
    		if (beanType != NullBean.class) {
    			mbd.resolvedTargetType = beanType;
    		}
    
    		// Allow post-processors to modify the merged bean definition.
    		......
    		// Eagerly cache singletons to be able to resolve circular references
    		// even when triggered by lifecycle interfaces like BeanFactoryAware.
    		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));
    		}
    
    		// Initialize the bean instance.
    		Object exposedObject = bean;
    		try {
    			populateBean(beanName, mbd, instanceWrapper);
    			exposedObject = initializeBean(beanName, exposedObject, mbd);
    		}
    		catch (Throwable ex) {
    			
    		}
    
    		if (earlySingletonExposure) {
                            //此时获得的是提前暴露的对象,
    			Object earlySingletonReference = getSingleton(beanName, false);
    			if (earlySingletonReference != null) {
                                    //如果暴露Bean和注入的Bean是一个对象,说明Bean没变,所以将早期暴露对象赋值给暴露对象
    				if (exposedObject == bean) {
    					exposedObject = earlySingletonReference;
    				}
    				//否则说明bean在populate过程中变化了,需要进行处理
    				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()) {
    					
    					}
    				}
    			}
    		}
    
    		// Register bean as disposable.
    		try {
    			registerDisposableBeanIfNecessary(beanName, bean, mbd);
    		}
    		catch (BeanDefinitionValidationException ex) {
    			throw new BeanCreationException(
    					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    		}
    
    		return exposedObject;
    	}
    
    }
    

    if (exposedObject == bean) {}else{}什么场景下会出现?

    到此,一个简单的循环依赖过程就梳理完毕。当然还有其他场景,见下篇!【17749s】

  • 相关阅读:
    09暑假总结
    给我同学的一点建议
    委托(一个主窗体统计多个从窗体的按钮单击的次数)
    关于C#写的记事本中一个问题
    IT行业最重要的四件宝我的实习体会
    使用结构、数组、循环和DataGridView写的分数统计小程序
    Visual Studio 2005 打不开,一直停在启动画面问题
    解决Cannot open the disk 'F:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on.
    设计原则笔记
    交叉表组件
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15643629.html
Copyright © 2011-2022 走看看