Spring Boot源码分析二(启动流程原理)

文章目录

  • Spring Boot源码分析二(启动流程原理)
    • 入口
      • **SpringApplication**的构造器
      • 设置应用类型
      • 设置初始化器
      • 设置监听器(Listener)
    • SpringApplication.run方法
      • 获取并启动监听器
      • 环境构建
      • 创建容器
      • Spring容器前置处理
        • 调用初始化器
        • **加载启动指定类**
        • 通知监听器,容器已准备就绪
      • 刷新上下文
      • Spring容器后置处理
      • 发出结束执行的事件
      • 执行Runners

在这里插入图片描述

入口

@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}

**SpringApplication.run(MyApplication.class, args);**跟进去

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {return run(new Class<?>[] { primarySource }, args);}public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);}

首先会 new 一个SpringApplication的实例,并将启动类作为参数传进去,执行他的run方法。

SpringApplication的构造器

在这里插入图片描述

设置应用类型

在这里插入图片描述

主要通过类加载器判断 REACTIVE 相关的Class是否存在,如果不存在,则web环境即为 SERVLET 类型。这里设置好web环境类型,在后面根据类型初始化对应环境。

spring-boot-starter-web 的pom会引入Tomcat和spring-webmvc,如下

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>2.6.2</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.14</version><scope>compile</scope></dependency>

spring-webmvc中存在DispatcherServlet这个类,也就是我们以前SpringMvc的核心Servlet,通过类加载能加载DispatcherServlet这个类,那么我们的应用类型自然就是WebApplicationType.SERVLET

在这里插入图片描述

设置初始化器

// 设置初始化器(Initializer),最后会调用这些初始化器
setInitializers((Collection)
getSpringFactoriesInstances(ApplicationContextInitializer.class));

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这个方法会尝试从类路径的META-INF/spring.factories处读取相应配置文件,然后进行遍历,读取配置文件中Key为:org.springframework.context.ApplicationContextInitializer的value。以spring-boot-autoconfigure这个包为例,它的META-INF/spring.factories部分定义如下所示:

在这里插入图片描述

这两个类名会被读取出来,然后放入到Set集合中,准备开始下面的实例化操作:

// parameterTypes: 上一步得到的names集合
private <T> List<T> createSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, ClassLoader classLoader, Object[] args,Set<String> names) {List<T> instances = new ArrayList<T>(names.size());for (String name : names) {try {Class<?> instanceClass = ClassUtils.forName(name, classLoader);//确认被加载类是ApplicationContextInitializer的子类Assert.isAssignable(type, instanceClass);Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);//反射实例化对象T instance = (T) BeanUtils.instantiateClass(constructor, args);//加入List集合中instances.add(instance);}catch (Throwable ex) {throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, ex);}}return instances;
}

确认被加载的类确实是org.springframework.context.ApplicationContextInitializer的子类,然后就是得到构造器进行初始化,最后放入到实例列表中。

因此,所谓的初始化器就是org.springframework.context.ApplicationContextInitializer的实现类,这个接口是这样定义的:

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {void initialize(C applicationContext);}

在Spring上下文被刷新之前进行初始化的操作。典型地比如在Web应用中,注册Property Sources或者是激活Profiles。Property Sources比较好理解,就是配置文件。Profiles是Spring为了在不同环境下(如DEV,TEST,PRODUCTION等),加载不同的配置项而抽象出来的一个实体。

设置监听器(Listener)

下面开始设置监听器:

setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));

我们还是跟进代码看看getSpringFactoriesInstances

// 这里的入参type是:org.springframework.context.ApplicationListener.class
private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type) {return getSpringFactoriesInstances(type, new Class<?>[] {});
}private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// Use names and ensure unique to protect against duplicatesSet<String> names = new LinkedHashSet<String>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;
}

可以发现,这个加载相应的类名,然后完成实例化的过程和上面在设置初始化器时如出一辙,同样,还是以spring-boot-autoconfigure这个包中的spring.factories为例,看看相应的Key-Value:

org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializerorg.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.context.logging.LoggingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener

这10个监听器会贯穿springBoot整个生命周期。至此,对于SpringApplication实例的初始化过程就结束了。

