我们知道,SpringMVC最后是通过Tomcat来进行部署的。当在Servlet中进行进行应用部署时,主要步骤为(引用来自http://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-eval-oth-JSpec/servlet-3_0-final-spec.pdf):

When a web application is deployed into a container, the following steps must be

performed, in this order, before the web application begins processing client

requests.

■ Instantiate an instance of each event listener identified by a element

in the deployment descriptor.

■ For instantiated listener instances that implement ServletContextListener , call

the contextInitialized() method.

■ Instantiate an instance of each filter identified by a element in the

deployment descriptor and call each filter instance’s init() method.

■ Instantiate an instance of each servlet identified by a element that

includes a element in the order defined by the load-on-

startup element values, and call each servlet instance’s init() method.

翻译下:当应用部署到容器时,在应用相应客户的请求之前,需要执行以下步骤:

  • 创建并初始化由元素标记的事件监听器。
  • 对于时间监听器,如果实现了ServletContextListener接口,那么调用其contextInitialized()方法。
  • 创建和初始化由元素标记的过滤器,并调用其init()方法。
  • 根据中定义的顺序创建和初始化由元素标记的servlet,并调用其init()方法。

所以在Tomcat下部署的应用,会先初始化listener,然后初始化filter,最后初始化servlet。

在我们的SpringMVC中,最简单的web.xml配置如下

  <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!--告诉加载器,去这个位置去加载spring的相关配置--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></context-param><!--配置前端控制器--><servlet><servlet-name>springMvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--SpringMVC配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>springMvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--解决乱码问题的filter--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>

现在我们根据这个配置文件和上面的初始化流程一起来看一下,SpringMVC是如何来一步步启动容器,并加载相关信息的。

初始化Listener

我们这里定义的的listener类是 ContextLoaderListener ,我们看一下具体类定义

/*** Bootstrap listener to start up and shut down Spring's root {@link WebApplicationContext}.* Simply delegates to {@link ContextLoader} as well as to {@link ContextCleanupListener}.** <p>As of Spring 3.1, {@code ContextLoaderListener} supports injecting the root web* application context via the {@link #ContextLoaderListener(WebApplicationContext)}* constructor, allowing for programmatic configuration in Servlet 3.0  environments.* See {@link org.springframework.web.WebApplicationInitializer} for usage examples.** @author Juergen Hoeller* @author Chris Beams* @since 17.02.2003* @see #setContextInitializers* @see org.springframework.web.WebApplicationInitializer*/
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

ContextLoaderListener 类继承了 ContextLoader 类并且实现了 ServletContextListener 接口,按照启动程序,会调用其 contextInitialized() 方法

/*** Initialize the root web application context.*/
//初始化根应用上下文
@Override
public void contextInitialized(ServletContextEvent event) {initWebApplicationContext(event.getServletContext());
}

那么我们现在再看一下这个应用上下文的初始化过程

//初始化web应用的上下文
//ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {/*首先通过WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个String类型的静态变量获取一个根IoC容器,根IoC容器作为全局变量存储在application对象中,如果存在则有且只能有一个如果在初始化根WebApplicationContext即根IoC容器时发现已经存在则直接抛出异常,因此web.xml中只允许存在一个ContextLoader类或其子类的对象*/if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {throw new IllegalStateException("Cannot initialize context because there is already a root application context present - "  "check whether you have multiple ContextLoader* definitions in your web.xml!");}Log logger = LogFactory.getLog(ContextLoader.class);servletContext.log("Initializing Spring root WebApplicationContext");if (logger.isInfoEnabled()) {logger.info("Root WebApplicationContext: initialization started");}long startTime = System.currentTimeMillis();try {// Store context in local instance variable, to guarantee that// it is available on ServletContext shutdown.//如果context不存在,则进行创建if (this.context == null) {this.context = createWebApplicationContext(servletContext);}if (this.context instanceof ConfigurableWebApplicationContext) {ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context;if (!cwac.isActive()) {// The context has not yet been refreshed -> provide services such as// setting the parent context, setting the application context id, etcif (cwac.getParent() == null) {// The context instance was injected without an explicit parent ->// determine parent for root web application context, if any.ApplicationContext parent = loadParentContext(servletContext);cwac.setParent(parent);}/*** 配置并刷新应用的根IOC容器,这里会进行bean的创建和初始化工作。这里面最终会调用* {@link org.springframework.context.support.AbstractApplicationContext#refresh refresh()方法}* 并且IOC容器中的bean类会被放在application中*/configureAndRefreshWebApplicationContext(cwac, servletContext);}}//以属性的配置方式将application配置servletContext中,因为servletContext是整个应用唯一的,所以可以根据key值获取到application,从而能够获取到应用的所有信息servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);....
}

