文章目录

  • 启动过程
    • 创建SpringApplication实例
    • 运行run方法
  • 扩展功能

启动过程

  SpringBoot的启动是从SpringApplication的静态方法run(…)开始的,实际上在该静态方法中,先创建了一个SpringApplication实例,然后再调用实例的run(…)方法,如果我们需要对SpringApplication实例的属性进行一些定制化的设置,那么可以直接创建一个SpringApplication实例,对该实例进行一番设置之后,再调用其的run(…)方法。

public class SpringApplication {// 最常用的静态启动方法,但最终还是会封装为单元素的数组并调用其重载方法public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {return run(new Class<?>[] { primarySource }, args);}// 该静态方法最后依然是通过new一个SpringApplication实例并调用其run(...)方法来完成SpringBoot的初始化的public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);}
}

创建SpringApplication实例

public class SpringApplication {// 常用的构造器没有第一个resourceLoader参数,那么此时的resourceLoader为nullpublic SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// 推断当前应用类型,有WebApplicationType.SERVLET、WebApplicationType.REACTIVE、WebApplicationType.NONE(非WEB应用)// 通过能否加载某些类(类路径或jar包中是否拥有这些类),来推断当前应用的类型,如不能加载Servlet类则表示并非WEB应用this.webApplicationType = WebApplicationType.deduceFromClasspath();// 从所有资源路径下(包括所有jar包资源)的META-INF/spring.factories文件中,读取key为相应接口的value(注册的实现类)的并集并得到其实例集合// 这里获取的ApplicationContextInitializer的实现类,在ApplicationContext基本准备完成,refresh之前会调用他们的初始化方法// 这里获取的ApplicationListener的实现类会作为ApplicationContext的初始监听器,还会监听SpringBoot启动相关事件setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));// 推断主类,会根据调用栈一层一层回溯,直到找到名为main的方法,main方法所在类就是主类this.mainApplicationClass = deduceMainApplicationClass();}// 该方法的重载方法中,后面两个参数可以为空,反射时调用默认构造器,该方法后面还多次用到,这是常用的实现SPI接入的方式private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {// 该classLoader决定了可以加载哪些地方的资源,后面加载META-INF/spring.factories资源便是通过该加载器ClassLoader classLoader = getClassLoader();// 首先会加载所有资源路径下(包括所有jar包资源)的META-INF/spring.factories文件(以接口为key,其实现类为value,多个实现类用","隔开)// 然后会以Map的形式缓存上一步的结果(Spring的缓存无处不在),key为接口类全名,value为所有配置的实现了该接口的实现类的类全名集合// 最后通过传入的接口类全名,从缓存中获取实现了该接口的所有类全名(根据接口类全名为key得到的value是一个集合)Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));// 通过反射创建实例List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);// 会对实例进行排序AnnotationAwareOrderComparator.sort(instances);return instances;}// 根据调用栈找到主类private Class<?> deduceMainApplicationClass() {StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();for (StackTraceElement stackTraceElement : stackTrace) {if ("main".equals(stackTraceElement.getMethodName())) {return Class.forName(stackTraceElement.getClassName());}}return null;}
}

运行run方法

