Spring 源码测试实例

一个注解配置类,在com包里有一个User接口,两个实现了User接口的方法(提示:从本章开始,建议读者边看边实操)

image

测试类,笔者将以AnnotationConfigApplicationContext
这个注解类作为入口对源码进行深度分析

image

Spring 源码分析

进入笔者将以AnnotationConfigApplicationContext的构造方法

image

注意细节AnnotationConfigApplicationContext继承了GenericApplicationContext

image

所以会优先执行GenericApplicationContext的默认构造器,并且会创造一个叫DefaultListableBeanFactory的这么个类,

image

这个类分量很大,是Spring的核心类,我们点开DefaultListableBeanFactory这个类,

image

我们一步一步向上跟踪会发现它实现了BeanFactory,所以这就我们一直说的Bean工厂、Bean工厂,实际上Bean工厂也就是在这个时候就创建了,当然这个类还要其他重要的功能,笔者暂时放一放,咱们继续往下走,执行完父类的构造器后,现在开始执行自己的构造器了

public AnnotationConfigApplicationContext() {   //这个reader顾名思义是一个读取器,而且十分重要,稍后会说明为什么重要  this.reader = new AnnotatedBeanDefinitionReader(this);  //这个scanner说实话没有什么卵用,因为在spring内部自己new了一个扫描器,而不是用的这个对象,而这个类是交给程序员手动获取的,基本用不到  this.scanner = new ClassPathBeanDefinitionScanner(this);}   

如上图所示:AnnotationConfigApplicationContext构造器创建了一个读取器,一个扫描器,而这个scanner为什么由上述注释所写的后期我们在扫描的时候证明。进入this.reader=new AnnotatedBeanDefinitionReader(this); 这行代码调入

image

然后构造器相互调用最终调用这个构造器

image

进入AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
里面又是委托模式,继续渗入registerAnnotationConfigProcessors(registry, null);
最终进入核心方法registerAnnotationConfigProcessors()这个方法大概就做了两件事情,获取之前创建的DefaultListableBeanFactory,然后往里面装一些工具组件,包含排序组件、转换器组件、以及4个特别特别重要的后置处理器。分别是


1、ConfigurationClassPostProcessor
2、AutowiredAnnotationBeanPostProcessor
3、CommonAnnotationBeanPostProcessor
4、EventListenerMethodProcessor

在registerAnnotationConfigProcessors()涉及到Spring后置处理器和BeanDefinition,下面会进行简要分析

Spring后置处理器

什么是后置处理器,笔者这里对Spring其中一个顶层的后置处理器进行详细说明

image

看了上面的注释,读者可能还是比较懵逼,我们在实践一下

image

我们实现了BeanFactoryPostProcessor拿到了ConfigurableListableBeanFactory,然后我们从工厂可以获取某一个类的BeanDefinition(注意:很多小伙伴一个有一个误区,不知道什么是对象什么是Bean,笔者认为Bean一定是对象,对象不一定是Bean,而对象成为Bean的条件就是完成Spring的整体生命周期),拿到从工厂获取的BeanDefinition,是不是就可以进行修改这个BeanDefinition,再结合笔者上文后置处理器的注释,相信这个时候读者应该对后置处理器有一定初步的认识,当然这个时候小伙伴们可能就要问了,我拿到BeanDefinition有什么用?看下图,

image

这里并没有对Spring Bean流程详细介绍,只是对整体流程描述了大概。如果还是不明白我们在后面会详细说明后置处理器的作用。

BeanDefinition

在think in java的作者提出,一切皆为对象,一切皆可抽象,而BeanDefinition正是Spring抽象设计的精髓,回到上文笔者强调Bean和对象不是同一个概念,Spring认为仅仅是java自带的对象是不能满足于我所需求的,就好比单例、Lazy等一些特性无法满足,所以Spring定义一个BeanDefinition作为对象的抽象,来实现对象的抽象,(当然BeanDefinition的分量很高,笔者在后面会更详细的介绍它具体的作用)明白这点后我们回到代码:

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(BeanDefinitionRegistry registry, @Nullable Object source) {//从注册器获取beanFactoryDefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);if (beanFactory != null) {//这里是判断beanFactory有没有排序的工具if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);}//这里是判断beanFactory有没有转换器if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());}}//之后你会看到很多BeanDefinitionHolder,这个BeanDefinitionHolder其实没什么作用,就是一个//封装了BeanDefinition的map,而BeanDefinition是对spring将要实例化对象的一个缓存,//类似于对象的class,只是功能比class更丰富Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);//重点来了,这里涉及到了一个概念叫BeanFactoryPostProcessor,详细看接口//registerPostProcessor这个方法就是将RootBeanDefinition放到工厂的map对象去if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}//下面是注册五个类,但有一个类会被忽略,所以总共只注册了五个类if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));}// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition();try {def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,AnnotationConfigUtils.class.getClassLoader()));}catch (ClassNotFoundException ex) {throw new IllegalStateException("Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);}def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));}if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);def.setSource(source);beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));}return beanDefs;}

这里其实就是获取前面创建的工厂,然后向工厂装一些组件,目的就是初始化工厂,然后再为工厂创建Spring自定义的后置处理器作为BeanDefinition存起来,然后返回,这是我们的this已经执行完毕,回到这个图。

image

咱们再看一遍注释,相信读者大致能理解
我们再看register方法->this.reader.register(componentClasses);->registerBean(componentClass);->doRegisterBean(beanClass, null, null, null);

<T>  void doRegisterBean(Class<T> beanClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {//这里可以看到使用AnnotatedGenericBeanDefinition去创建的 后面会通过这个类的父接口去做一些判断//此外在这个创建注解BD的时候就对内部的元注解进行初始化,自己有标识了注解AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}abd.setInstanceSupplier(instanceSupplier);//获取作用域元数据ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);abd.setScope(scopeMetadata.getScopeName());String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));//这里是对Config配置类进行注解信息的设置,Lazy,Primary,DependsOn等等AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);if (qualifiers != null) {for (Class<? extends Annotation> qualifier : qualifiers) {if (Primary.class == qualifier) {abd.setPrimary(true);}else if (Lazy.class == qualifier) {abd.setLazyInit(true);}else {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}for (BeanDefinitionCustomizer customizer : definitionCustomizers) {customizer.customize(abd);}BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);//将bd注册到我们的BeanFactory去BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}

其实我们可以看到核心代码就是最下面一句, BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);将我们的配置类或普通类注册到BeanDefinitionMap集合里。而前面只是做一些判断,比如是不是Lazy,Primary,DependsOn,有没有Supplier等

深度分析Spring核心方法refresh()

refresh()目录
//这个方法没什么用,里面都是一些系统环境设置
prepareRefresh();
// 这里只是将beanFactory拿出来
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对beanFactory添加一些处理器,并设置一些属性
prepareBeanFactory(beanFactory);
// 空方法
postProcessBeanFactory(beanFactory);
// 这里是执行实现了BeanFactoryPostProcessor这个接口的子类
// 重点就是spring自己的一个类
// 秒扫出要实例化的类,放进工厂的beanDef里面,这里只是放的bd并不是真正的实例化对象invokeBeanFactoryPostProcessors(beanFactory);
//注册BeanPostProcessor
registerBeanPostProcessors(beanFactory);
// Initialize message source for this 
context.initMessageSource();
// 创建ApplicationEventMulticaster这么一个类initApplicationEventMulticaster();
//空方法  
onRefresh();
// 注册监听器
registerListeners();
//完成对bean的创建finishBeanFactoryInitialization(beanFactory);
// publish corresponding event.
finishRefresh();

我们可以看到Spring在refresh方法里面做了很多很多的事情,我们逐步分析:

prepareRefresh():这个方法并不用太关注,这是Spring记录一些系统日期、日志之类的,我们直接跳过。

obtainFreshBeanFactory():这个方法只是将创建的工厂拿出来给后续的方法作为参数利用

image

prepareBeanFactory():


protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 这里是对beanFactory设置一些工具类,后面用到再说,先跳过beanFactory.setBeanClassLoader(getClassLoader());beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));// 添加一个ApplicationContextAwareProcessor后置处理器beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));//设置一些需要忽略的类,避免重复,这里就是避免从面部传进这些class影响Spring内部操作beanFactory.ignoreDependencyInterface(EnvironmentAware.class);beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);beanFactory.ignoreDependencyInterface(MessageSourceAware.class);beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

看这句代码,beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));、进入ApplicationContextAwareProcessor 找到下面代码