可以看到,initWebApplicationContext() 方法的整个执行过程都是为了创建应用的上下文,即根IOC容器。并且以 setAttribute 的方式将应用上下文设置到了servletContext中,这样在整个应用中都可以使用servletContext来进行各种应用信息的获取。

我们重点跟踪一下 configureAndRefreshWebApplicationContext() 这个方法。

protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {if (ObjectUtils.identityToString(wac).equals(wac.getId())) {// The application context id is still set to its original default value// -> assign a more useful id based on available informationString idParam = sc.getInitParameter(CONTEXT_ID_PARAM);if (idParam != null) {wac.setId(idParam);} else {// Generate default id...wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX  ObjectUtils.getDisplayString(sc.getContextPath()));}}//将ServletContext设置到application的属性中wac.setServletContext(sc);//获取web.xml中配置的contextConfigLocation参数值String configLocationParam = sc.getInitParameter(CONFIG_LOCATION_PARAM);if (configLocationParam != null) {//将web.xml的配置信息设置到application中wac.setConfigLocation(configLocationParam);}// The wac environment's #initPropertySources will be called in any case when the context// is refreshed; do it eagerly here to ensure servlet property sources are in place for// use in any post-processing or initialization that occurs below prior to #refreshConfigurableEnvironment env = wac.getEnvironment();if (env instanceof ConfigurableWebEnvironment) {((ConfigurableWebEnvironment) env).initPropertySources(sc, null);}customizeContext(sc, wac);//调用应用的refresh方法,进行IOC容器的装载wac.refresh();
}

我们跟踪一下debug代码,看看实际的的信息。

file

我们进入到 refresh() 方法中

file

可以看到,在refresh中完成了对于IOC容器中bean类的加载处理。

到此为止,SpringMVC已经完成了对于由元素标记的事件监听器。

初始化Filter

在完成了对于 listener 的初始化操作以后,会进行 filter 的创建和初始化操作。我们这里使用的是 CharacterEncodingFilter 。我们先看一下这个类的具体类图信息。

file

因为其实现了 Filter 接口,所以会调用其对应的 init(FilterConfig filterConfig) 方法。我们在其父类 GenericFilterBean 中找到了该方法的实现。

@Override
public final void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;//将设置的初始化参数信息设置到pvs中PropertyValues pvs = new FilterConfigPropertyValues(filterConfig, this.requiredProperties);if (!pvs.isEmpty()) {try {//将具体的filter类进行包装BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);//创建对应的资源加载类ResourceLoader resourceLoader = new ServletContextResourceLoader(filterConfig.getServletContext());Environment env = this.environment;if (env == null) {env = new StandardServletEnvironment();}bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, env));initBeanWrapper(bw);bw.setPropertyValues(pvs, true);}catch (BeansException ex) {String msg = "Failed to set bean properties on filter '"  filterConfig.getFilterName()   "': "   ex.getMessage();logger.error(msg, ex);throw new NestedServletException(msg, ex);}}//交由子类来实现initFilterBean();...
}

这里并未进行任何的初始化操作。其实Filter的主要作用还是在有请求过来时,进行的 doFilter() 中的处理,在启动阶段,处理比较少。

Servlet的初始化

web应用启动的最后一个步骤就是创建和初始化 Servlet ,我们就从我们使用的 DispatcherServlet 这个类来进行分析,这个类是前端控制器,主要用于分发用户请求到具体的实现类,并返回具体的响应信息。

file

根据类图可以看到,DispatchServlet 实现了 Servlet 接口,所以按照加载过程,最终会调用其 init(ServletConfig config) 方法。我们从 DispatchServlet 中寻找 init(ServletConfig config) 方法的实现,会发现该方法不存在,那么我们继续向上查找,在其父类中去寻找,最终在 GenericServlet 中找到了方法