public class SpringApplication {// 启动SpringBootpublic ConfigurableApplicationContext run(String... args) {// 记录程序运行时间的对象,start()方法表示开始计时StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();// 配置handless模式(即系统属性java.awt.handless是否为true,System.getProperty("java.awt.handless"))// 在没有鼠标键盘、显示器等设备时,JVM会根据是否启用了handless模式来决定是否允许虚拟机运行// 如果JVM没有配置handless模式,那么通过当前SpringApplication对象的handless属性的值来设置它configureHeadlessProperty();// SpringApplicationRunListeners包含了一系列的SpringApplicationRunListener元素,各元素皆可用来监听SpringBoot的启动过程// 调用SpringApplicationRunListeners的大多数方法都会依次调用所有SpringApplicationRunListener元素的相同方法(这是一种监听器模式)// 如果SpringApplicationRunListeners还实现了SpringApplicationRunListener接口,那便融合了组合设计模式,实际上却没有这样做// getRunListners(...)从META-INF/spring.factories中获取元素,spring-boot.jar默认提供了EventPublishingRunListener// EventPublishingRunListener将监听到的SpringBoot启动过程,封装成相应事件进行转发(其监听者就是SpringApplication的listeners成员,在构建SpringApplication对象时初始化过)// 由于EventPublishingRunListener的存在,不但所有配置的SpringApplicationRunListener可以监听到启动过程,所有配置的ApplicationListener也可以监听到启动过程// 所以如果我们希望在SpringBoot启动过程的不同阶段做些什么事,既可以注册自定义的SpringApplicationRunListener,也可以注册自定义的ApplicationListener// 注意,这里的EventPublishingRunListener与ApplicationContext是两个独立的事件监听与发布系统,他们注册有各自的监听器(只是默认都是来自于SpringApplication的listeners成员而已)SpringApplicationRunListeners listeners = getRunListeners(args);// 将开始启动的消息广播给所有已注册的SpringApplicationRunListener// EventPublishingRunListener监听到该消息后会转发ApplicationStartingEvent事件给已注册的所有ApplicationListenerlisteners.starting();try {// 将所有启动参数封装成一个ApplicationArguments对象ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 准备上下文环境,不同的应用类型会得到不同类型的上下文环境ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);// 用于设置系统属性"spring.beaninfo.ignore",该系统属性的作用暂时不知道configureIgnoreBeanInfo(environment);// 打印启动图形,如默认的由文本组成的SpringBoot图案Banner printedBanner = printBanner(environment);// 根据应用类型创建ApplicationContext,如Servlet应用使用AnnotationConfigServletWebServerApplicationContext对象context = createApplicationContext();// 处理SpringBoot启动过程中的异常,SpringBootExceptionReporter必须有一个参数为ConfigurableApplicationContext类型的构造器// 可见其值依然来自于META-INF/spring.factoriesexceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,new Class[] { ConfigurableApplicationContext.class }, context);// 对ApplicationContext做基本的设置(包括调用所有已注册的ApplicationContextInitializer的initialize(...)方法来初始化上下文)// 还会将ApplictionContext已准备好的消息广播给所有已注册的SpringApplicationRunListener// 解析source得到BeanDefinition并注册也是在此方法中完成的prepareContext(context, environment, listeners, applicationArguments, printedBanner);// 调用applicationContext的refresh(...),并为applicationContext设置ShutdownHookrefreshContext(context);// 在refresh上下文之后调用,默认是个空方法,可供子类扩展afterRefresh(context, applicationArguments);// 停止计时stopWatch.stop();// 将启动完成的消息广播给所有已注册的SpringApplicationRunListener(EventPublishingRunListener依然会转发)listeners.started(context);// 调用上下文中所有实现了ApplicationRunner或CommandLineRunner接口的Bean的run(...)方法callRunners(context, applicationArguments);// 将开始运行的消息广播给所有已注册的SpringApplicationRunListener(EventPublishingRunListener依然会转发)listeners.running(context);} catch (Throwable ex) {// 启动过程发生异常时的处理方式handleRunFailure(context, ex, exceptionReporters, listeners);throw new IllegalStateException(ex);}return context;}// 通过META-INF/factories获取到配置的所有SpringApplicationRunListenerprivate SpringApplicationRunListeners getRunListeners(String[] args) {// 自定义的SpringApplicationRunListener必须具有拥有两个形参的构造函数(两个参数分别为SpringApplication和String数组类型)// 在创建SpringApplicationRunListener时两个参数分别传入当前SpringApplication对象与启动的参数列表Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args));}// 准备上下文环境private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// 如果this.environment有默认配置的环境就使用默认环境,否则根据应用类型创建相应类型的环境// SERVLET对应StandardServletEnvironmen、REACTIVE对应StandardReactiveWebEnvironment、NONE对应StandardEnvironmentConfigurableEnvironment environment = getOrCreateEnvironment();// 新建一个封装了命令行参数的PropertySource并将其加入环境开头(开头说明优先级最高),名为commandLineArgs// 覆盖环境的activeProfiles(由--spring.profiles.active参数指定)configureEnvironment(environment, applicationArguments.getSourceArgs());// 将环境已准备好的的消息广播给所有已注册的SpringApplicationRunListener(EventPublishingRunListener依然会转发)listeners.environmentPrepared(environment);// 将环境绑定到应用,目前不知道用途bindToSpringApplication(environment);// 是否有需要转换环境类型(就算转换了,其activeProfiles与propertySources也是复制的原环境的)if (!this.isCustomEnvironment) {environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,deduceEnvironmentClass());}// 会封装一个ConfigurationPropertySourcesPropertySource注册在环境的开头,名为configurationProperties// ConfigurationPropertySourcesPropertySource包含了当前环境中的所有PropertySource,其值是所有PropertySource的并集ConfigurationPropertySources.attach(environment);return environment;}// 打印启动图案private Banner printBanner(ConfigurableEnvironment environment) {// banner有三种模式,Banner.Mode.CONSOLE(默认)、Banner.Mode.LOG、Banner.Mode.OFF(不打印)if (this.bannerMode == Banner.Mode.OFF) {return null;}// 用于加载自定义的banner资源(如图片、文本等)ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader: new DefaultResourceLoader(getClassLoader());// SpringApplicationBannerPrinter是Banner打印的组织者,其print(...)方法会先创建出Banner,再调用Banner的printBanner(...)进行打印// SpringApplicationBannerPrinter会先尝试创建一个Banners(它实现了Banner接口,又是多个Banner的聚合,典型的组合模式)// Banners会根据环境中的spring.banner.image.location是否有值来创建一个ImageBanner,spring.banner.location来创建一个ResourceBanner// 如果Banners存在一个Banner元素,那么Banners就是最后启用的Banner,否则用构造函数传入的Banner,如果构造函数未传入Banner,那么使用默认Banner// Banners的printBanner(...)方法会调用所有Banner元素的printBanner(...),即会委托所有Banner进行打印// 如果我们想自定义Banner,只需要在配置文件中加入spring.banner.image.location或spring.banner.location配置来指定Banner文件位置SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);if (this.bannerMode == Mode.LOG) {return bannerPrinter.print(environment, this.mainApplicationClass, logger);}return bannerPrinter.print(environment, this.mainApplicationClass, System.out);}// 对上下文进行默认的配置private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {// 配置环境变量context.setEnvironment(environment);// 配置默认的ConversionService、BeanNameGenerator、ResourceLoaderpostProcessApplicationContext(context);// 调用所有已注册的ApplicationContextInitializer的initialize(...)方法applyInitializers(context);// 将上下文已准备好的的消息广播给所有已注册的SpringApplicationRunListener(EventPublishingRunListener依然会转发)listeners.contextPrepared(context);// 将封装好的命令行参数与printedBanner注册为单例,以便其他Bean使用ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();beanFactory.registerSingleton("springApplicationArguments", applicationArguments);if (printedBanner != null) {beanFactory.registerSingleton("springBootBanner", printedBanner);}// 配置是否允许重复注册BeanDefinitionif (beanFactory instanceof DefaultListableBeanFactory) {((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}if (this.lazyInitialization) {context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());}// 委托给BeanDefinitionLoader加载BeanDefinitionload(context, getAllSources().toArray(new Object[0]));// 将上下文已加载的的消息广播给所有已注册的SpringApplicationRunListener(EventPublishingRunListener依然会转发)listeners.contextLoaded(context);}// 调用上下文中所有实现了ApplicationRunner或CommandLineRunner接口的Bean的run(...)方法private void callRunners(ApplicationContext context, ApplicationArguments args) {List<Object> runners = new ArrayList<>();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());AnnotationAwareOrderComparator.sort(runners);for (Object runner : new LinkedHashSet<>(runners)) {if (runner instanceof ApplicationRunner) {callRunner((ApplicationRunner) runner, args);}if (runner instanceof CommandLineRunner) {callRunner((CommandLineRunner) runner, args);}}}
}// 加载BeanDefinition
class BeanDefinitionLoader {int load() {int count = 0;// 依次处理sourcesfor (Object source : this.sources) {count += load(source);}return count;}// 根据source类型来解析source,从而得到BeanDefinition并进行注册private int load(Object source) {// 如果source类被@Component修饰,那么用AnnotatedBeanDefinitionReader.register(...)将其注册if (source instanceof Class<?>) return load((Class<?>) source);// 通过XmlBeanDefinitionReader.loadBeanDefinitions(...)解析xml资源if (source instanceof Resource) return load((Resource) source);// 通过ClassPathBeanDefinitionScanner.scan(...)来扫描注册if (source instanceof Package) return load((Package) source);// 依次检查字符串是否是类全名(类路径中是否能找到此类)、资源路径(是否能找到资源,可能找到的是多个资源)、包名(是否能找到包)// 然后调用相应的load(...)方法进行BeanDefinition注册if (source instanceof CharSequence) return load((CharSequence) source);		throw new IllegalArgumentException("Invalid source type " + source.getClass());}
}	// AnnotationConfigServletWebServerApplicationContext是ApplicationContext的实现类(AbstractApplicationContext的子孙类)
// AbstractApplicationContext以模板方法模式实现了refresh(...)方法,在其子类中重写了许多refresh(...)方法中调用的方法
public class AnnotationConfigServletWebServerApplicationContext extends ServletWebServerApplicationContextimplements AnnotationConfigRegistry {public AnnotationConfigServletWebServerApplicationContext() {this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this);}protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {super.postProcessBeanFactory(beanFactory);// 如果this.basePackage配置了包路径,这里进行包扫描if (this.basePackages != null && this.basePackages.length > 0) {this.scanner.scan(this.basePackages);}// 如果this.annotatedClasses配置了类,那么进行类的注册if (!this.annotatedClasses.isEmpty()) {this.reader.register(ClassUtils.toClassArray(this.annotatedClasses));}}// 在ServletWebServerApplicationContext中实现的方法,被当前类的方法所覆盖,但在当前类中调用了该方法protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {// WebApplicationContextServletContextAwareProcessor实现了ServletContextAware与ServletConfigAware的接口回调beanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));beanFactory.ignoreDependencyInterface(ServletContextAware.class);// 注册了application、request与session作用范围registerWebApplicationScopes();}protected void onRefresh() {// 在GenericWebApplicationContex中实现的方法super.onRefresh();// 创建web服务器(如tomcat服务器)createWebServer();}// 在GenericWebApplicationContex中实现的方法protected void onRefresh() {this.themeSource = UiApplicationContextUtils.initThemeSource(this);}// 创建服务器private void createWebServer() {WebServer webServer = this.webServer;ServletContext servletContext = getServletContext();// 根据是否已经配置了web服务器来决定是否创建web服务器if (webServer == null && servletContext == null) {// 从工厂中获取ServletWebServerFactory类型的Bean(有且仅有一个该类型的Bean,否则抛出异常)ServletWebServerFactory factory = getWebServerFactory();// 创建并启动web服务器,会注册一个DispatherServletthis.webServer = factory.getWebServer(getSelfInitializer());getBeanFactory().registerSingleton("webServerGracefulShutdown", new WebServerGracefulShutdownLifecycle(this.webServer));getBeanFactory().registerSingleton("webServerStartStop", new WebServerStartStopLifecycle(this, this.webServer));} else if (servletContext != null) {getSelfInitializer().onStartup(servletContext);}// 调整PropertySourcesinitPropertySources();}
}

扩展功能

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

相关文章