SpringApplication.run方法

完成了SpringApplication实例化,开始调用 run 方法。

在这里插入图片描述

  • 第一步:获取并启动监听器
  • 第二步:根据SpringApplicationRunListeners以及参数来准备环境
  • 第三步:创建上下文
  • 第四步:预处理上下文
  • 第五步:刷新上下文
  • 第六步:再刷新上下文
  • 第七步:发出结束执行的事件
  • 第八步:执行Runners

获取并启动监听器

获取监听器

private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger,getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args),this.applicationStartup);}

这里仍然利用了getSpringFactoriesInstances方法来获取实例,大家可以看看前面的这个方法分析,从META-INF/spring.factories中读取Key为org.springframework.boot.SpringApplicationRunListener的Values:

org.springframework.boot.SpringApplicationRunListener=
org.springframework.boot.context.event.EventPublishingRunListener

getSpringFactoriesInstances中反射获取实例时会触发EventPublishingRunListener的构造函数,我们来看看EventPublishingRunListener的构造函数:

public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {private final SpringApplication application;private final String[] args;//广播器private final SimpleApplicationEventMulticaster initialMulticaster;public EventPublishingRunListener(SpringApplication application, String[] args) {this.application = application;this.args = args;this.initialMulticaster = new SimpleApplicationEventMulticaster();Iterator var3 = application.getListeners().iterator();while(var3.hasNext()) {ApplicationListener<?> listener = (ApplicationListener)var3.next();//将上面设置到SpringApplication的十一个监听器全部添加到SimpleApplicationEventMulticaster这个广播器中this.initialMulticaster.addApplicationListener(listener);}}//略...
}

我们看到**EventPublishingRunListener里面有一个广播器,EventPublishingRunListener 的构造方法将SpringApplication的十一个监听器全部添加到SimpleApplicationEventMulticaster这个广播器中,**我们来看看是如何添加到广播器:

public abstract class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster, BeanClassLoaderAware, BeanFactoryAware {//广播器的父类中存放保存监听器的内部内private final AbstractApplicationEventMulticaster.ListenerRetriever defaultRetriever = new AbstractApplicationEventMulticaster.ListenerRetriever(false);@Overridepublic void addApplicationListener(ApplicationListener<?> listener) {synchronized (this.retrievalMutex) {Object singletonTarget = AopProxyUtils.getSingletonTarget(listener);if (singletonTarget instanceof ApplicationListener) {this.defaultRetriever.applicationListeners.remove(singletonTarget);}//内部类对象this.defaultRetriever.applicationListeners.add(listener);this.retrieverCache.clear();}}private class ListenerRetriever {//保存所有的监听器public final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet();public final Set<String> applicationListenerBeans = new LinkedHashSet();private final boolean preFiltered;public ListenerRetriever(boolean preFiltered) {this.preFiltered = preFiltered;}public Collection<ApplicationListener<?>> getApplicationListeners() {LinkedList<ApplicationListener<?>> allListeners = new LinkedList();Iterator var2 = this.applicationListeners.iterator();while(var2.hasNext()) {ApplicationListener<?> listener = (ApplicationListener)var2.next();allListeners.add(listener);}if (!this.applicationListenerBeans.isEmpty()) {BeanFactory beanFactory = AbstractApplicationEventMulticaster.this.getBeanFactory();Iterator var8 = this.applicationListenerBeans.iterator();while(var8.hasNext()) {String listenerBeanName = (String)var8.next();try {ApplicationListener<?> listenerx = (ApplicationListener)beanFactory.getBean(listenerBeanName, ApplicationListener.class);if (this.preFiltered || !allListeners.contains(listenerx)) {allListeners.add(listenerx);}} catch (NoSuchBeanDefinitionException var6) {;}}}AnnotationAwareOrderComparator.sort(allListeners);return allListeners;}}//略...
}

上述方法定义在SimpleApplicationEventMulticaster父类AbstractApplicationEventMulticaster中。关键代码为this.defaultRetriever.applicationListeners.add(listener);,这是一个内部类,用来保存所有的监听器。也就是在这一步,将spring.factories中的监听器传递到SimpleApplicationEventMulticaster中。我们现在知道EventPublishingRunListener中有一个广播器SimpleApplicationEventMulticaster,SimpleApplicationEventMulticaster广播器中又存放所有的监听器。

