Spring循环依赖的原理解析

1、什么是循环依赖?

​ 我们使用Spring的时候,在一个对象中注入另一个对象,但是另外的一个对象中也包含该对象。如图:

在Student中包含了teacher的一个属性;

在Teacher中包含有student的属性。这样就形成了一个循环依赖。

2、代码描述

xml配置文件

testCycle.java
private static void testCycle(){ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("cycle.xml");Teacher teacher = applicationContext.getBean(Teacher.class);System.out.println(teacher);Student student = applicationContext.getBean(Student.class);System.out.println(student);}public static void main(String[] args) {testCycle();}
Student.java
public class Student {private Teacher teacher;public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}
}
Teacher.java
public class Teacher {private Student student;public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}
}

3、 测试结果

此处输出的teacher中包含有student对象,student对象中也包含有teacher对象,且包含的对象都是不为null的。

4、为什么能够循环依赖解释

先给出一张图

在Spring创建bean的时候肯定也是一个一个去创建的。首先肯定会先去走一个(Teacher/Student)生命周期。这里以Teacher为例,当Spring去getBean(teacher)的时候,首先会去容器中获取,获取不到就会去创建teacher,当teacher创建完成后,会给teacher的属性(student)赋值,实际上容器中没有student对象,这时候也会去创建student对象,当student创建的时候会去给student中的teacher属性赋值,teacher之前已经创建过了,此时去getBean(teacher)是能够拿到的(注意:此时的teacher中student属性并没有赋值),这样student就创建完成了,那么就会回到teacher的student属性赋值的步骤,此时student已经创建是可以用getBean()拿到的,这样teacher对象就创建完毕了。然后回到第一步去创建student对象,这里student对象在创建teacher的时候就已经创建,可以直接使用getBean()获取到。给student中的属性赋值的时候也是一样,能够直接获取到teacher。自此循环依赖就已经结束了。

5、疑问

  1. 当我在给Teacher属性student的赋值的时候是怎么去getBean()的?
  2. 当给student中属性teacher赋值的时候getBean()为什么能够取到teacher?
  3. 为什么获取到的teacher属性是为完成注入的?

6、源码解释

整体的方法线

先看看源码:

getBean()->doGetBean()

getBean() -> doGetBean() 实际上是 doGetBean 在去获取bean对象

public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)throws BeansException {return doGetBean(name, requiredType, args, false);
}/*** Return an instance, which may be shared or independent, of the specified bean.* 返回指定 bean 的一个实例,该实例可以是共享的,也可以是独立的。*/
@SuppressWarnings("unchecked")
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {// 转换beanName,FactoryBean的情况下beanName为&beanName,这里就是去掉&符号String beanName = transformedBeanName(name);Object beanInstance;// Eagerly check singleton cache for manually registered singletons.// 急切检查单例缓存从手动创建的单例中,获取bean判断是否存在当前beanName的beanObject sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {if (logger.isTraceEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {... 省略代码...}beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// Fail if we're already creating this bean instance:// We're assumably within a circular reference.// 没有获取到,如果已经创建bean的实例,我们在一个循环引用中。当前的bean是否为正在创建中if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.// 检查该工厂中是否存在bean的定义BeanFactory parentBeanFactory = getParentBeanFactory();... 省略代码...if (!typeCheckOnly) {// 标记bean已经创建,正在创建markBeanAsCreated(beanName);}StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate").tag("beanName", name);try {if (requiredType != null) {beanCreation.tag("beanType", requiredType::toString);}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) {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);try {getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// Create bean instance.// 创建bean的实例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.// 从单例缓存中删除实例,它可能已经在这里// 通过创建过程-允许循环引用解析// 删除接收到任何对bean引用的临时beandestroySingleton(beanName);throw ex;}});beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}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);}beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}... 省略代码...finally {beanCreation.end();}}return adaptBeanInstance(name, beanInstance, requiredType);
}

此处传入进来的 beanName 为teacher

doGetBean()->createBean()

分开看

// Create bean instance.
// 创建bean的实例
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.// 从单例缓存中删除实例,它可能已经在这里// 通过创建过程-允许循环引用解析// 删除接收到任何对bean引用的临时beandestroySingleton(beanName);throw ex;}});beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}

重要的点在这里当没有获取到bean的时候就会去调用 createBean 方法,创建bean,最终其实是走的 doCreateBean 方法取创建bean

