Spring源码阅读之bean对象的创建过程
Spring源码阅读之bean对象的创建过程
Spring是通过IOC容器来管理对象的,该容器不仅仅只是帮我们创建了对象那么简单,它负责了对象的整个生命周期-创建、装配、销毁。这种方式成为控制反转(组件对象控制权的转移,从程序代码本身转移到了外部容器,容器创建完对象后注入组件中)。
Spring的核心的是容器,不过这个容器并不是唯一的,框架本身就提供了很多个容器的实现,大概分为两种类型:
- BeanFactory:最简单的容器,只能提供基本的DI(依赖注入)功能。
- ApplicationContext(应用上下文):继承自BeanFactory,它能提供更多企业级的服务,例如解析配置文本信息等等,这也是ApplicationContext实例对象最常见的应用场景。
简单说说这两种方式的区别:
- 原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用
- ApplicationContext利用MessageSource进行国际化 并有着事件机制。
- ApplicationContext扩展了ResourceLoader(资源加载器)接口,从而可以用来加载多个Resource,而BeanFactory是没有扩展ResourceLoader
- 与BeanFactory通常以编程的方式被创建不同的是,ApplicationContext能以声明的方式创建,如使用ContextLoader。当然你也可以使用ApplicationContext的实现之一来以编程的方式创建ApplicationContext实例 。
- BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。
ApplicationContext 介绍
如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在Beanfactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置的方式实现。
ApplicationContext类体系结构:
在上一篇源码阅读WebContextApplication初始化中说到实际创建的对象为XmlWebApplicationContext
,该类继承了AbstractRefreshableWebApplicationContext
(上图的左下角),也是ApplicationContext体系。那么该对象读取配置文件后是如何创建bean对象的呢?
大致分为两步:
-
实例化BeanDefinition对象(下面分析该对象的作用) 。
-
实例化bean对象。
1. 实例化BeanDefinition对象
WebContextApplication初始化说到初始化的步骤是在ContextLoader
中完成,创建完XmlWebApplicationContext
对象后,通过configureAndRefreshWebApplicationContext()
设置配置文件的位置。
protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {String configLocationParam;if (ObjectUtils.identityToString(wac).equals(wac.getId())) {configLocationParam = sc.getInitParameter("contextId");if (configLocationParam != null) {wac.setId(configLocationParam);} else {wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX + ObjectUtils.getDisplayString(sc.getContextPath()));}}//设置ServletContext环境。wac.setServletContext(sc);/*读取Servlet对象中的contextConfigLocation. ServletContext在创建的时候就读取了<context-param>标签,并将该标签中的配置文件的信息通过键值对的形式保存进来了。*/configLocationParam = sc.getInitParameter("contextConfigLocation");if (configLocationParam != null) {//保存配置文件信息的位置。wac.setConfigLocation(configLocationParam);}//刷新环境wac.refresh();}
配置文件位置设置完成后就需要读取该文件的配置信息,并创建相应的bean对象,这一过程就是在refresh()
中完成的。
通过图中的继承关系往上寻找在AbstractApplicationContext
中发现·refresh
方法,
该方法进行一些初始化操作。
public void refresh() throws BeansException, IllegalStateException {synchronized(this.startupShutdownMonitor) {// 1.刷新前的预处理,包含设置启动时间、设置状态...this.prepareRefresh();//实现刷新BeanFactory,将配置文件解析为BeanDefinition并注册到BeanFactory,此时Bean还未被初始化ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();// BeanFactory的预准备工作this.prepareBeanFactory(beanFactory);try {this.postProcessBeanFactory(beanFactory);// 执行BeanFactoryPostProcessor的方法,BeanFactory的后置处理器 // 在BeanFactory标准初始化之后执行的this.invokeBeanFactoryPostProcessors(beanFactory);// 注册BeanPostProcessor(Bean的后置处理器),用于拦截bean创建过程this.registerBeanPostProcessors(beanFactory);// 初始化MessageSource组件(做国际化功能;消息绑定,消息解析).this.initMessageSource();// 初始化上下文的事件机制this.initApplicationEventMulticaster();// 可以用于子类实现在容器刷新时自定义逻辑初始化this.onRefresh();// 注册时间监听器,将ApplicationListener注册到容器中来this.registerListeners();// 初始化所有剩下的单实例bean,单例bean在初始化容器时创建。this.finishBeanFactoryInitialization(beanFactory);// 发布完成事件,结束初始化过程this.finishRefresh();} catch (BeansException var5) {this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);this.destroyBeans();this.cancelRefresh(var5);throw var5;}}}
obtainFreshBeanFactory
将配置文件解析为BeanDefinition并注册到BeanFactory中
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {// 主要是通过该方法完成IoC容器的刷新this.refreshBeanFactory();ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();if (this.logger.isDebugEnabled()) {this.logger.debug("Bean factory for " + this.getDisplayName() + ": " + beanFactory);}return beanFactory;}
refreshBeanFactory
完成IOC容器的刷新,具体实现是在AbstractRefreshableApplicationContext
中,实际创建的的IOC容器为:DefaultListableBeanFactory
protected final void refreshBeanFactory() throws BeansException {//首先检查是否已经有beanFactory了,有就销毁if (this.hasBeanFactory()) {this.destroyBeans();this.closeBeanFactory();}try {// 创建IoC容器,也就是DefaultListableBeanFactoryDefaultListableBeanFactory beanFactory = this.createBeanFactory();beanFactory.setSerializationId(this.getId());this.customizeBeanFactory(beanFactory);//载入刚创建的IOC容器,具体实现在子类XmlWebApplicationCpntext中this.loadBeanDefinitions(beanFactory);synchronized(this.beanFactoryMonitor) {this.beanFactory = beanFactory;}} catch (IOException var5) {throw new ApplicationContextException("I/O error parsing bean definition source for " + this.getDisplayName(), var5);}}
loadBeanDefinitions
装载刚创建的IOC容器,具体实现在XmlWebApplicationCpntext
中。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {// 创建一个BeanDefinition阅读器,通过阅读XML文件,真正完成BeanDefinition的加载和注册XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);//beanDefinitionReaderde 初始化操作beanDefinitionReader.setEnvironment(this.getEnvironment());beanDefinitionReader.setResourceLoader(this);beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));this.initBeanDefinitionReader(beanDefinitionReader);this.loadBeanDefinitions(beanDefinitionReader);}
//方法重载
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {/*在上一篇文章中ContextLoader中的configureAndRefreshWebApplicationContext方法有这一段代码configLocationParam = sc.getInitParameter("contextConfigLocation");if (configLocationParam != null) {//保存配置文件信息的位置。wac.setConfigLocation(configLocationParam);}这里就是读取配置文件的信息,保存进数组中。*/String[] configLocations = this.getConfigLocations();if (configLocations != null) {String[] var3 = configLocations;int var4 = configLocations.length;for(int var5 = 0; var5 < var4; ++var5) {String configLocation = var3[var5];//具体的装载方法在XmlBeanDefinitionReaderreader.loadBeanDefinitions(configLocation);}}}
接下来看XmlBeanDefinitionReader
中的loadBeanDefinitions()
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {// 对配置文件进行编码处理return this.loadBeanDefinitions(new EncodedResource(resource));
}
//截取主要代码
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {try {//将配置文件转换成流对象InputStream inputStream = encodedResource.getResource().getInputStream();try {// 从InputStream中得到XML的解析源InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {inputSource.setEncoding(encodedResource.getEncoding());}// 这里是具体的读取过程,var5等于新注册的BeanDefintion数量var5 = this.doLoadBeanDefinitions(inputSource, encodedResource.getResource());} finally {inputStream.close();}}
具体的读取过程在doLoadBeanDefinitions()
中,该方法的主要作用就是:
- 一个是对XML文件进行DOM解析
- 一个是完成BeanDefinition对象的加载与注册
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException {try {//把资源文件转换成Document对象Document doc = this.doLoadDocument(inputSource, resource);// 通过对Document对象的操作,完成BeanDefinition的加载和注册工作return this.registerBeanDefinitions(doc, resource);}Catch(){}}
看看registerBeanDefinitions()
具体完成了哪些操作:
- 创建DefaultBeanDefinitionDocumentReader用来解析Document对象。
- 获得容器中已注册的BeanDefinition数量
- 委托给DefaultBeanDefinitionDocumentReader来完成BeanDefinition的加载、注册工作。
- 统计新注册的BeanDefinition数量
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {// 1.BeanDefinitionDocumentReader documentReader = this.createBeanDefinitionDocumentReader();documentReader.setEnvironment(this.getEnvironment());// 2.int countBefore = this.getRegistry().getBeanDefinitionCount();// 3. 解析过程入口,BeanDefinitionDocumentReader只是个接口,具体的实现过程在DefaultBeanDefinitionDocumentReader完成documentReader.registerBeanDefinitions(doc, this.createReaderContext(resource));// 4.return this.getRegistry().getBeanDefinitionCount() - countBefore;}
接着看DefaultBeanDefinitionDocumentReader
中的registerBeanDefinitions()
该方法:
- 获得Document的根元素标签
- 真正实现BeanDefinition解析和注册工作
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {this.readerContext = readerContext;this.logger.debug("Loading bean definitions");//获取文档对象的子节点。Element root = doc.getDocumentElement();//真正的解析注册方法this.doRegisterBeanDefinitions(root);}
到这一步接下来就是对解析文档中的每一个标签节点,获取标签中的属性。创建AbstractBeanDefinition
对象,并将标签中属性保存进对象中。具体的步骤就不展示了。
综上步骤具体完成了以下操作:
-
创建IoC容器(DefaultListableBeanFactory)
-
加载解析XML文件(最终存储到Document对象中)
-
读取Document对象,并完成BeanDefinition的加载和注册工作
BeanDefinition 在 spring 中贯穿始终,spring 要根据 BeanDefinition 对象来实
例化 bean,只有把解析的标签,扫描的注解类封装成 BeanDefinition 对象,spring
**才能实例化 bean **
上面的步骤只是完成了AbstractApplicationContext中refresh()
这句话(心累…)
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
2. 实例化Bean对象
进入AbstractApplicationContext
中的finishBeanFactoryInitialization()
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {beanFactory.setTempClassLoader((ClassLoader)null);beanFactory.freezeConfiguration();// 实例化剩余的单例bean(非懒加载方式)// 注意事项:Bean的IoC、DI和AOP都是发生在此步骤beanFactory.preInstantiateSingletons();}
进入DefaultListableBeanFactory中的preInstantiateSingletons()方法:
- 通过beanName获取bean实例,如果获取到的实例不满足条件就看最后一行getBean(beanName);
- 核心代码 getBean(beanName);
@Overridepublic void preInstantiateSingletons() throws BeansException {if (this.logger.isDebugEnabled()) {this.logger.debug("Pre-instantiating singletons in " + this);}// 得到Bean定义名称List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// 触发所有非懒加载方式的单例bean的创建for (String beanName : beanNames) {// 遍历得到对应的bean定义信息RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 如果bean不是抽象的,而且是单例的,同时还不是懒加载的,则进行下面的操作if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 如果bean是一个工厂bean,则走下面的方法 ,和普通bean区别就是还可以生成beanif (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {final FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else { // 普通bean走下面的方法getBean(beanName);}}}
进入AbstractBeanFactory通过doGetBean()方法获取Bean的实例(只展示关键代码)
-
通过getSingleton(beanName)方法去缓存中获取单例Bean(第一次初始化,缓存中不存在)
-
如果取出来的bean实例是factoryBean的实例,则需要从factoryBean中产生一个Bean对象
-
根据当前的beanfactory获取父一级的beanFactory,递归查找我们需要的Bean(Bean是早不到的,第一次初始化)
-
获取实例化Bean的BeanDefinition对象
-
一般是单例Bean,用匿名内部类的写法,创建单例Bean
@Overridepublic Object getBean(String name) throws BeansException {// 获取Bean的实例return doGetBean(name, null, null, false);}@SuppressWarnings("unchecked")protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {// 获取bean名称final String beanName = transformedBeanName(name);Object bean;// Eagerly check singleton cache for manually registered singletons.// 从缓存中获取单例beanObject sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) { //如果获取到单例bean,则走下面代码if (logger.isDebugEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}// 如果取出来的Bean实例是FactoryBean的Bean实例,则需要从FactoryBean实例中产生一个对象实例。bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {//如果没有获取到单例bean,则走下面代码try {// 获取要实例化的bean的BeanDefinition对象final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);// 检查该BeanDefinition对象对应的Bean是否是抽象的checkMergedBeanDefinition(mbd, beanName, args);// 如果是单例的Bean,请下面的代码if (mbd.isSingleton()) { //匿名内部类的写法sharedInstance = getSingleton(beanName, () -> {try {// 创建单例Bean的主要方法return createBean(beanName, mbd, args);}catch (BeansException ex) {destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}return (T) bean; }
进一步看看
createBean()
具体实现在AbstractAutowireCapableBeanFactory
中@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException { //省略一些代码try {// 完成Bean实例的创建(实例化、填充属性、初始化)Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean '" + beanName + "'");}return beanInstance;} ****
doCreateBean完成Bean实例的创建(实例化、填充属性、初始化)
- bean初始化第一步,默认调用无参数构造实例化bean
- bean初始化第二步,填充属性(DI依赖注入发生在此步骤)
- bean初始化第三步,调用初始化方法,完成bean的初始化操作AOP发生在此步骤)
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.// 用BeanWrapper来持有创建出来的Bean对象BeanWrapper instanceWrapper = null;// 如果是单例的话,则先把缓存中的bean清除if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}// bean初始化第一步:默认调用无参构造实例化Bean// 构造参数依赖注入,就是发生在这一步// 为了下一步populateBean方法的属性注入做准备if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}// 实例化后的Bean对象final 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));// 如果需要提前暴露单例Bean,则将该Bean放入三级缓存中if (earlySingletonExposure) {if (logger.isDebugEnabled()) {logger.debug("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}// 将刚创建的bean放入三级缓存中singleFactories(key是beanName,value是FactoryBean)addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {// bean初始化第二步:填充属性(DI依赖注入发生在此步骤)populateBean(beanName, mbd, instanceWrapper);// bean初始化第三步:调用初始化方法,完成bean的初始化操作(AOP发生在此步骤)exposedObject = initializeBean(beanName, exposedObject, mbd);} ****************************************** }
进入上面的initializeBean()方法:
- 应用BeanPostProcessor的postProcessBeforeInitialization方法在初始化之前被调用
- 执行初始化方法(先调用InitializingBean的afterPropertiesSet,再调用init-method属性指定的初始化方法,最后BeanPostProcessor的postProcessAfterInitialization)
- 应用BeanPostProcessor的postProcessAfterInitialization方法(AOP代理对象生成)在初始化之后被调用
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {/*判断beanName是哪个接口的的实现类如果bean是BeanNameAware接口的实现类会调用setBeanName方法、如果bean是BeanClassLoaderAware接口的实现类会调用setBeanClassLoader方法、如果是BeanFactoryAware接口的实现类会调用setBeanFactory方法,注入对应的属性值。*/invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {//应用BeanPostProcessor的postProcessBeforeInitialization方法wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//执行初始化方法(先调用InitializingBean的afterPropertiesSet,再调用init-method属性指定的初始化方法)invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {//应用BeanPostProcessor的postProcessAfterInitialization方法(AOP代理对象生成)// AOP是等着对象创建完毕,在进行增强wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}
调用初始化方法invokeInitMethods()
- 判断是否是InitializingBean接口的实现类,如果是县初始化InitializingBean
- 如果不是则调用InitializingBean接口中的afterPropertiesSet方法
- 然后再初始化标签对应的init-method属性中的方法
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)throws Throwable {boolean isInitializingBean = (bean instanceof InitializingBean);// 如果是InitializingBean接口的实现类,则先初始化InitializingBean的实现类if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {if (logger.isDebugEnabled()) {logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");}if (System.getSecurityManager() != null) {try {AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {((InitializingBean) bean).afterPropertiesSet();return null;}, getAccessControlContext());}catch (PrivilegedActionException pae) {throw pae.getException();}}else {// 调用InitializingBean接口的afterPropertiesSet方法((InitializingBean) bean).afterPropertiesSet();}}// 然后再初始化<bean>标签对应的init-method属性中的方法if (mbd != null && bean.getClass() != NullBean.class) {String initMethodName = mbd.getInitMethodName();if (StringUtils.hasLength(initMethodName) &&!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&!mbd.isExternallyManagedInitMethod(initMethodName)) {// 调用自定义的初始化方法invokeCustomInitMethod(beanName, bean, mbd);}}}
在initializeBean方法中调用BeanPostProcessor的applyBeanPostProcessorsAfterInitialization方法
- 在初始化Bean的时候都会调用每一个配置的BeanPostProcessor的方法
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;Iterator var4 = this.getBeanPostProcessors().iterator();do {if (!var4.hasNext()) {return result;}BeanPostProcessor beanProcessor = (BeanPostProcessor)var4.next();//bean初始化后调用result = beanProcessor.postProcessAfterInitialization(result, beanName);} while(result != null);return result;}
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。接口声明如下:
public interface BeanPostProcessor {//bean初始化方法调用前被调用Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;//bean初始化方法调用后被调用Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
至此bean的初始化就完成了。
tProcessor)var4.next();
//bean初始化后调用
result = beanProcessor.postProcessAfterInitialization(result, beanName);
} while(result != null);
return result;}
BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。接口声明如下:```java
public interface BeanPostProcessor {//bean初始化方法调用前被调用Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;//bean初始化方法调用后被调用Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
至此bean的初始化就完成了。
参考:https://www.jianshu.com/p/32dacf644062 作者:GGarrett
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 分布式锁+Redis,解决集群业务数据缓存
文章目录分布式锁1. 分布式锁实现2. 使用redis实现分布式锁学习优化总结redis集群状态下的问题:使用redisson解决分布式锁1. 导入依赖 service-util2. 配置redisson可重入锁(Reentrant Lock)测试代码分布式锁 + AOP实现缓存1. 定义一个注解2. 定义一个切面类加上注解3. 将需…...
2024/4/28 5:04:26 - 1期Java面试题
1期Java面试题==和equals的区别? ==号基本数据类型:比较值 引用数据类型:比较引用地址equalsequals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较HashCode 的作用有那些?一个对象的HashCode就是一个简单的Hash算法的实现,关系到对象在…...
2024/4/28 9:00:51 - 程序设计思维模测 - M3
T1 - 瑞神的序列 题目 瑞神的数学一向是最好的,连强大的咕咕东都要拜倒在瑞神的数学水平之下,虽然咕咕东很苦 恼,但是咕咕东拿瑞神一点办法都没有。 5.1期间大家都出去玩了,只有瑞神还在孜孜不倦的学习,瑞神想到了一个序列,这个序列长度为 ,也就是一共有 个数,瑞神给自己出了一…...
2024/4/28 8:18:14 - 企业财务管理信息化现状思考与探索
从经历过的项目实践看,企业在财务管理信息化建设上,存在缺乏整体观、数据观和价值观。总结之后有以下几个观点:一是,没有或很少将财务信息化融合到企业整体管理信息建设中去。缺少战略和业务上的支持。二是,没有或很少从数据管理的角度来思考财务数据流转和支持财务数据(…...
2024/4/28 4:31:16 - Javascript-冒泡排序
代码如下: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </hea…...
2024/4/28 18:14:39 - 超市
超市 做法 显然,前t天,最多有t个物品。 因此,我们将物品按时间排序,对于第i个物品,将其日期和堆的个数比较。若日期>堆的个数,则可以直接插入,否则会相等,这个时候,则序号和堆顶元素进行比较判断。 问题 可能会有重合数据,直接用结构体重载会发生段错误。 因此在结…...
2024/4/28 12:14:17 - nginx常用命令
使用nginx命令前提条件 进入nginx目录 /usr/lcaol/nginx/sbin/ 查看nginx版本号./nginx -v启动nginx./nginx 查看nginx进程 ps -ef | grep nginx关闭nginx./nginx -s stop重新加载nginx一般情况下,对nginx.conf配置文件(/usr/local/nginx/sbin/conf/下)进行了修改,需要重新…...
2024/4/28 18:43:48 - PHP判断关联数组的键值是否存在,使用empty或isset或array_key_exists
本文目的前几天工作中,需要频繁判断数组中的键值对是否存在,起初使用的”!empty($arr[‘key’])”来判断,觉得这样读起来比较舒服,但是写出的代码无法通过单元测试(单元测试太好了)。排查很久,终于发现,当$arr[‘key’] == 0时,empty仍然返回true,这样破坏了业务逻辑…...
2024/4/24 12:36:31 - 教你如何区别if else和switch case
教你如何区别if else和switch case 注意: if…else会生成一个跳转表来指示实际的case分支的地址,而switch case却需要遍历条件分支直到命中条件。 一. if else的优缺点 (1)if else的优点:if else能应用于更多的场所以if else比较灵活 。 (2)if else的缺点:if else必须…...
2024/4/24 12:36:32 - Java中的注解是什么意思,有什么用
注解是什么 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。 注解可分为三类:一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@…...
2024/4/24 12:36:31 - Python基础05:运算符
# 1、算术运算符 print(123 + 1) # 124 print(10 / 3) # 结果带小数 3.3333333333333335 print(10 // 3) # 结果只保留整数部分 3 print(10 % 3) # 取模、取余数 1 print(10 ** 3) # 取3次方 1000# 2、比较运算符 : > >= < <= == !=# 3、赋值运算符…...
2024/4/24 12:36:27 - 阿里云【名师课堂】Java面向对象开发40:引用传递实际应用
阿里云【名师课堂】Java面向对象开发40:引用传递实际应用首先:定义两个简单Java类:Member、Car改进:类中体现关系、对象间的引用继续改进:在类中新建属性还可以扩展 回顾:复习《阿里云【名师课堂】Java面向对象开发3 ~ 6:类与对象》中的引用传递初次分析部分,链接如下:…...
2024/4/24 12:36:26 - JSP: 深入分析pageContext对象、request内置对象
目录深入分析pageContext对象request内置对象处理请求乱码接收一组参数接收全部请求参数的名称取得上下文名称request其它操作深入分析pageContext对象pageContext只能设置页面上下文的属性信息,但是在整个JSP设计里面,赋予了pageContext更多的功能,这个类可以设置四种属性范…...
2024/4/15 4:29:21 - ps -ef|grep java 命令解析
ps -ef |grep+服务名来对于查询服务是否正常运行ps -ef是显示所有进程的消息中间的|是管道命令 是指ps命令与grep同时执行grep是查找输出包含想要的字符串的行后缀可以加参数-A 显示所有程序。 -e 此参数的效果和指定"A"参数相同。-f 显示UID,PPIP,C与STIME栏位…...
2024/4/15 4:29:20 - Python基础06:流程控制之if判断
语法1: if 条件:代码1代码2代码3age = 18 name = chenholngwei if not age>18:print(f{name} 现在还未成年) print(end) 语法2: if 条件:代码1代码2代码3 else:代码1代码2代码3age = 18 name = chenholngwei if not age>=18:print(f{name} 现在还未成年) else:pri…...
2024/4/15 4:29:19 - springboot2常用技能(@Value、@ConfigurationProperties、自定义配置文件、Junit、多环境配置)
一、使用@Value进行属性配置 1.创建User类,写入属性,重写toString方法。2.在自带的配置文件application.properties中插入值3.在User类中使用@Value进行属性注入4.到controller中注入User类后,直接return回toString方法。5.启动springboot,浏览中可查看运行结果。成功。6.总…...
2024/4/15 4:29:19 - 用户输入整数:如果输入的是1~6的整数,则程序输出:your number is in 1-6.c=(用户输入的数)如果输入的是其他数字,输出:Your number is too large.
var c=parseInt(prompt("请输入一个整数")); if (c>=1&&c<=6){c="you number is in 1~6."+c; } else{c="you number is too large."+c; } console.log(c);...
2024/4/18 18:46:53 - vscode 初学应该安装的实用插件
open in browser 在浏览器中打开,安装后在左侧目录中右键点击会出现 open in browser 选项 Path Intellisense 文件路径提示。 主题: One Dark Theme; vscode-icons 文件图标。 Color-Highlight 在编辑器中高亮显示颜色。 Color Picker 代码的颜色选择器。 Auto Rename Tag 自…...
2024/4/27 13:22:12 - go面向对象
把一类事物的共有的 属性( 字段)和 行为( 方法)提取出来,形成一个 物理模型(结构体)。这种研究问题的方法称为抽象封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作封装的好处 1)…...
2024/4/19 8:44:53 - 人工智能实践:Tensorflow笔记(2)——神经网络优化
文章目录1、预备知识2、神经网络(NN)复杂度3、激活函数4、损失函数5、缓解过拟合6、优化器 1、预备知识 tf.where() 条件语句真返回A,条件语句假返回B tf.where(条件语句,真返回A,假返回B) import tensorflow as tfa = tf.constant([1,2,3,1,1]) b = tf.constant([0,1,3,4,5…...
2024/4/15 4:29:14
最新文章
- AIGC技术的探讨
一、简介 AIGC(人工智能生成内容)技术是利用人工智能自动生产内容的一种方式,它在多个领域中的应用不断扩展,同时也带来了伦理和风险问题的考量。 二、技术应用 AIGC技术在各个领域的应用情况广泛,从文本生成到图像…...
2024/4/28 22:09:01 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 微信小程序的页面交互2
一、自定义属性 (1)定义: 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 (2)如何获取自定义属性的值? 用到target或currentTarget对象的dataset属性可以获取数据 ÿ…...
2024/4/25 11:41:25 - macU盘在电脑上读不出来 u盘mac读不出来怎么办 macu盘不能写入
对于Mac用户来说,使用U盘是很常见的操作,但有时候可能会遇到Mac电脑无法读取U盘的情况,这时候就需要使用一些特定的工具软件来帮助我们解决问题。本文就来告诉大家macU盘在电脑上读不出来是怎么回事,u盘mac读不出来怎么办。 一、m…...
2024/4/24 17:55:52 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/28 13:52:11 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/28 13:51:37 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/28 15:57:13 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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