启动监听器

我们上面一步通过getRunListeners方法获取的监听器为EventPublishingRunListener,从名字可以看出是启动事件发布监听器,主要用来发布启动事件。

public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {private final SpringApplication application;private final String[] args;private final SimpleApplicationEventMulticaster initialMulticaster;

我们先来看看SpringApplicationRunListener这个接口

package org.springframework.boot;
public interface SpringApplicationRunListener {// 在run()方法开始执行时,该方法就立即被调用,可用于在初始化最早期时做一些工作void starting();// 当environment构建完成,ApplicationContext创建之前,该方法被调用void environmentPrepared(ConfigurableEnvironment environment);// 当ApplicationContext构建完成时,该方法被调用void contextPrepared(ConfigurableApplicationContext context);// 在ApplicationContext完成加载,但没有被刷新前,该方法被调用void contextLoaded(ConfigurableApplicationContext context);// 在ApplicationContext刷新并启动后,CommandLineRunners和ApplicationRunner未被调用前,该方法被调用void started(ConfigurableApplicationContext context);// 在run()方法执行完成前该方法被调用void running(ConfigurableApplicationContext context);// 当应用运行出错时该方法被调用void failed(ConfigurableApplicationContext context, Throwable exception);
}

SpringApplicationRunListener接口在Spring Boot 启动初始化的过程中各种状态时执行,我们也可以添加自己的监听器,在SpringBoot初始化时监听事件执行自定义逻辑,我们先来看看SpringBoot启动时第一个启动事件listeners.starting():

@Override
public void starting() {//关键代码,先创建application启动事件`ApplicationStartingEvent`this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
}

这里先创建了一个启动事件ApplicationStartingEvent,我们继续跟进SimpleApplicationEventMulticaster,有个核心方法:

@Override
public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));//通过事件类型ApplicationStartingEvent获取对应的监听器for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {//获取线程池,如果为空则同步处理。这里线程池为空,还未没初始化。Executor executor = getTaskExecutor();if (executor != null) {//异步发送事件executor.execute(() -> invokeListener(listener, event));}else {//同步发送事件invokeListener(listener, event);}}
}

这里会根据事件类型ApplicationStartingEvent获取对应的监听器,在容器启动之后执行响应的动作。

环境构建

ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);

跟进去:

private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,DefaultBootstrapContext bootstrapContext, ApplicationArguments applicationArguments) {// 获取对应的 ConfigurableEnvironmentConfigurableEnvironment environment = getOrCreateEnvironment();// 配置configureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);listeners.environmentPrepared(bootstrapContext, environment);DefaultPropertiesPropertySource.moveToEnd(environment);Assert.state(!environment.containsProperty("spring.main.environment-prefix"),"Environment prefix cannot be set via properties.");bindToSpringApplication(environment);if (!this.isCustomEnvironment) {environment = convertEnvironment(environment);}ConfigurationPropertySources.attach(environment);return environment;}

创建容器

context = createApplicationContext();

在这里插入图片描述

这里是根据webApplicationType 进行判断的,该类型为SERVLET类型,会通过反射装载对应的字节码,也就是AnnotationConfigServletWebServerApplicationContextwebApplicationType之前在构造器中有获取过。

Spring容器前置处理

prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

在这里插入图片描述

调用初始化器

在这里插入图片描述

这里用到了在创建SpringApplication实例时设置的初始化器了,依次对它们进行遍历,并调用initialize方法。当然,我们也可以自定义初始化器,并实现initialize方法,然后放入 META-INF/spring.factories 配置文件中 key 为org.springframework.context.ApplicationContextInitializer的value中,这里我们自定义的初始化器 就会被调用,使我们项目初始化的一种方式。

加载启动指定类

在这里插入图片描述

这里也就是获取 this.primarySources 属性,也就是我们的启动类 MyApplication.class,接着看 load(context, sources.toArray(new Object[0])); 方法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

后续会出一篇文章详细介绍启动类是如何加载,以及自动化配置开启的详细流程。

通知监听器,容器已准备就绪

listeners.contextLoaded(context);

这里主要针对一些日志等监听器的响应处理。

刷新上下文

refreshContext(context);

这行到这里,SpringBoot相关的处理工作已经结束,接下的工作就交给了Spring。

在这里插入图片描述

在这里插入图片描述

refresh 方法是实现ioc 和 aop的关键,后续也会出文章进行详细分析。

Spring容器后置处理

afterRefresh(context, applicationArguments);

在这里插入图片描述

扩展接口,设计模式中的模板方法,默认为空实现。如果有自定义需求,可以重写该方法。比如打印一些启动结束log,或者一些其他后置处理。

发出结束执行的事件

listeners.started(context, timeTakenToStartup);

在这里插入图片描述

获取EventPublishingRunListener监听器,并执行其started方法,并且将创建的Spring容器传进去了,创建一个ApplicationStartedEvent事件,并执行ConfigurableApplicationContext 的publishEvent方法,也就是说这里是在Spring容器中发布事件,并不是在SpringApplication中发布事件,和前面的starting是不同的,前面的starting是直接向SpringApplication中的11个监听器发布启动事件。

执行Runners

callRunners(context, applicationArguments);

在这里插入图片描述

spring boot提供的2个供用户自己拓展的接口:ApplicationRunner和CommandLineRunner。实现其run方法,并注入到Spring容器中,在SpringBoot启动完成后,会执行所有的runner的run方法。可以在容器启动完毕后(上下文刷新后)执行,做一些类似数据初始化的操作。

private void callRunners(ApplicationContext context, ApplicationArguments args) {List<Object> runners = new ArrayList<Object>();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());//从上下文中获取ApplicationRunner类型的beanrunners.addAll(context.getBeansOfType(CommandLineRunner.class).values());//从上下文中获取CommandLineRunner类型的beanAnnotationAwareOrderComparator.sort(runners);//排序for (Object runner : new LinkedHashSet<Object>(runners)) {if (runner instanceof ApplicationRunner) {callRunner((ApplicationRunner) runner, args);//执行}if (runner instanceof CommandLineRunner) {callRunner((CommandLineRunner) runner, args);}}}

两个区别在于入参不同,可以根据自己的实际情况进行选择。

public interface CommandLineRunner {void run(String... args) throws Exception;
}public interface ApplicationRunner {void run(ApplicationArguments args) throws Exception;}

CommandLineRunner中执行参数是原始的java启动类main方法的String[] args字符串数组参数;ApplicationRunner中的参数经过处理提供一些方法例如: List<String> getOptionValues(String name);

        }if (runner instanceof CommandLineRunner) {callRunner((CommandLineRunner) runner, args);}}
}