image

可以看到里面有大量的回调接口。如果没搞明白我们写了例子

image

image

可以看出,我们可以通过回调拿到Spring内部的对象,这里可以结合再一个实例,单例对象的属性注入原型对象,就需要这种方式解决,而这个对象那里来的呢,咱们回到源码:

  //解决依赖注入来源问题beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);beanFactory.registerResolvableDependency(ResourceLoader.class, this);beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);beanFactory.registerResolvableDependency(ApplicationContext.class, this);// 注册一个用来销毁Bean的后置处理器beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));// Detect a LoadTimeWeaver and prepare for weaving, if found.if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));// Set a temporary ClassLoader for type matching.beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}// Register default environment beans.if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());}if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());}if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());}}

这里就是Spring内部注册的对象,这里涉及到一个数据源的问题,我们会在依赖注入的环节单独详细说明笔者暂且可以认为这些对象没有经过Spring的生命周期,但可以提供依赖注入。

postProcessBeanFactory()

image

空壳方法,这里猜测是Spring为自己预留的拓展功能。接下来的方法较为重要,笔者打算单独开一章节详细分析

本小节总结:
1、创建一个工厂 this.beanFactory = new DefaultListableBeanFactory();
2、创建一个读取器 this.reader = new AnnotatedBeanDefinitionReader(this);
3、对beanFactory添加一些组件工具,添加4个后置处理器
4、通过之前创建的读取器把传进来的类转换为BeanDefinition注册到工厂里。