  1. mysql常用操作:登陆、添加新用户、分配权限及相关操作命令

    一、登录mysql本地登录mysql账户:mysql -u 【mysql账户名】 -p --可以是root账户名也可以是普通账户,让后输入密码即可登陆登陆远程主机的mysql账户mysql -h [mysql所在的远程主机ip] -P [mysql所在的远程主机设置的mysql服务端口] -u 【mysql账户】 -p 【mysql账户密码】 --…...

    2024/4/27 20:31:53
  2. 实现延时任务的 4 种实现方案!

    一、应用场景在需求开发过程中,我们经常会遇到一些类似下面的场景:a. 外卖订单超过15分钟未支付,自动取消b. 使用抢票软件订到车票后,1小时内未支付,自动取消c. 待处理申请超时1天,通知审核人员经理,超时2天通知审核人员总监d. 客户预定自如房子后,24小时内未支付,房源…...

    2024/5/3 7:58:45
  3. Linux查看python路径

    查看所有python的路径,不止一个 whereis python 查看当前使用的python路径 which python...

    2024/4/18 19:53:49
  4. linux的简单操作命令

    linux常用命令 一.目录命令: linux目录操作命令: pwd:查看当前所在目录 cd:打开目录 ls –a:查看目录下文件 ll:以列的方式显示目录下的文件列表 mkdir:创建文件目录 rm –rf:删除文件或目录 rm ri:删除文件前询问用户 cp:复制文件命令 mv:移动文件或修改文件名 1.增…...