createBean()->doCreateBean()

这里就到了上面方法线的第四部

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.// BeanWrapper:持有创建出来的BeanBeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {/*** 创建bean的实例* 实例化但是并未初始化,就是没有给bean的属性复制*/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.// 允许增强器修改合并的bean definitionsynchronized (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.// 缓存单例的bean能够解析循环引用// 即使生命周期接口触发像BeanFactoryAware,// 判断当前的bean是否需要提前曝光(加入singletonFactories缓存):bean是单例的&允许循环依赖&bean正在创建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");}// 将bean添加到singletonFactories  也就是说的三级缓存,但是这个地方的属性是没有赋值的addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// 到这里,bean就已经实例化完成,并且将bean放入到了singletonFactories缓存中// Initialize the bean instance.// 初始化bean的实例Object exposedObject = bean;try {/*** 填充bean,填充Bean的属性*/populateBean(beanName, mbd, instanceWrapper);/*** 去执行*     BeanPostProcessor的postProcessBeforeInitialization方法* */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 " +"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.// 将bean注册为一次性的try {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;
}

分开解释 doCreateBean 方法

// Instantiate the bean.// BeanWrapper:持有创建出来的BeanBeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {/*** 创建bean的实例* 实例化但是并未初始化,就是没有给bean的属性复制*/instanceWrapper = createBeanInstance(beanName, mbd, args);}

初始化 bean ,这个地方开始调用 createBeanInstance 方法创建一个bean的实例

// Eagerly cache singletons to be able to resolve circular references
// even when triggered by lifecycle interfaces like BeanFactoryAware.
// 缓存单例的bean能够解析循环引用
// 即使生命周期接口触发像BeanFactoryAware,
// 判断当前的bean是否需要提前曝光(加入singletonFactories缓存):bean是单例的&允许循环依赖&bean正在创建
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");}// 将bean添加到singletonFactories  也就是说的三级缓存,但是这个地方的属性是没有赋值的addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}

记住 addSingletonFactory() 方法,这是循环依赖的核心

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {Assert.notNull(singletonFactory, "Singleton factory must not be null");synchronized (this.singletonObjects) {if (!this.singletonObjects.containsKey(beanName)) {// 将beanName,singletonFactory放入到单例工厂的缓存【beanName-singletonFactory】this.singletonFactories.put(beanName, singletonFactory);// 从早起的单例对象缓存中移除【beanName-bean实例】this.earlySingletonObjects.remove(beanName);// 将beanName添加到已经注册的实例中this.registeredSingletons.add(beanName);}}
}

此处存入的 singletonFactory 是一个lambda表达式, ObjectFactory 是一个函数接口,当执行 getObject 方法的时候会去调用存入的 getEarlyBeanReference(beanName, mbd, bean)

doCreateBean() -> createBeanInstance()

这里也没什么好说的就是通过反射去创建Teacher对象

createBeanInstance() -> populateBean()

这里就是开始给创建的Teacher属性student赋值了

/*** Populate the bean instance in the given BeanWrapper with the property values* from the bean definition.* @param beanName the name of the bean* @param mbd the bean definition for the bean* @param bw the BeanWrapper with bean instance* 允许属性值填充给BeanWrapper中的Bean实例*/@SuppressWarnings("deprecation")  // for postProcessPropertyValues  后处理属性值protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {... 省略代码 ...// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the 给所有InstantiationAwareBeanPostProcessors有修改的机会// state of the bean before properties are set. This can be used, for example,// to support styles of field injection.// 设置属性之前bean的状态,例如// 支持字段注入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;}/*** 有没有实例化的AwareBeanPostProcessor*/boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();/*** 是否需要深度检查*/boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);if (hasInstAwareBpps) {if (pvs == null) {pvs = mbd.getPropertyValues();}for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);if (pvsToUse == null) {return;}pvs = pvsToUse;}}if (needsDepCheck) {PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);checkDependencies(beanName, mbd, filteredPds, pvs);}if (pvs != null) {// 应用给定的属性值,解决任何在这个bean工厂运行时它bean的引用。必须使用深copy。所以不会永久的修改此属性applyPropertyValues(beanName, mbd, bw, pvs);}}

分开解析

if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {return;}}}