public void init(ServletConfig config) throws ServletException {
this.config = config;
//交由子类来实现。
this.init();
}

我们在 HttpServletBean 中找到了 init() 方法的具体实现。

public final void init() throws ServletException {if (logger.isDebugEnabled()) {logger.debug("Initializing servlet '"   getServletName()   "'");}// Set bean properties from init parameters.//设置属性信息PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);if (!pvs.isEmpty()) {try {//将具体的实现来进行包装,使用了包装者模式BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));initBeanWrapper(bw);//将web.xml里面设置的属性信息设置到bw中bw.setPropertyValues(pvs, true);}catch (BeansException ex) {if (logger.isErrorEnabled()) {logger.error("Failed to set bean properties on servlet '"   getServletName()   "'", ex);}throw ex;}}// Let subclasses do whatever initialization they like.//由子类来实现initServletBean();if (logger.isDebugEnabled()) {logger.debug("Servlet '"   getServletName()   "' configured successfully");}
}

其中,对于 initServletBean() 方法则又交给了子类来处理,我们最终在 FrameworkServlet 类中找到了对应的实现

@Override
protected final void initServletBean() throws ServletException {getServletContext().log("Initializing Spring FrameworkServlet '"   getServletName()   "'");if (logger.isInfoEnabled()) {logger.info("FrameworkServlet '"   getServletName()   "': initialization started");}long startTime = System.currentTimeMillis();try {//初始化web应用容器this.webApplicationContext = initWebApplicationContext();initFrameworkServlet();}...
}

这里面主要是进行了web应用容器上下文的创建,并进行了初始化工作。我们跟踪一下初始化的具体流程

protected WebApplicationContext  () {//获取到根IOC容器WebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());WebApplicationContext wac = null;if (this.webApplicationContext != null) {// A context instance was injected at construction time -> use itwac = this.webApplicationContext;if (wac instanceof ConfigurableWebApplicationContext) {ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;if (!cwac.isActive()) {// The context has not yet been refreshed -> provide services such as// setting the parent context, setting the application context id, etcif (cwac.getParent() == null) {//将根IOC容器设置为servlet的IOC容器的父类//如果当前Servlet存在一个WebApplicationContext即子IoC容器// 并且上文获取的根IoC容器存在,则将根IoC容器作为子IoC容器的父容器cwac.setParent(rootContext);}//配置并刷新子容器,加载子IOC容器中对应的bean实体类configureAndRefreshWebApplicationContext(cwac);}}}if (wac == null) {// No context instance was injected at construction time -> see if one// has been registered in the servlet context. If one exists, it is assumed// that the parent context (if any) has already been set and that the// user has performed any initialization such as setting the context id//如果当前Servlet中不存在子IOC容器,则去查找wac = findWebApplicationContext();}if (wac == null) {// No context instance is defined for this servlet -> create a local one//如果查找不到,则去创建一个wac = createWebApplicationContext(rootContext);}...return wac;
}

代码比较长,其实 initWebApplicationContext() 函数的主要作用就是初始化一个Web类的IOC容器。通过debug跟踪的时候,我们看到最终会执行到 createWebApplicationContext() 这个方法,继续跟踪代码的执行流程

protected WebApplicationContext createWebApplicationContext(@Nullable ApplicationContext parent) {Class<?> contextClass = getContextClass();...//根据类信息初始化一个ConfigurableWebApplicationContext对象ConfigurableWebApplicationContext wac =(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);//设置web上下文的环境信息wac.setEnvironment(getEnvironment());//设置其父类为根IOC容器,根IOC容器是整个应用唯一的。wac.setParent(parent);//设置其具体的配置信息的位置,这里是 classpath:spring-mvc.xmlString configLocation = getContextConfigLocation();if (configLocation != null) {wac.setConfigLocation(configLocation);}//配置并刷新web应用的IOC容器configureAndRefreshWebApplicationContext(wac);return wac;
}protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac) {....//配置容器的相关信息wac.setServletContext(getServletContext());wac.setServletConfig(getServletConfig());wac.setNamespace(getNamespace());//配置容应用的加载监听器wac.addApplicationListener(new SourceFilteringListener(wac, new ContextRefreshListener()));// The wac environment's #initPropertySources will be called in any case when the context// is refreshed; do it eagerly here to ensure servlet property sources are in place for// use in any post-processing or initialization that occurs below prior to #refreshConfigurableEnvironment env = wac.getEnvironment();if (env instanceof ConfigurableWebEnvironment) {((ConfigurableWebEnvironment) env).initPropertySources(getServletContext(), getServletConfig());}postProcessWebApplicationContext(wac);//应用初始化信息applyInitializers(wac);//刷新加载里面的Bean实体类wac.refresh();
}