    2024/5/4 8:44:08
  5. LeetCode1392 最长快乐前缀题解

    LeetCode1392 最长快乐前缀 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串。 给你一个字符串 s,请你返回它的 最长快乐前缀。 如果不存在满足题意的前缀,则返回一个空字符串。 举例子:示例 1: 输入:s = “level” 输出:“l”示例…...

    2024/4/30 12:42:12
  6. msxml2类封装

    头文件声明(XmlDocument.h):#pragma once#import "msxml3.dll" #include <msxml2.h> #include <string>#if defined(UNICODE) || defined(_UNICODE)typedef std::wstring tstring; #elsetypedef std::string tstring; #endifclass CXmlNodeList;class…...

    2024/5/1 21:26:52
  7. 第十章 数组翻转

    1.上下反转flipud 结果数组B=flipud(数组A) >> a=rand(4,3)a =0.6787 0.6555 0.27690.7577 0.1712 0.04620.7431 0.7060 0.09710.3922 0.0318 0.8235>> b=flipud(a) %偶数行 b =0.3922 0.0318 0.82350.7431 0.7060 0.09710.75…...

    2024/4/28 22:00:08
  8. vue和jQuery的区别

    文章目录vue介绍jquery介绍vue和jquey对比举例说明 vue介绍 vue是一个刚兴起不久的前端框架,有一套完整的体系,是一个精简的MVVM。从技术角度讲,vue.js专注于MVVM模型的ViewModel层,通过双向数据绑定把view层和Model层连接起来,通过对数据的操作就可以完成对页面视图的渲染…...