5、Spring在自己内部设置了一些数据源信息比如ApplicationContext、Resourse等

6、添加了一个ApplicationContextAwareProcessor后置处理器提供Aware回调

7、忽略一些Spring内部关键的类,防止外部修改或影响了Spring内部的核心类

文章来源微信公众号《七天0》

下一章节,笔者会真正进入Spring注解解析核心源码

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

相关文章

  1. 剑指offer(07-09)题解

    剑指offer07-09题解07题解08题解09题解 07题解 题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39思路解析其实今天解析的三道题目刚好都属于算法题目里的同一分支,就是递归,也可以说是动态规…...

    2024/5/1 7:53:40
  2. Spring核心源码深度解析(四) invokeBeanFactoryPostProcessors(上)

    invokeBeanFactoryPostProcessors(上)protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {//这里的参数getBeanFactoryPostProcessors()讲道理很容易误导大家,我在调试的时候发现它什么都没返回,注意他们的区别,list和map//回…...

    2024/5/1 13:37:26
  3. 这简单!eclipse设置因为字母自动提示【如输入str,弹窗提示String】

    很简单,先打开eclipse,顶部找到window,读图点击preference按我的截图提示操作,然后点击apply and close,即可。试一下...

    2024/5/1 0:19:29
  4. DelphiXE程序开机运行设置

    一、代码操作注册表uses中包含 Registryvar MyFilePath:String;beginMyFilePath:=Application.ExeName ;MyReg:=TRegistry.Create ; MyReg.RootKey:= HKEY_CURRENT_USER; MyReg.OpenKey(SoftWare\Microsoft\Windows\CurrentVersion\Run,True); MyReg.WriteString (myfile,My…...

    2024/5/1 15:37:58
  5. kafka如何扩容服务器、重新分区Partition

    kafka如何扩容服务器、重新分区Partition...

    2024/5/1 6:17:54
  6. 算法:最长回文子串。

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例输入: "cbbd" 输出: "bb"动态规划思路与算法对于一个子串而言,如果它是…...

    2024/4/16 6:04:37
  7. nginx+php7-fpm 性能提升几倍,跟踪实践结果并优化

    历史ubuntu服务器使用的apache+php5,现在使用nginux+php7-fpm方式,看效果图,啥也不说了。强烈推荐升级到php7,当然升级中基本上没碰到什么问题,除了升到7.1有些问题,最后安装的7.0版本。运行后,代码基本上没改动。上图运行一段时间后,内存占用低其实是不好的。需要对fp…...

    2024/4/16 6:04:47
  8. kafka工作原理

    文章目录架构元数据复制首领副本追随者副本处理请求元数据请求生产请求获取请求分区存储 架构元数据broker集群成员列表。维护在zk的 /brokers/ids下的临时节点。 控制器。broker之一,通过成功创建/controller节点判定。 监听各broker zk节点状态,维护分区首领和追随者列表,…...

    2024/4/16 6:04:43
  9. 事务的隔离性(未完待续)

    在关系型数据库里, 一个事务可以是一条SQL语句或者一组SQL语句或者整个程序.事务四大特性: ACID, Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性).本文只讲述隔离性.当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、可重…...

    2024/4/12 13:57:48
  10. JavaSE之final关键字与static关键字

    1、static修饰类(只能修饰内部类) public class StaticTest {/*** 静态内部类*/public static class InnerClass {InnerClass() {System.out.println("静态内部类构造方法。。。");}public void method() {System.out.println("静态内部类方法。。。");}…...

    2024/4/17 1:44:21
  11. 实时通信SignalR

    ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。WebSocket是HTML5提供的新的API,可以在Web网页与服务器端间建立Socket连接…...

    2024/4/16 6:04:52
  12. Ngnix配置不同url发送到不同的服务器

    Ngnix配置不同url发送到不同的服务器 背景 根据项目需要,有些存在内存中的数据无法在多个服务器节点中共享,此时需要将指定url请求发送到一台服务器节点,用于读取和处理内存数据。 配置 nginx的安装就不多说了, 需要的同学可以在官网(http://nginx.org/en/download.html)…...

    2024/4/16 6:04:32
  13. java 判断两个数是否异号

    java 整型int占4个字节32位,两个数异或后移动31位判断结果,如果是1则异号,如果是0则同号1 public class ShowEnviromentViarible {2 3 public static void main(String[] args) {4 int num1 = 1;5 int num2 = -1;6 System.out.println("nu…...

    2024/4/9 3:22:17
  14. Laravel——Crabon

    $time = "2020-07-07";$date = Carbon::parse($time)->subMonth()->format(Y-m);//获取上一个月的月份$date = Carbon::parse($time)->format(Y-m);//获取本月的月份$date = Carbon::parse($time)->addMonth()->format(Y-m);//下一个月的月份$start =…...

    2024/4/16 6:04:57
  15. foreach方法使用

    用法foreach方法主要是针对数组而言的,对数组中的每个元素可以执行一次方法var array = [a, b, c, e]; array.forEach((a)=> {console.log(a); });属性foreach方法主要有三个参数,分别是数组内容、数组索引、整个数组var array = [a, b, c, e]; array.forEach((a,b,c)=>…...

    2024/4/25 12:43:13
  16. 八面成功进阿里,靠这两份笔记中的电商平台移动商城开发等项目

    八面成功进入阿里的关键就在于你对于微服务的理解和应用到底到了什么地步,毕竟微服务也是几年最炙手可热的技术了。首先我们要知道微服务的定义到底是什么?微服务架构是将复杂系统使用组件化的方式进行拆分,并使用轻量通信方式进行整合的一种设计方法。微服务就是通过这种架…...

    2024/4/17 1:44:09
  17. #Linux小白#篇十之磁盘管理(二)

    创建 逻辑卷 基本概念: 1、 物理卷-----PV(Physical Volume) 物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。 2、 卷组--------VG(Volumne Group) 卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添…...

    2024/4/13 18:53:04
  18. 随机梯度下降简单实现

    随机梯度下降数据集构造划分训练集、测试机算法实现超参数设置模型训练训练结果迭代参数变化结果展示 还记得刚开始看吴恩达老师的机器学习课程的时候,经常看不懂的就是梯度下降,随机梯度下降和批量梯度下降的区别老是看不明白。迷迷糊糊的,说不清楚吧,还知道大概是什么个意…...

    2024/4/16 6:05:23
  19. 详谈内部排序之快速排序

    快速排序 交换排序: ​ 两两比较待排序记录的关键码,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止 。 ​ 交换排序的主要算法有: ​ (1) 冒泡排序 ​ (2) 快速排序快速排序基本思想:…...

    2024/4/30 1:31:23
  20. python内置函数之eval() 函数

    文章目录eval() 函数描述语法参数返回值实例eval() 函数 描述 eval() 函数用来执行一个字符串表达式,并返回表达式的值。 语法 以下是 eval() 方法的语法: eval(expression[, globals[, locals]])参数expression – 表达式。 globals – 变量作用域,全局命名空间,如果被提供…...

    2024/4/16 6:05:18

最新文章

  1. 从键入网址到网页显示,期间发生了什么?

    从键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 孤单小弟【HTTP】真实地址查询【DNS】指南帮手【协议栈】可靠传输【TCP】远程定位【IP】两点传输【MAC】出口【网卡】送别者【交换机】出境大门【路由器】互相扒皮【服务器与客户端】相关问答 不少小伙伴在面试过程…...

    2024/5/1 18:21:22
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 自动化标准Makefile与lds

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

    2024/4/30 2:45:52
  4. vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

    文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框&#xff08;input&#xff09;&#xff1a;2、对于复选框&#xff08;checkbox&#xff09;&#xff1a;3、对于选择框&#xff08;select&#xff09;&#xff1a;4、对于组件&#xff08;comp…...

    2024/5/1 13:24:03
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/4/30 18:14:14
  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/4/30 18:21:48
  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/4/25 18:39:16
  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/4/27 23:24:42
  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/4/30 9:43:22
  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