InstantiationAwareBeanPostProcessor 的方法 postProcessAfterInstantiation ,该方法的返回值是boolean,如果返回true,则什么都不干,如果返回false,那么此类则不会进行自动装配(属性填充),这里就是可以让我们通过 postprocessor 的方式控制某些bean不用属性填充。这里很明显如果我们没做特殊处理,这里最里面的if的return是不会被执行到的。

if (pvs != null) {// 应用给定的属性值,解决任何在这个bean工厂运行时它bean的引用。必须使用深copy。所以不会永久的修改此属性applyPropertyValues(beanName, mbd, bw, pvs);}

这里就是给Teacher的student属性赋值的

/*** Apply the given property values, resolving any runtime references* to other beans in this bean factory. Must use deep copy, so we* don't permanently modify this property.* @param beanName the bean name passed for better exception information* @param mbd the merged bean definition* @param bw the BeanWrapper wrapping the target object* @param pvs the new property values*  应用给定的属性值,解析对此 bean 工厂中其他 bean 的任何运行时引用。必须使用深拷贝,所以我们不会永久修改这个属性*/
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {if (pvs.isEmpty()) {// 如果pvs没有propertyValues,直接结束return;}MutablePropertyValues mpvs = null;List<PropertyValue> original;if (pvs instanceof MutablePropertyValues) {mpvs = (MutablePropertyValues) pvs;if (mpvs.isConverted()) {// Shortcut: use the pre-converted values as-is.try {bw.setPropertyValues(mpvs);return;}catch (BeansException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", ex);}}original = mpvs.getPropertyValueList();}else {original = Arrays.asList(pvs.getPropertyValues());}TypeConverter converter = getCustomTypeConverter();if (converter == null) {converter = bw;}BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);// Create a deep copy, resolving any references for values. 创建一个深copy,解析任何引用值List<PropertyValue> deepCopy = new ArrayList<>(original.size());boolean resolveNecessary = false;for (PropertyValue pv : original) {if (pv.isConverted()) {deepCopy.add(pv);}else {// 获取属性的名称String propertyName = pv.getName();// 获取属性的值Object originalValue = pv.getValue();if (originalValue == AutowiredPropertyMarker.INSTANCE) {Method writeMethod = bw.getPropertyDescriptor(propertyName).getWriteMethod();if (writeMethod == null) {throw new IllegalArgumentException("Autowire marker for property without write method: " + pv);}originalValue = new DependencyDescriptor(new MethodParameter(writeMethod, 0), true);}// 解析属性值Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);Object convertedValue = resolvedValue;boolean convertible = bw.isWritableProperty(propertyName) &&!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);if (convertible) {convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);}// Possibly store converted value in merged bean definition,// in order to avoid re-conversion for every created bean instance.if (resolvedValue == originalValue) {if (convertible) {pv.setConvertedValue(convertedValue);}deepCopy.add(pv);}else if (convertible && originalValue instanceof TypedStringValue &&!((TypedStringValue) originalValue).isDynamic() &&!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {pv.setConvertedValue(convertedValue);deepCopy.add(pv);}else {resolveNecessary = true;deepCopy.add(new PropertyValue(pv, convertedValue));}}}if (mpvs != null && !resolveNecessary) {mpvs.setConverted();}// Set our (possibly massaged) deep copy.try {bw.setPropertyValues(new MutablePropertyValues(deepCopy));}catch (BeansException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Error setting property values", ex);}
}

解析属性值

Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);

此处会直接走到 resolveReference 方法中去

/*** Resolve a reference to another bean in the factory.解析对另一个bean的引用*/
@Nullable
private Object resolveReference(Object argName, RuntimeBeanReference ref) {try {// 用来存放实例化出来的beanObject bean;// 获取bean的类型Class<?> beanType = ref.getBeanType();if (ref.isToParent()) {BeanFactory parent = this.beanFactory.getParentBeanFactory();if (parent == null) {... 省略代码 ...}else {String resolvedName;if (beanType != null) {... 省略代码... }else {resolvedName = String.valueOf(doEvaluate(ref.getBeanName()));// 获取resolvedName的bean对象bean = this.beanFactory.getBean(resolvedName);}// 注册依赖的beanthis.beanFactory.registerDependentBean(resolvedName, this.beanName);}if (bean instanceof NullBean) {bean = null;}return bean;}catch (BeansException ex) {throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName,"Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex);}
}

方法会走到这里去getBean() 之前的getBean还没走完是不是有走到getBean(),从这里开始就是套娃。

resolvedName = String.valueOf(doEvaluate(ref.getBeanName()));// 获取resolvedName的bean对象bean = this.beanFactory.getBean(resolvedName);}// 注册依赖的bean

到此处就会去寻找Student的实例,就会走一遍之前的方法,但是走到 pupolate() 方法的时候给student的teacher属性赋值,会去容器中获取一个teacher,还记得之前存在singletonFactories中的teacher吗?这里获取的时候就会直接拿到之前的存储的teacher。下面看一看

省略之前创建个逻辑,直接到赋值的操作

到这里就开始去获取teacher对象了,看一下 getSingleton() 方法是怎么拿的;

protected Object getSingleton(String beanName, boolean allowEarlyReference) {// Quick check for existing instance without full singleton lock// 从单例对象缓存(singletonObjects--一级缓存)中获取bean对象Object singletonObject = this.singletonObjects.get(beanName);// 如果单例对象中没有找到,并且改bean正在创建中if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {// 从早期单例对象缓存中获取单例对象(之所以成为早期单例对象,是因为earlySingletonObjects里面// 的对象都是通过提前曝光的ObjectFactory创建出来的。还没有进行属性填充等操作)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) {// 当某些方法需要提前初始化的时候则会调用addSingletonFactory方法将对应的objectFactory初始化策略储存在singletonFactories中ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {// 如果存在单例对象工厂,则使用该工厂创建一个单例对象singletonObject = singletonFactory.getObject();// 创建的单例对象放如早期单例对象缓存中this.earlySingletonObjects.put(beanName, singletonObject);// 移除对应的单例对象工厂this.singletonFactories.remove(beanName);}}}}}}return singletonObject;
}

这里拿到了之前存入 singletonFactories Map中的lambda表达式,调用 getObject() 方法去执行 getEarlyBeanReference 方法

/*** Obtain a reference for early access to the specified bean,* typically for the purpose of resolving a circular reference.* @param beanName the name of the bean (for error handling purposes)* @param mbd the merged bean definition for the bean* @param bean the raw bean instance* @return the object to expose as bean reference** 获得对指定bean的早期访问的引用 通常用于解析循环依赖*/
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {// 默认最终公开的对象是bean,通过createBeanInstance创建出来的普通对象Object exposedObject = bean;// mbd的synthetic属性:设置bean定义是否是synthetic的,一般是指只有AOP相关的pointCut配置或者advice配置才会将synthetic设置为true// 如果mbd不是synthetic且此工厂拥有InstantiationAwareBeanPostProcessorif (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {// 遍历工厂的所有后置处理器,并获取smartInstantiationAware-ArrayListfor (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {// 让exposedObject对象经过每一个smartInstantiationAwareBeanPostProcessor报装exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);}}// 返回最终经过层次报装后的对象return exposedObject;
}

这个方法没有什么好解释的,注释很明确的表明了方法的作用

拿到teacher之后就给Student中的teacher属性赋值

resolveNecessary = true;
deepCopy.add(new PropertyValue(pv, convertedValue));

就此Student对像创建完毕,会将创建完成的Student对象放入

try {// 去容器中获取bean对象singletonObject = singletonFactory.getObject();newSingleton = true;
}
catch (IllegalStateException ex) {// Has the singleton object implicitly appeared in the meantime ->// if yes, proceed with it since the exception indicates that state.singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {throw ex;}
}
catch (BeanCreationException ex) {if (recordSuppressedExceptions) {for (Exception suppressedException : this.suppressedExceptions) {ex.addRelatedCause(suppressedException);}}throw ex;
}
finally {if (recordSuppressedExceptions) {this.suppressedExceptions = null;}afterSingletonCreation(beanName);
}
if (newSingleton) {// 将beanName和singletonObject的映射关系添加到该工厂的单例缓存中addSingleton(beanName, singletonObject);
}

addSingleton(beanName, singletonObject); 放入缓存中

至此会返回去给Teacher中的student属性赋值。至此一次的循环依赖就完成了。Spring还回去创建Student对象,但是这次容器中存在直接取出来就可以了。

疑问解答

为什么最后还要去创建一次Student对象,因为开始创建Student对象是因为创建Teacher对象的时候需要使用Student得实例,所以去创建了一次,但是最后一次去创建Student对象的时候不会真的创建,直接从缓存singletonObjects中就能去获取到。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 中国新型基础设施建设(新基建)“十四五”规划及项目投资建议报告2022~2028年

    中国新型基础设施建设(新基建)“十四五”规划及项目投资建议报告2022&#xff5e;2028年 第一章 新型基础设施建设的基本概述 1.1 新型基础设施建设的定义及特点 1.1.1 基本内涵 1.1.2 主要特点 1.1.3 层次划分 1.2 新型基础设施建设的深刻内涵 1.2.1 新的地区 1.2.2 新的方式…...

    2024/4/14 9:04:26
  2. Windows7 tls加密协议设置导致的邮件收发问题 WLM 0x800CCC0B、0x800CCC0F

    没找到比较明确的解决办法&#xff0c;偶然看到微软的文档&#xff0c;悟了&#xff0c;自己笔记一下 出现问题的原因&#xff0c;服务器做了升级 update exchange 2016 to 2019 update windows server 2016 to 2022 客户端环境&#xff1a;Windows 7 SP1 Windows Live Mai…...

    2024/5/4 0:04:20
  3. 培养Pythonic思维——第1条 查询自己使用的Python版本

    编程语言的书写习惯是由用户确定的。这些年来&#xff0c;Python开发界用Pythonic来形容具有特定风格的代码。这种风格&#xff0c;既不是一套严格的规范&#xff0c;也不是由编译器强加给开发者的一套规则&#xff0c;而大家在使用Python语言及合作的过程中逐渐形成的习惯。Py…...

    2024/4/14 9:04:31
  4. 小朋友的阅读启蒙小伙伴,昫爸小书瞳上手

    学龄前的小朋友求知欲都很旺盛,大家因为平时精力有限,所以最好给孩子们准备一些可以自主学习的小工具,现在市面上这类产品不少,像是故事机、点读机之类的,都很容易吸引孩子的注意力,上周我收到了一款昫爸小书瞳,是一种可以手指点读的学习机,可以帮助孩子识文断字。 昫爸…...

    2024/4/7 15:47:58
  5. SpringBoot(相对SpringMVC)新增异常处理

    &#xff08;1&#xff09;设置具体的状态码页面 在templates/下新建error文件夹&#xff0c;在error中新建&#xff1a;状态码.html的页面。例如当出现500时&#xff0c;显示的页面为500.html &#xff08;2&#xff09;使用x进行模糊匹配 当出现5开头状态码的错误时&#xff…...

    2024/4/14 9:04:11
  6. 利用python渲染IPsec配置

    文章目录前言一、基础环境组网环境总部出口路由器的主要基础配置分支出口路由器的主要基础配置二、书写IPsec的jinja2配置模板为什么需要在适配IPsec的公网NAT ACL规则上先拒绝掉走IPsec的流量二、书写IPsec的渲染脚本四、运行python脚本&#xff0c;根据提示输入参数&#xff…...

    2024/4/7 15:47:56
  7. HTML结构

    HTMl骨架结构...

    2024/4/16 14:27:57
  8. 【MarkDown学习】

    MarkDown学习 标题 三级标题 四级标题 字体 Hellow hellow hellow Helloween 引用 世上无难事&#xff0c;只怕有心人。 分割线 图片 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eq5IcfRU-1642836338701)(C:\Users\lenovo\Pictures\Cam…...

    2024/4/14 9:04:36
  9. 电脑重置网络

    1、键盘WinR键&#xff0c;弹出窗口 2、然后在里面输入cmd输入CMD 3、出现的命令提示框内输入“netsh winsock reset"按”Enter“键 4、重启电脑后生效。...

    2024/4/15 20:23:57
  10. String、StringBuffer与StringBuilder

    StringStringBufferStringBuilderString的值是不可变的&#xff0c;这就导致每次对String的操作都会生成新的String对象&#xff0c;不仅效率低下&#xff0c;而且浪费大量优先的内存空间StringBuffer是可变类&#xff0c;和线程安全的字符串操作类&#xff0c;任何对它指向的字…...

    2024/4/18 13:25:33
  11. jsp简介

    jsp的全称是 Java Server Pages Java的服务器页面 jsp的主要作用是代替Servlet程序回传数据 jsp的本质 jsp页面本质就是一个servlet程序 基础的jsp页面 <% page contentType"text/html;charsetUTF-8" language"java" %> <html><head>…...

    2024/4/14 9:04:36
  12. 机器学习:4.机器学习 --- 朴素贝叶斯分类器

    第1关&#xff1a;条件概率 1、P(AB)表示的是事件A与事件B同时发生的概率&#xff0c;P(A|B)表示的是事件B已经发生的条件下&#xff0c;事件A发生的概率。 A、对 B、错 A2、从1,2,…,15中小明和小红两人各任取一个数字&#xff0c;现已知小明取到的数字是5的倍数&#xff0c…...

    2024/5/4 3:44:03
  13. javase 对象的一对一、一对多和多对多关系

    一对多的关系会通过中间类来实现 一般情况下&#xff0c;多对多用得比较多&#xff0c;他们中间都有作为连接的类别...

    2024/4/18 8:50:02
  14. 第4章-8 求分数序列前N项和 (15 分)

    本题要求编写程序&#xff0c;计算序列 2/13/25/38/5… 的前N项之和。注意该序列从第2项起&#xff0c;每一项的分子是前一项分子与分母的和&#xff0c;分母是前一项的分子。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中输出部分和的值&#xff0c;精确到小…...

    2024/5/3 5:56:00
  15. 极简风格待办哪个好用?记录日常待办的小清新便签

    一款好用的待办工具&#xff0c;不仅可以帮助我们记事&#xff0c;还可以规划我们一天的工作&#xff0c;让我们轻轻松松地完成自己该做的事情&#xff0c;而不至于因为事情太多堆在一起&#xff0c;让自己焦头烂额。那么哪款日常待办应用好用呢&#xff1f;对于忙碌的职场人士…...

    2024/5/3 0:03:35
  16. 2021最新版kali-2021-4a 更新源

    Kali 系统换源 1.使用leafpad编辑器打开系统源文本&#xff08;也可用vim&#xff09; leafpad /etc/apt/sources.list 如果提示没有安装&#xff0c;输入y安装即可 2.填写源文本(源文本无硬性要求&#xff0c;这里我用的是阿里的) #阿里云 deb http://mirrors.aliyun.com/…...

    2024/5/3 1:41:49
  17. Tinymce富文本自定义行距

    项目中 toolbar 是抽离出来一个单独文件配置工具栏控件的&#xff0c;toolbar.js&#xff1a; const toolbar [styleselect fontselect fontsizeselect formatselect searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent b…...

    2024/4/7 15:47:49
  18. .NET 6 中 System.Text.Json 的新特性

    1支持忽略循环引用 在 .NET 6 之前&#xff0c;如果 System.Text.Json 检测到循环引用&#xff0c;就会抛出 JsonException 异常。在 .NET 6 中&#xff0c;你可以忽略它们。 Category dotnet new() {Name ".NET 6", }; Category systemTextJson new() {Name &…...

    2024/4/14 9:04:41
  19. 怎么写一个高性能应用?

    首先声明&#xff0c;这不是写一个高性能应用的唯一选择&#xff0c;只是自己实践后的一些心得分享。 开发前定个小目标 有目标的好处是不会降配开发&#xff0c;也不会过度开发 目标指标&#xff1a;并发数&#xff0c;TPS&#xff0c;响应时间等 1、模块独立性让路高性能&a…...

    2024/4/14 9:04:31
  20. Mysql事物的四大特性,隔离级别

    关系型数据事务4大特性: 原子性: 一次事务过程中的多个操作要么都成功,要么都失败. 持久性: 事务一旦提交,数据就不可改变.即使数据库服务出现问题. 隔离性: 数据库是允许同时有多个事务进行访问, 这时就需要对多个事务间的操作进行隔离, 隔离分为4个级别: 读未提交 问题 …...

    2024/5/3 11:01:31

最新文章

  1. 论文辅助笔记:Tempo 之 model.py

    0 导入库 import math from dataclasses import dataclass, asdictimport torch import torch.nn as nnfrom src.modules.transformer import Block from src.modules.prompt import Prompt from src.modules.utils import (FlattenHead,PoolingHead,RevIN, )1TEMPOConfig 1.…...

    2024/5/4 12:04:38
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 蓝桥杯第十五届抱佛脚(十)贪心算法

    蓝桥杯第十五届抱佛脚&#xff08;十&#xff09;贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法&#xff0c;它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是最好或最优的算法。 贪…...

    2024/5/2 2:39:45
  4. 最新在线工具箱网站系统源码

    内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上…...

    2024/5/3 2:32:18
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57