Spring boot启动源码解读
目录
前言
追源码前的准备
正文
注解的讲解
启动流程源码分析
Spring boot启动的大致模型图
总结
课程推荐(免费)
前言
上篇帖子带小伙伴们入门了Spring boot,使用Spring boot搭建了一个hello world工程,也抛出了疑问,为什么Spring boot不需要任何的配置文件就能启动整个项目。所以本篇帖子从底层挖掘Spring boot如何帮你自动选型和自动配置!
Spring boot的介绍和使用https://blog.csdn.net/qq_43799161/article/details/122789131?spm=1001.2014.3001.5501
追源码前的准备
1.对Spring boot底层有一个大概的了解,掌握Spring boot常用注解
2.准备好hello world项目代码(需要hello world代码的同学可以去上面链接的帖子复制)
3.能够熟练使用idea或者eclipse的debug工具(推荐idea)
4.追Spring boot一定要对Spring底层有一定的了解,掌握Spring常见的注解
5.找到debug的程序的入口(个人建议最好是自己先去找,找到头疼再去找帖子或者视频学习)
前三点算是追源码的万能公式把。
正文
注解的讲解
追源码前,先思考换成你来设计Spring boot你该如何设计?
作为一个脚手架来说,初衷肯定是为了去简化配置操作,所以肯定是整合后端开发常见的环境配置,以及开放一种规范给其他不常见的环境进行配置。那么我们把自动配置的代码写好后,岂不是项目已启动所有的配置都要生效,岂不是会很占用空间,我们可不可以根据用户选择了那些环境从而只生成那些环境的配置呢?
那么,我们该如何找到入口呢?
目前的入口在main方法的@SpringBootApplication注解里,我们追进去看一下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
上面4个注解是规范自带与我们关系不大,我们看到后面3个注解
@ComponentScan注解学过Spring的同学都应该明白,基于注解的形式注入到Spring的IOC容器中,要配置一个配置类来扫描注解,配合@Configuration注解一起使用,那么@Configuration在哪里呢?
看到@SpringBootConfiguration,我们先追进去
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
看到了@Configuration注解。然而3个重要注解我们已经追完2个了,并没有追到我们想要的东西,所以入口肯定是在@EnableAutoConfiguration注解中,所以我们追进去。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
老规矩,上面4个不重要,所以重要的再下面2个注解。先看到@AutoConfigurationPackage
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
重要的就只有@Import(AutoConfigurationPackages.Registrar.class)
追到AutoConfigurationPackages.Registrar.class中
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {register(registry, new PackageImport(metadata).getPackageName());}@Overridepublic Set<Object> determineImports(AnnotationMetadata metadata) {return Collections.singleton(new PackageImport(metadata));}}
不用想都知道追到register()方法中去
其实追到这里就可以不需要往后走了,有看过Spring中IOC源码的同学就能看明白。
首先我们看到registerBeanDefinitions()方法中参数BeanDefinitionRegistry registry就能明白是把数据解析成BeanDefinition对象,并且另外一个参数是AnnotationMetadata metadata这里参数保存的是注解的一些元信息,也就是这个注解使用在哪里的一些信息。再看到register()方法中,就是把数据添加到BeanDefinition中,并且添加到集合中。
博主的Spring中IOC源码解读文章https://blog.csdn.net/qq_43799161/article/details/122371976?spm=1001.2014.3001.5501
而我们追的是自动配置的源码,而这里是把使用注解的类解析成BeanDefinition添加到集合中准备后面注入到IOC容器中,跟我们想要的结果不一样,所以入口就是另外一个注解了@Import(AutoConfigurationImportSelector.class)。我们回到刚开始并且追进去。
@Import注解的作用
简单的说就是标有此注解的类使用注解括号中的配置类。
来到AutoConfigurationImportSelector类中,我们发现类很复杂,此时我们该如何找入口呢?
此时我们要想一下,自动配置肯定是在这里了,其他的路口我们都走完了并没有发现,所以我们在这里的出发点往自动配置的方法走。
此时我们打开全部方法ctrl+F12,我们可以看到有一个getAutoConfigurationEntry()方法,而这个方法又被selectImports()给调用。而selectImports是重写ImportSelector类的方法。此时我们就需要弄懂ImportSelector类的作用,此时我们发现并没有实现ImportSelector,而看到实现了DeferredImportSelector类,所以我们需要弄懂ImportSelector和DeferredImportSelector类的关系
两者都是@Import注解的接口实现。也就是通过实现这两个接口也可以实现@Import的功能,但是他们两者的区别呢?
DeferredImportSelector:在@Configuration其他逻辑之后执行
ImportSelector:在@Configuration其他逻辑之前执行
所以我们知道通过selectImports()方法的返回值就能导入到Spring中。
所以我们就往getAutoConfigurationEntry()方法看。
再看到getCandidateConfigurations()。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}
所以继续往loadFactoryNames()方法里面走。
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = cache.get(classLoader);if (result != null) {return result;}try {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result = new LinkedMultiValueMap<>();while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}}
我们看到FACTORIES_RESOURCE_LOCATION常量,就能明白这里就是在解析自动配置,并且是通过检查META-INF文件夹下是否存在spring.fatories文件夹,而我们看到maven仓库。
就是在解析这些参数,但是我们要思考全部都会解析添加进去吗?
我们随便打开自动配置包下的路径
可以看到 @Conditional系列的标签在对是否添加做了判断,所以就可以证明并不是所有的自动配置都会添加到Spring boot中。
但是随着版本的更新迭代,反正在Spring boot2.2.1版本并不是走这个流程了。我们再思考不走这里还能走哪里呢?
目前唯一没有看的推测的代码就是main()方法中的方法,而main()方法中的代码也就是Spring boot启动的代码,所以我们追一下Spring boot启动源码的同步看否代替了这些步骤呢?
启动流程源码分析
给main()方法给上断点,然后debug开始运行项目。
我们看到SpringApplication()的构造方法
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));this.webApplicationType = WebApplicationType.deduceFromClasspath();setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass();}
对于执行流程我就直接讲重要的代码,并不会讲推理过程和对我们不重要的一些代码,这里我建议大家能追明白大概的同时去强化其他代码,因为存在即合理,其他代码可能是Spring boot和Spring的一些高扩展点!
看到setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));并来上一个断点跳到断点上并且继续追进去。
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = getClassLoader();// Use names and ensure unique to protect against duplicatesSet<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;}
这里是不是跟前面讲解注解的代码比较相似呢?
这行来上断点追进去SpringFactoriesLoader.loadFactoryNames(type, classLoader)
继续往这个方法走loadSpringFactories(classLoader)
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {MultiValueMap<String, String> result = cache.get(classLoader);if (result != null) {return result;}try {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));result = new LinkedMultiValueMap<>();while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);Properties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {result.add(factoryTypeName, factoryImplementationName.trim());}}}cache.put(classLoader, result);return result;}catch (IOException ex) {throw new IllegalArgumentException("Unable to load factories from location [" +FACTORIES_RESOURCE_LOCATION + "]", ex);}}
这里跟注解哪里的代码一样,所以这里就可以证明在Spring boot启动的时候解析了
META-INF/spring.factories中配置的自动配置类的参数并且添加到缓存中。所以我们一路返回继续查看Spring boot后续启动做了一些什么。
// 这里是Spring boot的一些监听接口,高扩展罢了
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 这是找到main方法找哪里,因为我们在启动类中创建一个静态内部内写一个main方法也可以启动容器
this.mainApplicationClass = deduceMainApplicationClass();
刚刚只是SpringApplication构造方法进行的一些初始化步骤,然后我们继续往run()方法里面追。
public ConfigurableApplicationContext run(String... args) {// 创建一个计时器StopWatch stopWatch = new StopWatch();// 计时器开始stopWatch.start();// 创建Spring的上下文对象,方便后面对Spring boot解析的数据给添加到IOC容器中ConfigurableApplicationContext context = null;// Spring boot的异常Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();// 配置一些项目中的环境变量configureHeadlessProperty();//获取到事件监听器,并且获取到之前的解析的事件开始监听SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {// args是我们的启动参数,所以这里也就是将我们的启动参数给封装ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);//Spring boot的环境配置的一些预先处理,因为是web项目所以是servle环境ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 配置系统环境configureIgnoreBeanInfo(environment);// 控制台的Spring大logo的打印Banner printedBanner = printBanner(environment);// 获取到上下文容器(细讲)context = createApplicationContext();// Spring boot的异常处理exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);// 上下文容器的预处理,就是refresh之前的一些准备操作(细讲)prepareContext(context, environment, listeners, applicationArguments, printedBanner);// refresh操作(细讲)refreshContext(context);// refresh之后的一些操作afterRefresh(context, applicationArguments);// 启动时间结束并控制台打印耗时多久stopWatch.stop();if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);}// 调用监听的started方法 算是切换监听的状态listeners.started(context);// 完成容器启动后的一个ApplicationRunner或者CommandLineRunner回调callRunners(context, applicationArguments);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, listeners);throw new IllegalStateException(ex);}try {listeners.running(context);}catch (Throwable ex) {handleRunFailure(context, ex, exceptionReporters, null);throw new IllegalStateException(ex);}return context;}
核心代码都在这里了,都给上了注释,这里只会挑选核心重要的代码来讲解。
看到context = createApplicationContext();给上一个断点,调到这行断点上并且进入。
protected ConfigurableApplicationContext createApplicationContext() {Class<?> contextClass = this.applicationContextClass;if (contextClass == null) {try {switch (this.webApplicationType) {case SERVLET:contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);break;case REACTIVE:contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);break;default:contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);}}catch (ClassNotFoundException ex) {throw new IllegalStateException("Unable create a default ApplicationContext, please specify an ApplicationContextClass", ex);}}return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);}
可以看到使用到switch case的语法来判断用哪个ConfigurableApplicationContext 的实例对象。
因为我们是web项目,所以肯定是SERVLET,此时就是通过反射来获取到Servlet的ApplicationContext的实例对象,所以我们看到DEFAULT_SERVLET_WEB_CONTEXT_CLASS常数值
此时使用idea快捷键连按2下shift全局搜索AnnotationConfigServletWebServerApplicationContext
进来以后,我们发现有三个构造方法,我们全给上断点,看他默认执行那个构造方法,我们直接断点放行,直接来到了无参构造方法。
public AnnotationConfigServletWebServerApplicationContext() {this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this);}
再继续往下之前我认为得弄清楚AnnotationConfigServletWebServerApplicationContext类关系图
关系很复杂,所以证明Spring系列的框架对接口设计非常的细腻扩展点也非常的高。
我们知道只要继承或者是实现了类,就可以拥有父类的全部,所以只要在原本的基础下继承下来再对其扩展。
我们来看看他的父类ServletWebServerApplicationContext
我们可以看到WebServer
其实就能明白这里这里对我们的项目启动的tomcat进行了封装。
再往上的父类观察一下
可以看到这里管理ServletContext上下文
再往上的父类查看一下
发现这里维护了BeanFactory对象,有了BeanFactory岂不是能为所欲为了?
所以Spring系列的源码虽然追起来头疼,继承关系非常的复杂,但是他的扩展是真的牛。
我们回到我们的SpringApplication类中的run方法中给refreshContext()打上断点非常核心的方法。
private void refreshContext(ConfigurableApplicationContext context) {refresh(context);if (this.registerShutdownHook) {try {context.registerShutdownHook();}catch (AccessControlException ex) {// Not allowed in some environments.}}}
继续进入到refresh()方法
protected void refresh(ApplicationContext applicationContext) {Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);((AbstractApplicationContext) applicationContext).refresh();}
ApplicationContext是我们之前反射获取AnnotationConfigServletWebServerApplicationContext。
继续追进refresh()方法
@Overridepublic final void refresh() throws BeansException, IllegalStateException {try {super.refresh();}catch (RuntimeException ex) {stopAndReleaseWebServer();throw ex;}}
注意到super.refresh()方法,super关键字大家都明白是调用父类的方法。我们追进去。
@Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}}
看过Spring源码的小伙伴应该对这个方法已经熟的不能再熟悉了,这里就是一些回调方法,一些方法具体的实现基于实现类中的实现。
此时已经来到了Spring的核心类了,已经不再是Spring boot的类了,所以这里就是把Spring boot解析好的内容通过refresh()方法添加到IOC容器中。
我们看到onRefresh()方法给上一个断点,因为ServletWebServerApplicationContext类重写了此方法,通过此方法初始化一些内容。我们直接放行到onRefresh()
@Overrideprotected void onRefresh() {super.onRefresh();try {createWebServer();}catch (Throwable ex) {throw new ApplicationContextException("Unable to start web server", ex);}}
super.onRefresh()没啥内容,跟我们关系不大,注意到createWebServer()方法我们追进去。
private void createWebServer() {WebServer webServer = this.webServer;ServletContext servletContext = getServletContext();if (webServer == null && servletContext == null) {ServletWebServerFactory factory = getWebServerFactory();this.webServer = factory.getWebServer(getSelfInitializer());}else if (servletContext != null) {try {getSelfInitializer().onStartup(servletContext);}catch (ServletException ex) {throw new ApplicationContextException("Cannot initialize servlet context", ex);}}initPropertySources();}
此时我们的WebServer是空的,并且ServletContext也是空,并没有对其初始化,所以我们进入到第一个if代码块中。
ServletWebServerFactory factory = getWebServerFactory();是将我们的tomcat封装对象注入到IOC容器中,再往下进入到factory.getWebServer(getSelfInitializer());方法中
@Overridepublic WebServer getWebServer(ServletContextInitializer... initializers) {if (this.disableMBeanRegistry) {Registry.disableRegistry();}Tomcat tomcat = new Tomcat();File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat");tomcat.setBaseDir(baseDir.getAbsolutePath());Connector connector = new Connector(this.protocol);connector.setThrowOnFailure(true);tomcat.getService().addConnector(connector);customizeConnector(connector);tomcat.setConnector(connector);tomcat.getHost().setAutoDeploy(false);configureEngine(tomcat.getEngine());for (Connector additionalConnector : this.additionalTomcatConnectors) {tomcat.getService().addConnector(additionalConnector);}prepareContext(tomcat.getHost(), initializers);return getTomcatWebServer(tomcat);}
没错就是对tomcat对象进行一个初始化,我们进入到getTomcatWebServer()方法中。
对其一个初始化和启动tomcat容器。
我们可以看到我们的控制已经输出响应的一个tomcat启动的日志了。
然后就回到refresh()方法中的finishBeanFactoryInitialization(beanFactory);这个就是把beanDefinitionNames集合中的BeanDefinition对象给注入到IOC容器中,创建Bean和添加到容器中的代码这里不多说,可以看博主的Spring IOC容器启动源码解析
Spring ioc容器的启动源码解析https://blog.csdn.net/qq_43799161/article/details/122371976?spm=1001.2014.3001.5502
接着往下走refresh()方法全部执行完一路返回就回到了SpringApplication类中的refreshContext()context.registerShutdownHook();大致就是一个钩子函数,项目运行结束时触发,类容就是创建了一个销毁线程,内容就是close一个资源。我们接着返回。
回到了SpringApplication中的run()方法了,后续没什么重要的内容就是对启动的时间做一个处理输出在控制台,然后事件监听器切换到started状态再切换到running状态。
然后就是判断是否重现ApplicationRunner和CommandLineRunner接口也是一个钩子函数,执行这里方法也是run()方法最后的一个方法,所以就是启动结束后的一个回调函数,也是一个高扩展点。
Spring boot启动的大致模型图
总结
其实追源码前能自己宏观猜测里面的大致步骤是什么,再进去追源码就容易很多。
下节内容手写配置让Spring boot扫描添加到IOC容器中。
课程推荐(免费)
因为人和人之间的思想不可能统一,并且文档来描述一些过程的执行很难描述明白,所以这里我给你们推荐视频课程(免费的,绝对良心推荐)
Spring boot的启蒙思想,但是比较耗时,时间多的小伙伴们强烈推荐https://www.bilibili.com/video/BV1P541147pr?spm_id_from=333.999.0.0非常质量的同时效率还高https://www.bilibili.com/video/BV19K4y1L7MT?p=8
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- [220204] Contiguous Array
Given a binary array nums, return the maximum length of a contiguous subarray with an equal number of 0 and 1. class Solution:def findMaxLength(self, nums):# 记录目前为止的 patterntemp 0res 0mp {0:-1}for i, num in enumerate(nums):if num 0:temp - 1else:…...
2024/4/13 13:35:27 - 后端知识查漏补缺学习轨迹(长期更新)
后端知识查漏补缺学习轨迹(长期更新)2022-02-06尾递归布隆过滤器布隆过滤器原理redis中的布隆过滤器布隆过滤器的应用跳表VS红黑树redis RDB VS AOFRDBAOFHashMap连环问redis的过期策略以及内存淘汰机制redis reactor模型redis key value实现原理2022-02…...
2024/4/17 21:58:23 - [BUUCTF-pwn] ciscn_华北半决赛_2018_pwn1
没有回声有多么可恶。 程序本身不难,一是没有回应这样定位起来很麻烦只能一个个写上别输错了。二是代码有点长,基本上都没啥用。 看了半天发现就菜单3有用。 case 3u:read(0, &v16, 4uLL);v16 htonl(v16);read(0, v14, v16);v6 strtoul(v14, 0LL…...
2024/4/17 7:34:18 - 特征图下采样倍数对原图小目标的影响
...
2024/4/15 11:46:57 - buuctf初学者学习记录--[极客大挑战 2019]BuyFlag
web第20题 [极客大挑战 2019]BuyFlag 打开靶场 无明显线索,直接审计源码 此处看到2个可疑页面 访问index.php就是主页面 访问pay.php 有一些提示,flag需要的金额,用户必须是cuit学生,密码必须正确,查看源码&#x…...
2024/4/13 13:34:57 - xbox 屏幕录制配置
目录 1. 安装 2. 配置 3. 配置xbox 1. 安装 win10 系统默认安装xbox, 未安装/或者卸载的话,请使用Microsoft store安装。然后再配置。 2. 配置...
2024/4/13 13:35:27 - 高频知识点总结 - 01
高频知识点总结 - 01 1.关于i和i 1.1 对字节码的分析 i i 》 先将i取出到操作数栈中,然后让i在局部变量表中自增,自增完以后,将操作数栈中的i赋值给i,所以总体来说,i是自增了的,但是在操作数栈中的i是没…...
2024/4/11 18:24:31 - 如何在发布包中将资源放在独立目录中
如何在发布包中将资源放在独立目录中 在添加资源时,首先资源应该在独立的目录中,然后在添加资源的时候修改一下默认的选择项,就可以。添加后资源目录会变成不同于平常的文件夹,而是蓝色文件夹。 添加方式如下。 参考:https://developer.apple.com/devcenter/ios/index.act…...
2024/4/13 13:35:27 - 潜艇的主动声呐探测信号
简 介: 本文利用时频联系分布算法对于来自于视频中的潜艇主动声呐探测声音信号进行分析,但仍然无法得到和主管听起来频率变化的结果。具体原因现在尚不明白。 关键词: 潜艇,声呐,时频联合分布 #mermaid-svg-0aZOxTglAI…...
2024/4/13 13:35:12 - 线性代数拾遗(6)—— 向量空间投影与投影矩阵
参考:麻省理工线性代数阅读本文前请先了解矩阵四个基本子空间,参考:线性代数拾遗(5) —— 矩阵的四个基本子空间 文章目录1. 向量投影到二维空间2. 向量投影到多维空间2.1 计算方法2.2 意义1. 向量投影到二维空间 考察…...
2024/4/17 8:47:14 - flutter webview 无法加载网页错误提示:ERR_NAME_NOT_RESOLVED 解决方法
问题: 之前用flutter写了一个app,里面包括一个网页显示页面,当时测试的时候一切正常。但是今天重新运行发现app的其他功能正常但是无法加载网页,错误提示如下: 网页无法打开 位于 https://www.baidu.com/ 的网页无法…...
2024/4/13 13:35:12 - Boson Netsim 思科路由器仿真 静态路由表、RIP、OSPF
目录 原理 内容和步骤 1. 网络拓扑搭建 2. 静态路由配置: 3. 动态路由RIP配置。 4. 动态路由OSPF配置。 问题讨论 总结 原理 路由器是一个能把多个异种网络或(网段/子网)互联起来,形成一个综合性的通讯网络的一种…...
2024/4/13 13:35:32 - 高频leetcode数学部分:43. 字符串相乘
43. 字符串相乘 难度中等828 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2&…...
2024/4/17 7:35:00 - FileInputStream与FileOutputStream
FileReader与FileWriter 只能用于文本文件,如.txt,.java,.c,.c等 对于图片,视频等字节流文件需要用字节流即:FileInputStream与FileOutputStream package IOStream;import org.junit.Test;import java.io.File; import java.io.FileInputS…...
2024/4/18 1:26:00 - STM32学习一
简介 本文目的是使用STM32CubeIDE进行编写和编译单片机的程序,然后使用Proteus实现电路协同仿真的功能 STM32CubeIDE是一个多功能的集成开发工具,集成了TrueSTUDIO和STM32CubeMX,它是STM32Cube软件生态系统的一部分。 Proteus具有原理图布…...
2024/4/13 13:35:17 - Python基础10
Python基础10 学习10 文件操作(IO技术) 有基础的同学知道,很多软件系统是将数据存储的数据库中;数据库实际也是基于文件形式存储的,本章我们就学习文件的相关操作。 文本文件和二进制文件 1、文本文件 文本文件存…...
2024/4/13 13:36:07 - 前端面试之浏览器安全
浏览器安全 XSS攻击 1.什么是XSS攻击? 概念 XSS全程是Cross Site Scripting,为了和"CSS"区分开来,故简称XSS。翻译过来就是"跨站脚本"。XSS攻击是指黑客往HTML文件中或DOM中注入恶意脚本,从而在用户浏览页面时&#…...
2024/4/13 13:36:17 - pyinstaller编译项目
第一步:cmd:cd 到项目文件夹下 pyinstaller -F -w -i D:\StudentMS\logo.ico login.py --hidden-import main.py --hidden-import img_rc.py -p baseinfo --hidden-import result.py -p baseinfo --hidden-import student.py -p query --hidden-import resultinfo.…...
2024/4/16 19:02:54 - 聊聊 Pulsar: Pulsar 的核心概念与基础架构
一、Pulsar 介绍 Apache Pulsar 是 Apache 软件基金会的顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,…...
2024/4/16 12:50:04 - C语言-操作符(详细)和表达式求值
本篇是对各种操作符和表达式的求值的介绍 1.算数操作符 2.移位操作符 3.位操作符 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用操作符与函数调用操作符 11.结构体成员操作符 12.表达式求值 13.操作符的属性 1.算…...
2024/4/13 13:35:47
最新文章
- 【WebLogic】Oracle发布2024年第二季度中间件安全公告
Oracle于美国时间2024年4月16日发布了 WebLogic 中间件2024年第二季度的安全公告,涉及漏洞共计 10 个,涉及示例程序的高危漏洞 1 个,中危漏洞中有3个涉及到核心组件(Core)。 此外,Oracle JDK1.8 的小版本号…...
2024/4/18 6:04:14 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 使用阿里云试用Elasticsearch学习:1.3 基础入门——搜索-最基本的工具
现在,我们已经学会了如何使用 Elasticsearch 作为一个简单的 NoSQL 风格的分布式文档存储系统。我们可以将一个 JSON 文档扔到 Elasticsearch 里,然后根据 ID 检索。但 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信息——从“大数…...
2024/4/16 7:51:10 - 【Go】十六、文件操作
文章目录 1、打开和关闭文件2、IO3、一次性读文件4、带缓冲区的读文件5、写入文件6、文件复制 1、打开和关闭文件 package main import("fmt""os" ) func main(){//打开文件:file,err : os.Open("d:/Test.txt");if err ! nil {//出错…...
2024/4/15 20:52:32 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/18 0:33:31 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/17 20:29:59 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/18 3:56:15 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/17 2:33:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/17 7:50:46 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/18 3:56:01 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/18 3:56:04 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/18 3:55:30 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/18 3:55:54 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/18 3:55:45 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/17 21:50:30 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/15 13:53:08 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/15 9:16:52 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/18 3:56:13 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/18 3:56:18 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/18 3:55:57 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/18 3:55:50 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/15 23:28:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/18 3:56:20 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/18 3:56:11 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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