    2024/4/15 2:54:58
  9. 四. Zuul 基于数据库实现动态路由

    目录一. 基础解释二. 简单实现创建 Zuul 网关服务 一. 基础解释解释: Zuul 基于数据库实现动态路由的原因,假设当前新建了服务,或已有服务中添加了新的接口,怎么不停机的情况下动态配置该接口通过网关访问,通过数据库进行配置,手动向数据库中存储服务与接口的映射关系,Zuul定时…...

    2024/4/14 0:12:36
  10. Ollydbg简易教学

    Ollydbg介绍Ollydbg(简称OD)是Windows平台下Ring3级的程序调试利器。程序调试有静态调试和动态调试两种。静态调试是指将程序源代码编译成可执行程序之前,用手工或编译程序等方法对程序源代码进行测试,来查找和修正程序中的语法错误和逻辑错误。动态调试则是在可执行程序的…...

    2024/4/15 6:49:16
  11. 头脑发热~~入坑了

    wins10系统,内存8G,开了个虚拟机,装载了ubuntu64位系统,版本是20.04,嘎嘎新!安装pycharm,python3.8,虚拟环境等。简短记录,持续更新!...

    2024/4/28 2:57:28
  12. Opencv Linking CXX shared library ../../lib/libopencv_core.so

    错误信息: [ 31%] Linking CXX shared library …/…/lib/libopencv_core.so CMake Error: cmake_symlink_library: System Error: Operation not supported CMake Error: cmake_symlink_library: System Error: Operation not supported modules/core/CMakeFiles/opencv_core…...

    2024/4/28 8:47:15
  13. SpringBoot + Shiro 一篇文章快速入门

