Spring IOC 核心流程浓缩
一、基础概念
- 1、IoC 和 DI
IoC (Inversion of Control),即控制反转。这不是一种新的技术,而是 Spring 的一种设计思想
。
在传统的程序设计,我们直接在对象内部通过 new 来创建对象,是程序主动去创建依赖对象;而在 Spring 中有专门的一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这个容器我们一般称为 IoC 容器。
所有的类的创建、销毁都由 Spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 Spring
。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被 Spring 控制,所以这叫控制反转。
DI(Dependency Injection),即依赖注入
,由 Martin Fowler 提出。可以认为 IoC 和 DI 其实是同一个概念的不同角度描述。依赖注入是指组件之间的依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率
,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
- 2、bean(构成应用程序主干并由 Spring IoC 容器管理的对象)
官方概念:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 是一个由 Spring IoC 容器实例化,组装和管理的对象。大白话:bean 可以认为是那些我们想注入到 Spring IoC 容器的 Java 对象实例的抽象
。
我们经常会在 Service 上使用 @Service 注解,然后在要使用该 Service 的类中通过 @Autowire 注解来注入,这个 Service 就是一个 bean。在这个地方,@Service 注解相当于告诉 IoC 容器:这个类你需要帮我创建和管理;而 @Autowire 注解相当于告诉 IoC 容器:我需要依赖这个类,你需要帮我注入进来
。
- 3、BeanDefinition(存储 bean 的所有属性方法定义)
理解了 bean,BeanDefinition 就好理解了。BeanDefinition 是 bean 的定义,用来存储 bean 的所有属性方法定义。
- 4、BeanFactory 和 ApplicationContext
BeanFactory:基础类型 IoC 容器,提供完整的 IoC 服务支持。
ApplicationContext:BeanFactory 的子接口,在 BeanFactory 的基础上构建,是相对比较高级的 IoC 容器实现。包含 BeanFactory 的所有功能,
还提供了其他高级的特性,比如:事件发布、国际化信息支持、统一资源加载策略等。正常情况下,我们都是使用的 ApplicationContext。
以电话来举例:
我们家里使用的 “座机” 就类似于 BeanFactory
,可以进行电话通讯,满足了最基本的需求。而现在非常普及的智能手机,iPhone、小米等,就类似于 ApplicationContext,除了能进行电话通讯,还有其他很多功能:拍照、地图导航、听歌等
。
- 5、FactoryBean(自己实现 bean 的创建操作)
一般情况下,我们将 bean 的创建和管理都交给 Spring IoC 容器,Spring 会利用 bean 的 class 属性指定的类来实例化 bean
。但是如果我们想自己实现 bean 的创建操作,可以实现吗?当然可以,FactoryBean 就可以实现这个需求。FactoryBean 是一种特殊的 bean,它是个工厂 bean,可以自己创建 bean 实例,如果一个类实现了 FactoryBean 接口,则该类可以自己定义创建实例对象的方法,只需要实现它的 getObject() 方法即可。
FactoryBean 可能对于普通开发来说基本用不到也没去注意过,但是它其实应用的非常广,特别是在中间件中,如果你看过一些中间件的源码,一定会看到 FactoryBean 的身影
。
二、 Spring IoC 的核心流程。
- 容器构建启动入口
容器构建启动的入口有多种多样,这边以常用的 web.xml 配置的方式来说。首先,我们会在 web.xml 配置ContextLoaderListener 监听器,当 Tomcat 启动时,会触发 ContextLoaderListener 的 contextInitialized 方法,从而开始 IOC 的构建流程
。另一个常用的参数是 contextConfigLocation,用于指定 Spring 配置文件的路径。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="Java EE: XML Schemas for Java EE Deployment Descriptors" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="Java EE: XML Schemas for Java EE Deployment Descriptorshttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>open-joonwhee-service WAR</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/spring/appcontext-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>
- ApplicationContext 刷新前配置
在正式进入容器的刷新前,会进行一些前置操作。
- 1、确认要使用的容器
通常使用的是XmlWebApplicationContext,如果是用 Spring Boot,一般是 AnnotationConfigApplicationContext
,但其实都差别不大,最终都会继承 AbstractApplicationContext,核心都在AbstractApplicationContext 中实现。 - 2、提供一个给开发者初始化 ApplicationContext 的机会。
具体的使用如下例子:ApplicationContextInitializer 扩展使用
1)创建一个 ApplicationContextInitializer 接口的实现类,例如下面的 SpringApplicationContextInitializer,并在 initialize 方法中进行自己的逻辑操作
,例如:添加监听器、添加 BeanFactoryPostProcessor。
package com.joonwhee.open.spring;
import com.joonwhee.open.listener.EarlyListener;
import com.joonwhee.open.processor.MyBeanFactoryPostProcessor;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
/*** @author joonwhee* @date 2019/1/19*/
public class SpringApplicationContextInitializer implementsApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {// 自己的逻辑实现// 例子1:通过硬编码的方式添加监听器EarlyListener earlyListener = new EarlyListener();applicationContext.addApplicationListener(earlyListener);// 例子2:通过硬编码的方式添加BeanFactoryPostProcessorMyBeanFactoryPostProcessor myBeanFactoryPostProcessor = new MyBeanFactoryPostProcessor();applicationContext.addBeanFactoryPostProcessor(myBeanFactoryPostProcessor);}
}
2)在web.xml中,定义 contextInitializerClasses 或 globalInitializerClasses 参数
,参数值为 SpringApplicationContextInitializer 的全路径。
- 初始化 BeanFactory、加载 Bean 定义
创建一个新的 BeanFactory,默认为 DefaultListableBeanFactory。
根据 web.xml 中 contextConfigLocation 配置的路径,读取 Spring 配置文件,并封装成
Resource。根据 Resource 加载 XML 配置文件,并解析成 Document 对象 。
从根节点开始,遍历解析 Document 中的节点。
- 关于遍历解析 Document 中的节点
分为默认命名空间的节点和自定义命名空间的节点
1.对于默认命名空间的节点
:先将 bean 节点内容解析封装成 BeanDefinition,然后将 beanName、BeanDefinition 放到 BeanFactory 的缓存中,用于后续创建 bean 实例时使用。
2.对于自定义命名空间的节点
:会拿到自定义命名空间对应的解析器,对节点进行解析处理。
例如:<context:component-scan base-package=“com.joonwhee” /> ,该节点对应的解析器会扫描 base-package 指定路径下的所有类,将使用了 @Component(@Controller、@Service、@Repository)注解的类封装成 BeanDefinition
,然后将 beanName、BeanDefinition 放到 BeanFactory 的缓存中,用于后续创建 Bean 实例时使用。
注:默认命名空间为bean标签,alias标签和import标签,而非默认空间主要为aop标签 和管理事务的标签。
- 触发 BeanFactoryPostProcessor(让应用程序在Spring创建Bean对象前修改BeanDefinition。其中一个例子就是Bean属性配置的类型转换,占位符替换。)
实例化和调用所有 BeanFactoryPostProcessor,包括其子类 BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它
BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor
,
比BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor激活之前注册一些 bean 定义。
- 特别是,你可以通过
BeanDefinitionRegistryPostProcessor
来注册一些常规的 BeanFactoryPostProcessor,因为此时所有常规的 BeanFactoryPostProcessor都还没开始被处理。
注:这边的 “常规 BeanFactoryPostProcessor” 主要用来跟 BeanDefinitionRegistryPostProcessor 区分。
例子:BeanFactoryPostProcessor 扩展使用
1)创建一个 BeanFactoryPostProcessor 接口的实现类,例如下面的 MyBeanFactoryPostProcessor,并在 postProcessBeanFactory 方法中进行自己的逻辑操作。例如:扫描某个包路径,将该包路径下使用了某个注解的类全部注册到 Spring 中。
2)将该实现类注册到 Spring 容器中,例如使用 @Component 注解
package com.joonwhee.open.demo.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**1. @author joonwhee2. @date 2019/2/18*/
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("MyBeanFactoryPostProcessor#postProcessBeanFactory");// 自己的逻辑处理}
}
另外,Mybatis 中的 MapperScannerConfigurer 是一个典型的 BeanDefinitionRegistryPostProcessor 的扩展使用
,有兴趣的可以看看这个类的源码。
- 注册 BeanPostProcessor(定义了在bean初始化前和初始化后执行的方法。应用程序自己可以实现该接口定义自己特殊的逻辑。)
注册所有的 BeanPostProcessor,将所有实现了 BeanPostProcessor 接口的类加载到 BeanFactory 中
BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IOC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。在这边只是注册到 BeanFactory 中,具体调用是在 bean 初始化的时候。
例子:BeanPostProcessor 扩展使用
1)创建一个 BeanPostProcessor 接口的实现类,例如下面的 MyBeanPostProcessor,并在方法中进行自己的逻辑操作。
2)将该实现类注册到 Spring 容器中,例如使用 @Component 注解。
package com.joonwhee.open.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
/**1. @author joonwhee2. @date 2019/2/23*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("MyBeanPostProcessor#postProcessBeforeInitialization");// 自己的逻辑return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("MyBeanPostProcessor#postProcessAfterInitialization");// 自己的逻辑return bean;}
}
- 实例化所有剩余的非懒加载单例 bean
遍历所有被加载到缓存中的 beanName,触发所有剩余的非懒加载单例 bean 的实例化。
首先通过 beanName 尝试从缓存中获取,如果存在则跳过实例化过程;否则,进行 bean 的实例化。
根据 BeanDefinition,使用构造函数创建 bean 实例。
根据 BeanDefinition,进行 bean 实例属性填充。
执行 bean 实例的初始化。
5.1、触发 Aware 方法。
5.2、触发BeanPostProcessor,
postProcessBeforeInitialization 方法。5.3、如果 bean 实现了 InitializingBean 接口,则触发 afterPropertiesSet() 方法。
5.4、如果 bean 设置了 init-method 属性,则触发 init-method 指定的方法。
5.5、触发 BeanPostProcessor 的 postProcessAfterInitialization 方法。
将创建好的 bean 实例放到缓存中,用于之后使用。
- 完成上下文的刷新:
(使用应用事件广播器推送上下文刷新完毕事件(ContextRefreshedEvent )到相应的监听器。
例子:监听器扩展使用
1)创建一个自定义监听器,实现 ApplicationListener 接口,监听 ContextRefreshedEvent(上下文刷新完毕事件)。
2)将该监听器注册到 Spring IoC 容器即可。
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
/*** @author joonwhee* @date 2019/6/22*/
@Component
public class MyRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 自己的逻辑处理}
}
以上为整个 IoC 的核心流程
本文转自:https://zhuanlan.zhihu.com/p/79224941
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 神目云抗疫又出杀手锏:风险人物轨迹追溯,毫秒锁定密切接触者
一次简单的体温筛查,带来的是一群人的安全; 一个密切接触者线索,背后是控制疫情扩散的大局, 疫情防控,不容有丝毫的懈怠。新冠病毒具有传染性强,潜伏期长的特点。如何快速筛查出发热病人,预防潜在风险?如何以最快的速度掌握病人的行动轨迹?如何在茫茫人海中准确找出密…...
2024/5/2 4:58:25 - 将自己的镜像发布到docker hub上
将上篇文章自己创建的镜像push到docker hub1、注册docker hub账号,用户名为173170292392、推送镜像名称的规范docker push 注册用户名/镜像名3、tag命令修改为规范的镜像docker tag mycentos:0.1 17317029239/centos:0.0.14、登录docker login5、将镜像推送到docker hub,此时…...
2024/5/1 15:30:25 - ppp拨号上网
无法ping通外网,修改/etc/resolv.conf文件内容: nameserver 114.114.114.114 nameserver 8.8.8.8...
2024/5/2 3:18:29 - JAVA 超详细 将文件夹保留目录打包为 ZIP 压缩包并下载
将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台;在数据库中保存的是html标签,查出后,我把这些内容写入css和js等其他文件所在目录的一个文件内,然后将这整个文件…...
2024/4/13 7:07:45 - JS基础
js基础 js的语句if语句var a=5; if (a==5){alert("5"); //弹出警告框}else{alert("a=6");}switch语句var b=6; switch(b) {case 3:alert("3");break;case6:alert("6");break;default:alert("error");break; }循环语句while循…...
2024/5/3 13:10:59 - Linux常见的发行版本有哪些?各个版本之间有什么区别?
日常中操作系统十分常见,大家最熟悉的就是Windows系统,其实除了Windows系统之外Linux也是非常受欢迎的操作系统,具有多个发行版本。那么Linux常见的发行版本有哪些?各个版本之间有什么区别呢?下面和千锋广州小编一起来看看吧!1、CentOS:是一个基于RED hat Linux提供的可…...
2024/5/4 2:07:31 - vue组件(页面)之间的传值方式
一.路由传参 1.query方式传参 query 方式是使用查询字符串 ?id=xx&name=xx,给路由传参,不需要修改路由规则的 path 属性 获取 query路由参数的方式 $route.query.xx <div id="app"><!-- 如果在路由中,使用 查询字符串,给路由传递参数,则 不需要修…...
2024/4/26 7:32:01 - alibaba tool发包命令
杀掉进程并重启quickproject-1.0-SNAPSHOT.jar kill -9 $(ps -ef|grep “quickproject-1.0-SNAPSHOT.jar”|gawk ‘$0 !~/grep/ {print $2}’ |tr -s ‘\n’ ’ );nohup java -jar quickproject-1.0-SNAPSHOT.jar > nohup.out & 清理包并按prod打包 clean package -Dmav…...
2024/5/1 13:59:10 - POJ2182 Lost Cows(线段树+树状数组)
POJ2182 Lost Cows(线段树+树状数组) Description N (2 <= N <= 8,000) cows have unique brands in the range 1…N. In a spectacular display of poor judgment, they visited the neighborhood ‘watering hole’ and drank a few too many beers before dinner. W…...
2024/5/4 14:45:17 - C++学习之路----01输出
输出 C++中是使用cout来显示信息的。 cout<<"Hello!";可以看到上面的一句代码,它是有很多部分组成的 cout:是一个预定义的对象,知道如何显示字符串,数字和单个字符等。 <<(插入运算符):表示将内容传给cout,比如:“Hello!” “xxx”:引号括起来的…...
2024/4/13 9:29:51 - 关于for...in和for...of理解和使用
因为之前老是遇到这两个都忘记怎么使用,今天就把他们都写下来,给自己留个笔记,也希望能够帮到有需要的朋友。 ** for…in var arr1 = ["zou", "liu", "chen", "yang", "li", "wu"];var arr2 = {"name&quo…...
2024/4/21 3:29:42 - Centos6.8 阿里云源配置
安装完成后先要进行备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo生成缓存yum makecache 最…...
2024/4/13 19:08:14 - RPC(remote procedure call)远程过程调用
RPC(remote procedure call)远程过程调用,即本地调用一个函数或者对象方法,实际上是调用了远程机器上的函数或方法。个人理解 RPC 和 SOA 一样也不是规范,不是协议,是一种技术思想,一种理念,其实你日常编码中一直在接触它,只是你并没有感知到而已。比如耳熟能祥的 HTTP …...
2024/4/13 17:36:05 - 在Unity中读取Json文件(二)之特定值的获取与修改
在Unity中读取Json文件(二)之特定值的获取与修改 在unity开发中,总涉及json的解析,一般先定义对应实体类,然后进行反序列化,然而,有些数据无法定义,比如:“1”在c#中是无法定义的,那要想获取其内部的参数信息就需要另寻它法了。"tools": {"1": {…...
2024/5/3 13:14:15 - 常量和指针(Constant and Pointer)
常量和指针(Constant and Pointer) 常量和指针搅合在一起,成为一个比较麻烦的问题。就像你想分清楚“己巳已”不容易一样,想搞清楚“指针常量”、“常量指针”、“常量指针常量”这种拗口的东西,总得花点心思。 问题还不是记性好不好,因为指针和常量搅合在一起,还涉及到…...
2024/4/30 6:15:33 - 记录Nginx502
记录Nginx502错误 前端项目我是部署到nginx上,配置nginx.conf文件里的upstream用的是localhost,而我nginx是在docker上,web后端项目是在本地服务器上,127.0.0.1访问不到,修改成公网IP后成功访问...
2024/5/3 1:14:26 - 二叉树的前序遍历、中序遍历、后序遍历,python递归及非递归实现
这块一直有点迷,梳理梳理。 1. 中序遍历 1.1 递归实现 每次递归,只需要判断节点是不是None,否则按照左中右的顺序打印出节点value值。 class Solution:def inorderTraversal(self, root):if not root:return Nonereturn self.inorderTraversal(root.left) + [root.val] + se…...
2024/4/17 22:57:56 - 正则表达式 问号 冒号 ?:使用
正则表达式 问号 冒号 ?:使用 (?: pattern)是非捕获型括号 匹配pattern,但不捕获匹配结果。 (pattern )是捕获型括号。 匹配pattern,匹配pattern并捕获结果,自动获取组号 (? pattern ) 匹配pattern, 匹配pattern并捕获结果,设置name为组名 使用小括号指定一个子表达…...
2024/4/13 17:48:29 - leetcode 第208题 实现前缀树
题目描述:题解: class Trie { public:/** Initialize your data structure here. */Trie() {isEnd = false;memset(next,0,sizeof(next));}/** Inserts a word into the trie. */void insert(string word) {Trie* start = this;for(auto c:word){if(start->next[c-a] == …...
2024/5/3 9:04:59 - Spring Cloud之统一结果封装
我们在做前后端分离架构的设计时最好封装统一的返回结果格式,这样不管我们的API有多少个开发人员开发都能保证返回值风格统一,方便前端人员调试和友好提示,我们可以把这样的功用代码打成jar包在每个微服务中导入去使用。接下来我们看看如何封装统一返回结果类。这里我们封装…...
2024/5/4 4:40:57
最新文章
- 读天才与算法:人脑与AI的数学思维笔记17_歌曲的创作公式
1. 人为何创作音乐 1.1. 音乐一直具有算法性质,这意味着在所有的艺术形式中,它受到人工智能进步的威胁最大 1.1.1. 音乐也是所有艺术形式中最抽象的一种,它利用结构和模式,而正是这种抽象的性质使它与数学紧密相连 1.1.2. 在这…...
2024/5/4 22:24:30 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 解析大语言模型训练三阶段
大语言模型的训练过程一般包括3个阶段:预训练(Pre-training)、SFT(有监督的微调,Supervised-Finetuning)以及RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedb…...
2024/5/2 22:48:30 - WKWebView的使用
一、简介 在iOS中,WKWebView是WebKit框架提供的一个用于展示网页内容的控件,相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤: 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...
2024/5/4 11:20:05 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/4 12:05:22 - 【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 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/4 14:46:16 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/3 16:00:51 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/4 12:10:13 - 【Objective-C】Objective-C汇总
方法定义 参考: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 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/3 23:17:01 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/4 14:46:12 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/4 14:46:11 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/4 14:46:11 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/4 2:14:16 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/4 21:24:42 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/4 12:39:12 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/4 13:16:06 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/4 16:48:41 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/4 14:46:05 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/4 2:00:16 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/3 22:03:11 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/4 9:07:39 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/4 14:46:02 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下: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