这里可以看到,在这个其实主要是根据配置文件信息进行类的加载工作,并且配置了一个容器加载信息的监听器 SourceFilteringListener。在最后通过 refresh() 方法进行了容器中实体类的加载过程。这个 refresh() 方法和我们在 Listener 中实现类的初始化过程使用的是同一个方法。到此为止,在我们应用中配置的所有的类都能够扫描到,并且配置到了我们的IOC容器中。

因为我们配置了相关的容器加载的监听器,在refresh()方法中调用 finishRefresh() 方法时,发送对应的容器加载完成广播信息,从而能够调用我们所注册的监听器 SourceFilteringListener 。我们看一下里面的调用逻辑

public SourceFilteringListener(Object source, ApplicationListener<?> delegate) {this.source = source;this.delegate = (delegate instanceof GenericApplicationListener ?(GenericApplicationListener) delegate : new GenericApplicationListenerAdapter(delegate));
}@Override
public void onApplicationEvent(ApplicationEvent event) {if (event.getSource() == this.source) {onApplicationEventInternal(event);}
}protected void onApplicationEventInternal(ApplicationEvent event) {if (this.delegate == null) {throw new IllegalStateException("Must specify a delegate object or override the onApplicationEventInternal method");}/*** 这里的delegate,是传入的具体的代理类*/this.delegate.onApplicationEvent(event);
}

可以看到最后,其实是调用了我们创建这个类时,传入的 ContextRefreshListener 这个对象的 onApplicationEvent 这个方法。我们继续看一眼这个类

private class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {//最终调用了FrameworkServlet的onApplicationEvent方法FrameworkServlet.this.onApplicationEvent(event);}
}

继续跟踪:

public void onApplicationEvent(ContextRefreshedEvent event) {this.refreshEventReceived = true;synchronized (this.onRefreshMonitor) {//调用了onRefresh方法onRefresh(event.getApplicationContext());}
}protected void onRefresh(ApplicationContext context) {// For subclasses: do nothing by default.
}

可以看到,最后的 onRefresh() 是由子类来实现的,也就是我们的 DispatcherServlet 类。

终于到我们的正主出场了。。

file

我们看看我们的正主到底干了个什么活

    //context为DispatcherServlet创建的一个IoC子容器@Overrideprotected void onRefresh(ApplicationContext context) {initStrategies(context);}//初始化servlet使用的策略信息,子类可以通过覆写该方法类增加更多的呃策略方法protected void initStrategies(ApplicationContext context) {//初始化MultipartResolver,可以支持文件的上传initMultipartResolver(context);//初始化本地解析器initLocaleResolver(context);//初始化主题解析器initThemeResolver(context);//处理器映射器,将请求和方法进行映射关联initHandlerMappings(context);//处理器适配器initHandlerAdapters(context);//处理器异常解析器initHandlerExceptionResolvers(context);//initRequestToViewNameTranslator(context);//视图解析器initViewResolvers(context);//FlashMap管理器initFlashMapManager(context);}

可以看到里面主要是初始化了我们的所使用到的一些解析器和处理器等。当接收到请求后,就可以根据这些解析器来进行请求的解析处理、方法的调用、异常的处理等等。

到此为止,Servlet的初始化工作就整个完成了。想当的复杂,主要是将很多的方法实现在父类中进行了处理。层级比较复杂,需要一点点跟踪分析。

本文由 开了肯 发布!

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

相关文章

  1. BZOJ4066 简单题(KD树区间求和)

    题目描述:https://www.lydsy.com/JudgeOnline/problem.php?id=4066题解无脑KD树,但是它卡我常数啊啊啊啊啊啊啊!!!!!写完一交TLE2min later,找到了一个SB错误:比较大小比较反了。。。然后就开始循环展开又T了然后就写了部分重构,调了个0.7的参数又T了然后把函数里面…...

    2024/4/27 22:41:00
  2. 深度学习基础知识(五)--- 激活函数

    dropout 可以看作是一种实用的bagging的方法,即模型平均思想的一种运用。因为模型平均要对训练集有放回的采样,得到多个不同的训练集,再训练多个不同的模型,在测试阶段由多个不同的模型 表决 或者 平均 来做出最终预测。但是对于深度神经网络而言,训练多个不同的模型 可能…...

    2024/4/28 5:56:53
  3. lectcode-寻找旋转数组中的最小值

    要求 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 示例 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2] 输出: 0 代码二分法-寻找落差位置int findMin(vec…...

    2024/4/28 13:41:12
  4. 卷积神经网络 卷积的概念

    1 卷积的定义共同特征:...

    2024/4/28 0:06:12
  5. 学习总结

    今天看的,老师把整个寒假要做的数论练习题都放了出来,告诉我们不仅要做题,重要的是锻炼出做题的思维,总结出思考问题的方法规律。感觉老师总结的好正确啊。现在做的数论的题目,很多都是把题目经过转化,数学公式的推算最后转变到我们数论常用的知识点上面来。进而应用数论…...

    2024/4/28 6:00:26
  6. DeepinWine微信等软件如何升级

    前言 不管是Ubuntu还是Deepin系统的用户,我相信不少同学是用的Deepin移植的基于Wine容器的QQ和微信等Windows上面的软件。对此我很久前也有一篇引导文章:Ubuntu 18.04/16.04安装最新版QQ和微信 具体安装流程不是本文重点哈,就不介绍了,可以看上述链接。本文主要讲讲安装后如…...

    2024/4/28 12:45:13
  7. git-更改本地和远程分支的名称

    git-更改本地和远程分支的名称 git branch -m old_branch new_branch # Rename branch locally git push origin :old_branch # Delete the old branch git push --set-upstream origin new_branch # Push the new branch, set local branch to track the new remote...

    2024/4/28 4:38:27
  8. Cortex-M系列: 软件中断和硬件中断

    软件中断请求在逻辑上比较简单,但相关程序的解释比较少,本文将在第一部分进行讲解。硬件中断逻辑比较复杂,但网上的例程比较多。虽然我们知道怎么配置单片机的中断,但估计很多人对它的细节还不是很理解,我将在后半部分讲解,但不会涉及寄存器的操作,有关中断时的寄存器操…...

    2024/4/28 18:41:27
  9. GNU汇编--部分代码理解

    部分代码理解 //下面是s3c2440部分汇编代码 .text/*.text是对应的代码段,一个汇编语言的开始一定有代码段*/ .global _start/*.global是定义一个全局函数_start,start也是代码段函数的缺省入口,汇编语言从start开始执行*/ _start:b reset /* vector 0 : reset */ldr pc, un…...

    2024/4/28 8:40:51
  10. 统计一行字符中英文字母、空格、数字、其他字符的个数

    https://www.nowcoder.com/practice/539054b4c33b4776bc350155f7abd8f5?tpId=37&tqId=21263&tPage=2&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking一、题目描述输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。二、…...

    2024/4/28 8:09:57
  11. lecture7 - Vanishing Gradients and Fancy RNNs

    课程内容主要内容神经网络中的问题梯度消失问题(Gradient Vanishing)梯度爆炸问题(Gradient Exploding)如何解决?新的RNN单元长短期记忆单元(Long-Short-Term Memory)门控循环单元(Gated Recurrent Unit)高级网络结构跳接结构(Skip Connection)Dense NetworkResidual NetworkH…...

    2024/4/27 23:45:42
  12. 【剑指Offer】 51.构建乘积数组 python实现

    题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。 # -*- coding:utf-8 -*- class Solution:def multiply(self, A):# write code hereres = []for i in range(0,len(A)):a = 1for j in A[…...

    2024/4/28 17:08:28
  13. python装饰器

    python 装饰器这里使用一个装饰器,函数来计算该函数的运行时间简单示例def dire(func):def wrapper(): #函数的使用包括在这里start=time.time()func()end=time.time()print(end-start)return wrapper() # 循环数的范围 @dire # dire(cicle) def cicle():for i in range(1,100…...

    2024/4/28 17:56:44
  14. 【打卡挑战第十一天】

    打卡挑战第十一天在下列关于“字符串”的陈述中,不正确的描述是() A 字符串是一种特殊的线性表 B 字符串可以连续存储,也可以链式存储 C 字符串的长度必须大于零 D ‘’空串”与“空白串”不是同一个含义 解析:C.如果有多个中断同时发生,系统将根据中断优先级响应优先级最…...

    2024/4/28 3:03:11
  15. 【你好,windows】windows7 x64x86旗舰纯净终结版(usb3.0_nvme)2020.1.19

    1采用微软MSDN官方原盘镜像提取旗舰版为母盘,升级IE11.0,主页设为about:NewsFeed。集成微软2020年1月14日发布的最终安全更新KB4534314和月度更新汇总KB4534310、服务堆栈更新安装KB4531786(包含勒索补丁kb4012212、kb4012215),X64系统集合nvme补丁。修改注册表禁止win7到期…...

    2024/4/28 2:59:17
  16. usb协议

    http://www.usbmadesimple.co.uk/index.html...

    2024/4/28 8:45:35
  17. Python基础知识(十一)正则表达式

    Python基础知识(十一)正则表达式特殊符号与字符量词:贪婪与非贪婪边界匹配:RegexObjectMatchObjectGroup 编组字符串操作①split 切割②. sub 替换③. subn 替换并返回替换数量 编译标记模块化操作 ①.purge()清除缓存 ②.escape()逃逸字符 系统工具系统模块...

    2024/4/28 4:36:53
  18. Springboot+mybatis项目-通过数据库表、实体类 自动创建 DaoMapper类、mapper.xml

    最近练习springboot项目,发现mybatis框架的mapper.xml和DaoMapper接口类方法实现太费劲了,虽然提高了灵活性,但是当表太多时,单纯写这部分就累死人,所以找了一下如何能够通过自动化工具创建。首先我们需要在pom.xml文件中加入插件<plugins><!-- mybatis generato…...

    2024/3/29 14:03:30
  19. centos7下docker的安装

    文章开头,首先来说下Docker的优点,市面上比较流行的一句总结叫做:“开箱即用,快速部署,可移植性强,环境隔离”,就我个人理解意思就是生产环境部署项目方便高效,大大提高生产效率. 下面开始正题!!! ​ 一 ,安装环境及准备工作 ​ centos7:docker官…...

    2024/3/29 14:03:29
  20. 前端学习笔记

    html复习 表单 一、四个表单属性 针对单选和多选 readonly 属性规定输入字段为只读。 只读字段是不能修改的。不过,用户仍然可以使用 tab 键切换到该字段,还可以选中或拷贝其文本。Country: disabled 属性规定应该禁用 input 元素。 针对下拉选项 二、三种提交按钮方法:hell…...

    2024/3/29 14:03:28

最新文章

  1. 【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

    背景需求&#xff1a; 花了十周&#xff0c;终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印&#xff0c;我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张&#xff0c;因此要在第2页插入空白页&#xff0c; 2、教案有3页…...

    2024/4/29 0:42:55
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. day7:哈希表学习

    ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 总结 对于查&#xff0c;某个元素是否在集合中出现过&#xff0c;哈希法是非常高效的方法 但是对于需要去重的情况下&#xff0c;哈希法要注意太多细节&#xff0c;很难完美写完&#xff0c;因此采用双指针…...

    2024/4/19 3:24:01
  4. 蓝桥杯加训

    1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…...

    2024/4/27 19:03:08
  5. Oracle 正则表达式

    一、Oracle 正则表达式相关函数 (1) regexp_like &#xff1a;同 like 功能相似&#xff08;模糊 匹配&#xff09; (2) regexp_instr &#xff1a;同 instr 功能相似&#xff08;返回字符所在 下标&#xff09; (3) regexp_substr &#xff1a; 同 substr 功能相似&…...

    2024/4/26 12:58:22
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在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