    🏠 本文收录于Github仓库,欢迎前来 star 呀~ https://github.com/Veal98/CS-Wiki 🏃‍ 在线阅读地址/更好的阅读体验请移步:https://veal98.gitee.io/cs-wiki/🛸 SpringBoot + Shiro 一篇文章快速入门1. Shiro 简介Apache Shiro™ is a powerful and easy-to-use Java …...

    2024/5/3 20:54:47
  14. [选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

    多年不考试,一夜回到解放前T1:花园titlesolutioncodeT2:月亮神树titlesolutioncodeT3:保护出题人titlesolutioncode T1:花园 title 小 L 有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为 1∼n。花圃 1 和 n 是相邻的。 他的环形花园每天都会换一个新花样,但他的…...

    2024/4/26 21:20:22
  15. trade for/trade with/train for等动词词组

    本博文源于《词博士的私教课英语动词词组速记420》本博文属于“Day6 Week 3” Reading take out 除去;取得(贷款、许可、保险等);带…出去If you take something out,you remove it permanently from its place. If you take out something such as a loan,a licence,or an in…...

    2024/4/28 4:38:51
  16. 干货推荐 | 一个好的产品设计原则都有这些

    作为simplesite设计团队的负责人,我最近参与并制定了一组产品的的设计原则。在这个过程中我有去了解产品设计相关的原理,学习各大成功的案例,并得到了很多启发。 其实不论我们学习了多少原则理论,最重要的还是要结合实践,毕竟实践出真知。 因此想在这里分享一下自己的学习…...

    2024/4/27 5:27:10
  17. 基于密码破解的提权

    ...

    2024/4/28 2:57:28
  18. 蚁巢引领“无接触配送”新升级!

    为进一步鼓励在线经济发展,4月13日,上海发布了《上海市促进在线新经济发展行动方案(2020-2022年)》(以下简称《方案》),强调要借助人工智能、5G、互联网、大数据、区块链等技术,与现代生产制造、商务金融、文娱消费、教育健康和流通出行等深度融合,优化在线金融服务、…...

    2024/4/28 2:49:12
  19. 记一次使用pycharm自带的命令行终端进行rebase导致的crlf转换为lf

    问题描述:经历过一次针对Windows server的.net项目,在更改配置文件提交后并部署到服务器,导致服务启动失败,报错为加载配置文件失败,但是仔细对比和服务端和本地的配置文件 ,没有任何区别,然而本地是可以正常启动的,这就头疼了最终通过对比工具发现,本地与服务端的文件…...

    2024/5/2 2:28:48
  20. UE4 C++学习笔记之拾取物品

    任务:以Item类为父类,创建Weapon类,玩家在场景中可拾取该物品第一步、角色骨骼添加武器插槽第二步、编写Weapon类相关代码Weapon.h代码如下:// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h&quo…...

    2024/4/28 3:00:47

最新文章

  1. 顺序循环队列--c语言实现

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h>#define MAX_SIZE 100 // 假设队列的最大长度为100// 队列结构体 typedef struct {int data[MAX_SIZE]; // 存储队列元素的数组int front; // 队头指针int rear; // 队尾指针 } SeqQueue;// 初…...

    2024/5/4 14:53:36
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. dp小兰走迷宫

    昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 #incl…...

    2024/5/3 15:22:43
  4. 自动化标准Makefile与lds

    makefile的自动化&#xff0c;需要使用变量&#xff0c;以及自动变量。 实行命令行与参数的分离。 命令行只与变量打交道&#xff0c;而变量则携带不同的参数&#xff0c;这样&#xff0c;通过修改变量&#xff0c;命令的执行结果不同。 可以简单理解为&#xff0c;命令行是个…...

    2024/5/3 10:04:44
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/4 12:05:22
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/4 11:23:32
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/4 14:46:16
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/3 16:00:51
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/4 12:10:13
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/3 21:22:01
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/3 23:17:01
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/4 14:46:12
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/4 14:46:11
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/4 14:46:11
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/4 2:14:16
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/3 16:23:03
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/4 12:39:12
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/4 13:16:06
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/3 14:57:24
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/4 14:46:05
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/4 2:00:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/3 22:03:11
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/4 9:07:39
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/4 14:46:02
  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