两个区别在于入参不同,可以根据自己的实际情况进行选择。```java
public interface CommandLineRunner {void run(String... args) throws Exception;
}public interface ApplicationRunner {void run(ApplicationArguments args) throws Exception;}

CommandLineRunner中执行参数是原始的java启动类main方法的String[] args字符串数组参数;ApplicationRunner中的参数经过处理提供一些方法例如: List<String> getOptionValues(String name);

根据名称获取值list,java 启动命令中 --foo=bar --foo=baz,则根据foo参数名返回list["bar", "baz"]

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

相关文章

  1. 8.抽象类和接口

    抽象和接口的应用在java面向对象中非常的关键和重要 解释起来比较抽象&#xff0c;并且需要结合实践应用来理解 我有试着吧自己的理解写出来&#xff0c;但意思很不到位 这里扔两个链接&#xff0c;便于回顾。 java抽象类|菜鸟教程https://www.runoob.com/java/java-abstra…...

    2024/4/19 18:32:45
  2. ​Java 大杀器来了,性能提升一个数量级

    自 1996 年诞生以来&#xff0c;Java 语言长期在最受欢迎的编程语言排行榜中占据领先地位。除了语言本身的优秀特性之外&#xff0c;Java 语言持续演进、不断发展也是它能够保持长盛不衰的重要原因。Java 语言的功能和性能都在不断地发展和提高&#xff0c;但是 冷启动开销较大…...

    2024/4/14 17:32:00
  3. man设置中文展示

    本文内容仅在WSL中测试通过&#xff0c;其他情况不予保证。&#xff08;各发行版大同小异&#xff0c;自行类推即可&#xff09;。 man设置中文展示实现概念参考文献实现 保证zh_CN.UTF-8本地化文件存在&#xff08;保证是中文语言环境即可&#xff0c;这里只是以UTF-8字符集为…...

    2024/4/14 17:32:10
  4. Magento2创建webapi

    1. 配置一个webapi.xml 添加一个webapi.xml文件到app/code/自定义模块/etc目录 <?xml version"1.0"?><routes xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation"urn:magento:module:Magento_Webapi…...

    2024/4/19 18:52:45
  5. 模拟iic思路参考

    #include "iic.h" #include "delay.h" #include "usart.h"/ //本程序只供学习使用&#xff0c;未经作者许可&#xff0c;不得用于其它任何用途 //红茶电子科技-红茶 //淘宝 https://shop119364888.taobao.com //创建日期:2021/04/27 //版本&…...

    2024/4/14 17:32:10
  6. Java期末总复习

    1、 JDK&#xff1a;Java的开发环境 JRE&#xff1a;Java的运行环境 JVM&#xff1a;运行Java程序的核心虚拟机 2、 面向对象编程&#xff08;oop&#xff09;的特点&#xff1a;①封装性②继承性③多态性 3、 Java运行机制&#xff1a;源文件(.java)编译字节码文件(.class…...

    2024/5/4 2:24:58
  7. 【Matlab土壤分类】多类SVM土壤分类【含GUI源码 1398期】

    一、SVM简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并能够推广应用到函数拟合等其他机器学习问题中。 1 数学部分 1.1 二维空间 2 算法部分 …...

    2024/5/4 6:43:10
  8. FastKV:一个真的很快的KV存储组件,kotlin协程池

    读取相对较慢 SP在加载的时候已经将value反序列化存在HashMap中了&#xff0c;读取的时候索引到之后就能直接引用了。 而MMKV每次读取时都需要重新解码&#xff0c;除了时间上的消耗之外&#xff0c;还需要每次都创建新的对象。 不过这不是大问题&#xff0c;相对SP没有差很…...

    2024/4/16 3:08:48
  9. 微信每天自动给女[男]朋友发早安和土味情话

    微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…...

    2024/4/14 17:32:00
  10. 手机照片分辨率dpi怎么调?一寸证件照照片dpi怎么调300?

    平时大家在电脑上修改照片分辨率是非常方便的&#xff0c;但是手机上的证件照分辨率不符合上传要求时&#xff0c;我们应该怎么修改手机图片分辨率呢&#xff1f;可以使用小编为大家分享的调整图片DPI工具&#xff08;https://www.yasuotu.com/dpi&#xff09;&#xff0c;只要…...

    2024/4/14 17:32:00
  11. 什么是骨传导蓝牙耳机?骨传导耳机工作原理

    骨传导耳机就是通过振动通过耳蜗&#xff0c;听觉神经传递给听觉中枢&#xff0c;可以理解为声音以耳机为载体&#xff0c;声波在耳边扩散&#xff0c;这样我们的双耳就可以听见音乐了。它的好处在于不入耳&#xff0c;不伤耳道&#xff0c;保护听力&#xff0c;对耳朵比较友好…...

    2024/4/14 17:32:20
  12. 常用 Git 命令总结

    常用 Git 命令总结 git config --global user.name "你的名字" 让你全部的Git仓库绑定你的名字git config --global user.email "你的邮箱" 让你全部的Git仓库绑定你的邮箱git init 初始化你的仓库git add . 把工作区的文件全部提交到暂存区git add ./<…...

    2024/4/14 17:31:55
  13. 【Matlab手写数字识别】SVM手写数字识别【含GUI源码 676期】

    一、 SVM简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&#xff0c;它在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并能够推广应用到函数拟合等其他机器学习问题中。 1 数学部分 1.1 二维空间 2 算法部分 …...

    2024/4/14 17:32:15
  14. 解决Ubuntu命令“sudo apt-get install”——“ E: 无法定位软件包”问题

    1. 添加镜像源 (本文是清华源)。运行代码&#xff1a; sudo vim /etc/apt/sources.list添加如下内容&#xff1a; deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ b…...

    2024/4/14 17:32:00
  15. 最新版本libdrm(2.4.109)编译

    drm的atomic操作在老版本的libdrm中没有支持&#xff0c;需要下载最新的libdrm&#xff0c;我这里下载的是libdrm-2.4.109版本 下载链接&#xff1a;https://dri.freedesktop.org/libdrm/ 新版本的libdrm不再采用configure && make的方式编译&#xff0c;而是改用mes…...

    2024/4/14 17:32:10
  16. 并行计算、分布式计算、集群概念及区别(初学者待更新)

    并行计算、分布式计算都属于高性能计算范畴&#xff0c;主要目的都是对大数据进行分析和处理&#xff0c;都是利用并行来获得更高性能的计算——把大任务分为n个小任务。 并行计算 并行计算是相对于串行计算来说的&#xff0c;并行计算主要目的是加速求解问题的速度和提高求解…...

    2024/4/14 17:32:00
  17. PowerShell 执行从 Google Chrome 复制的 xhr 请求获取原始内容响应

    Google Chrome 允许您复制执行的 xhr 请求并在 PowerShell 中重放它&#xff1a; 打开开发者工具 (F12) 打开网络选项卡 通过执行 Web 应用程序中的功能来触发网络请求 右键单击网络选项卡中的请求&#xff0c;然后“复制”&#xff0c;然后“复制为 PowerShell” 现在将其…...

    2024/4/14 17:31:50
  18. 【Matlab图像加密】正交拉丁方+二维Arnold置乱图像加密【含GUI源码 813期】

    一、正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要。通常应用于数字图像通信的两种保护技术为:数字水印技术和图像加密技术。前一种保护技术因不改变图像的可见性而不适合用…...

    2024/4/18 10:26:23
  19. vite + vue3 + setup + pinia + ts 项目实战

    介绍 一个使用 vite vue3 pinia ant-design-vue typescript 完整技术路线开发的项目&#xff0c;秒级开发更新启动、新的vue3 composition api 结合 setup纵享丝滑般的开发体验、全新的 pinia状态管理器和优秀的设计体验&#xff08;1k的size&#xff09;、antd无障碍过渡…...

    2024/4/14 17:33:01
  20. Python人脸笑脸识别【人工智能】【CNN】

    目录一、图片预处理二、划分数据集三、CNN提取人脸识别笑脸和非笑脸1.导入路径2.创建模型3.归一化处理4.数据增强5.创建网络四、单张图片测试单张图片进行判断 是笑脸还是非笑脸五、摄像头测试六、参考文献一、图片预处理 准备好我们所需要的数据 首先打开数据集&#xff0c…...

    2024/4/19 15:44:40

最新文章

  1. k8s集群安装

    目录 部署步骤概览 1、基础环境部署 2、docker环境部署 3、配置k8s集群 4、集群初始化 5、安装dashboard软件 写在前面&#xff1a;本文安装单点master多node的k8s集群&#xff0c;主要用于k8s学习或k8s环境测试&#xff1b;部署的是1.23版本&#xff0c;在1.24版本起&am…...

    2024/5/4 7:58:13
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. [蓝桥杯 2014 省 A] 波动数列

    容我菜菲说一句&#xff0c;全网前排题解都是rubbish&#xff0c;当然洛谷某些也是litter 不好意思&#xff0c;最近背单词背了很多垃圾的英文&#xff0c;正题开始 [蓝桥杯 2014 省 A] 波动数列 题目描述 输入格式 输入的第一行包含四个整数 n , s , a , b n,s,a,b n,s,a…...

    2024/5/2 22:52:44
  4. 鬼灭之刃-激情台词-02(解释来自文心一言)

    愤怒吧&#xff0c;不共戴天的仇恨&#xff0c;强悍而纯粹的愤怒&#xff0c;将会化作坚不可摧的原动力&#xff0c;督促你变强 —— 吾峠呼世晴《鬼灭之刃》 愤怒和仇恨是一种强烈的情感&#xff0c;它们可以驱使人们去寻求改变&#xff0c;去变得更加强大。在故事中&#xff…...

    2024/4/27 19:00:03
  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