Spring:IOC

IOC容器

IOC思想

IOC:Inversion of Control,翻译过来是反转控制。

①获取资源的传统方式

自己做饭:买菜、洗菜、择菜、改刀、炒菜,全过程参与,费时费力,必须清楚了解资源创建整个过程中的全部细节且熟练掌握。

在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的

模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

②反转控制方式获取资源

点外卖:下单、等、吃,省时省力,不必关心资源创建过程的所有细节。

反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

③DI

DI:Dependency Injection,翻译过来是依赖注入

DI 是 IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器

的资源注入。相对于IOC而言,这种表述更直接。

所以结论是:IOC 就是一种反转控制的思想, 而 DI 是对 IOC 的一种具体实现。

IOC容器在Spring中的实现

Spring 的 IOC 容器就是 IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做 bean。在创建bean 之前,首先需要创建 IOC 容器。Spring 提供了 IOC 容器的两种实现方式:

①BeanFactory

这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

②ApplicationContext

BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用

ApplicationContext 而不是底层的 BeanFactory。

③ApplicationContext的主要实现类

类型名

简介

ClassPathXmlApplicationContext

通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象

FileSystemXmlApplicationContext

通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象

ConfigurableApplicationContext

ApplicationContext 的子接口,包含一些扩展方法refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。

WebApplicationContext

专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

基于XML管理bean

入门案例

  1. 创建Maven Module
  2. 引入依赖
<dependencies>
    <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- junit测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

  1. 创建类HelloSpring
public class HelloSpring {
    public void sayHello(){
        System.out.println("helloSpring");
    }
}
  1. 创建Spring的配置文件

  1. 在Spring的配置文件中配置bean
<!--
	配置HelloSpring所对应的bean,即将HelloSpring的对象交给Spring的IOC容器管理
	通过bean标签配置IOC容器所管理的bean
	属性:
		id:设置bean的唯一标识
		class:设置bean所对应类型的全类名
-->
<bean id="helloSpring" class="com.kailong.bean.HelloSpring"></bean>
  1. 创建测试类测试
@Test
public void testHelloSpring(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    HelloSpring helloSpring = (HelloSpring) ac.getBean("helloSpring");
    helloSpring.sayHello();
}

测试结果:

  1. 思路
    image
  2. 注意

Spring 底层默认通过反射技术调用组件类的无参构造器来创建组件对象,这一点需要注意。如果在需要无参构造器时,没有无参构造器,则会抛出下面的异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name'helloSpring' defined in class path resource applicationContext.xml: Instantiation of beanfailed; nested exception is org.springframework.beans.BeanInstantiationException: Failedto instantiate com.kailong.bean.HelloSpring: No default constructor found; nestedexception is java.lang.NoSuchMethodException: com.kailong.bean.HelloSpring.<init>()

获取bean

方式一:根据id获取

由于 id 属性指定了 bean 的唯一标识,所以根据 bean 标签的 id 属性可以精确获取到一个组件对象。

上个实验中我们使用的就是这种方式。

方式二:根据类型获取

@Test
public void testHelloSpring(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    HelloSpring bean = ac.getBean(HelloSpring.class);
    bean.sayHello();
}

方式三:根据id和类型

@Test
public void testHelloSpring(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    HelloSpring bean = ac.getBean("helloSpring",HelloSpring.class);
    bean.sayHello();
}

注意

当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个

当IOC容器中一共配置了两个:

<bean id="helloSpringOne" class="com.kailong.bean.HelloSpring"></bean>
<bean id="helloSpringTwo" class="com.kailong.bean.HelloSpring"></bean>

根据类型获取时会抛出异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean

of type 'com.kailong.bean.HelloSpring' available: expected single matching bean but

found 2: helloSpringOne,helloSpringTwo

扩展

  • 如果组件类实现了接口,根据接口类型也可以获取bean,但前提是bean唯一
  • 如果一个接口有多个实现类,这些实现类都配置了 bean,根据接口类型不可以获取 bean,因为bean不唯一

结论

根据类型来获取bean时,在满足bean唯一性的前提下,其实只是看:『对象 instanceof 指定的类型』的返回结果,只要返回的是true就可以认定为和类型匹配,能够获取到。

公众号本文地址:https://mp.weixin.qq.com/s/Wgrz5X-uTAZnITRy-jF1bA

欢迎关注公众号:愚生浅末。

本文转载于网络 如有侵权请联系删除

相关文章

  • asp dotnet core 图片在浏览器没访问可能原因

    我写了一个项目用来广告就用到广告的图片,但是广告的图片放在博客的链接无法访问,连我的方法都没有调用,而我尝试网页直接访问图片链接是可以访问的,最后找到原因是广告插件禁用了图片访问我在一个方法创建了广告的图片,我尝试在很多工具里面都可以访问到这张图片,但是我放在CSDN等都无法访问,我在下面代码加上断点都没有进来,但是我在其他的本地应用都可以正常使用[Route("Advertising.png")] [HttpGet] publicFileResultGetAdvertising() { varfile=CreateImage(); returnFile(file,"image/png"); }复制我在浏览器的流量看到了下图,我的图片没有被访问我从控制台看到下面输出GEThttp://api2.service.walterlv.com/api/Image/Advertising.pngnet::ERR_BLOCKED_BY_CLIENT复制我通过这个字符串找到了原来是AdBlock等广告插件屏蔽了任何名字带广告的图片,于是广告的图片没有加载解决

  • 大数据||使用AI算法进行水循环系统故障精准预测

    水循环系统是锅炉系统中的重要单元,用于对锅炉的用水供给和冷却。贮存在沉淀水池中的水,经过过滤器材杂质过滤后送入离心泵的入口,流经泵体进行循环,离心泵则由电机进行驱动。水循环冷却系统的工作流程是冷却水经离心泵加压后流至喷淋塔顶部的喷淋头,喷淋头在此与自下而上的冷却气体进入热交换。冷却水经换热后温度升高,在塔内积存起来,并保持一定液位,防止气体逸出。塔底的排水管排出的冷却水进入凉水塔,在凉水塔中冷却水由风扇鼓出的风进行冷却后,回到沉淀池,整个水循环一周。 水循环系统AI建模为满足系统的稳定性,避免因突然发生故障造成系统停运,需要对常见故障进行预测。水循环系统故障包含泵体堵塞、机械故障、管道堵塞等,系统类的故障模型不仅与系统中的设备有关,还与生产工艺流程和操作指标相关,很难建立专家算法模型,因此目前尚没有成熟的专家算法。近年来随着大数据和机器学习技术的成熟,通过采集包括离心泵振动、进口压力、出口压力、出口流量、轴承温度及电机电流等参数,再通过AI机器学习算法进行建模和迭代的方式取得了相对于传统专家建模方式更好的效果。水循环系统构建故障诊断模块,自动从该系统当前工艺参数中辨别和判断故障,既可避

  • git push 报错处理 ! [rejected] master -> master (non-fast-forward)

    正常init一个git工程的流程:1.在工程目录下使用gitinit2.使用gitadd*在使用add*之前可以创建一个.gitignore文件,避免提交一些无用的文件3.gitcommit-m‘init’4.添加远程仓库位置:gitremoteaddorigingit@gitee.com:chenjiangtao/my-springboot-sample.git5.gitpush-uoriginmaster初次提交时,如果创建的respo里有内容(readme.md等),就会报错![rejected]master->master(non-fast-forward) error:failedtopushsomerefsto'git@gitee.com:chenjiangtao/my-springboot-sample.git' hint:Updateswererejectedbecausethetipofyourcurrentbranchisbehind hint:itsremotecounterpart.Integratetheremotechanges(e

  • SpringBoot代码片段,方便自己查看[持续添加]

    文章目录application.yml配置封装Result返回类调用Pythonapplication.yml配置server: port:9000 spring: datasource: username:root password:123456 url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC driver-class-name:com.mysql.cj.jdbc.Driver thymeleaf: cache:false#模板热部署、禁用thymeleaf缓存 mode:HTML suffix:.html prefix:classpath:/templates/ encoding:UTF-8 servlet: content-type:text/html mvc: static-path-pattern:/static/**#添加static文件夹下其他文件夹可访问 mybatis: type-aliases-pac

  • spring-boot-route(十六)使用logback生产日志文件

    日志是一个系统非常重要的一部分,我们经常需要通过查看日志来定位问题,今天我们一起来学习一下SpringBoot的日志系统。有很多同学习惯性的在生产代码中使用System.out来输出日志,这是不推荐的一种做法,因为System.out是一个同步操作,会在一定程度上影响系统性能,而Logger是一个异步操作。SpringBoot默认的日志系统是logback,当然我们并不需要去引用logback的依赖,因为在spring-boot-starter中已经应用了logback的依赖。一、控制台日志信息介绍1.1日志级别日志级别从高到低为:TRACE<DEBUG<INFO<WARN<ERROR<ALL<OFF。如果日志设置为ERROR,那么低于ERROR级别的日志将不会输出。如果我们想要设置某个包的日志级别,则在pom文件中加入下面这行配置:logging: level: #包名 com.javatrip:warn 复制如果想修改SpringBoot默认级别,则将包名改为root。logging: level: root:warn 复制1.2控制台日志介绍默

  • 【布局】493- 工作中遇到的特殊CSS布局

    日常开发中,设计师总会提出各种奇思妙想的需求,为我们的UI还原工作带来很多挑战。虽然有时确实会让我们花蛮多时间去实现,但从一方面想这也是个机会,让我们更深入了解的浏览器布局方式。本文主要记录之前工作中遇到的特殊布局,都是通过CSS方式去实现。多条件留白布局图中有两个内容块A和B,他们宽度取决于内容宽度,左右侧留白有max-width:200px限制,中间留白有min-width:150px限制。如果父级宽度缩小,中间留白一直保持着150px宽度,左右侧留白宽度跟随父级宽度缩小。如下图所示:从需求的描述来看,需要的是同时支持弹性(宽度随父级宽度而改变)和限制条件(max-width、min-width)的属性。一提起弹性,自然而然的就想到flex布局,只要加入占位的元素,可使用before或after伪类或手动插入元素,然后加上flex:1和限制条件即可。在线预览:codesandbox地址:https://codesandbox.io/s/thirsty-dijkstra-gp5up代码:<style> .container{ display:flex; } //左右侧留

  • 使用 Laravel 制定 MySQL 数据库备份计划任务

    你可以在终端里通过运行一行命令导出整个数据库。这种方案不仅简单直接而且有效。不过有更加自动化的解决方案。让我们来看看究竟是什么!背景几天前,我登录到错误的数据库中然后干掉了18000行线上数据记录。更糟糕的是,我们没有对这个数据库进行备份。然后,我决定编写一个能够自动完成数据库导出并保存到SQL文件的脚本。另外,如果你需要一款功能强大的数据备份系统,你可以看看这个扩展。这样我们就无需关注更多的数据库备份细节而仅需将焦点放到数据库导出和导出计划上。导出命令使用这个单行snippet,你可以快速的将数据库导出到SQL文件。很多应用使用下面这个命令从数据库导出数据。mysqldump-u[user]-p[pass][db]>[file_path]复制正如你所看到的那样,我们需要传入用户名、密码和需要导出的DB,然后将输出重定向到指定的文件。食用简单方便,功效显著。现在让我们将这个命令通过使用artisan命令进行封装,使其更易于运行和可加入计划任务。Artiasn控制台接口热身通过使用artisan控制台(console)集成shell命令的一个重要出发点是,能够一次编写到处运行。我们

  • “不可不学是编程,不可不用是git” | github篇

    撰文编辑:逻辑熊猫|图片:来自网络Baidu欢迎朋友圈各种姿势的分享如需转载,请后台联系授权相关文章《"不可不学是编程,不可不用是git“|git篇》本文你可以看到: 如何使用github创建一个仓库修改与合并仓库中的内容使用本地git推送内容到github如何参入别人的项目如何邀请别人参加自己的项目-奇幻的旅程,正式开始-▼-01-首先|你要有一个github账号从Get一个github的账号开始,这里按照提示,走一走流程就好了,相信聪明的你可以的。提示:由于不是所有人都有英语功底,也不是所有人都是用github来开发程序。所以这里的截图都使用中文界面。部分会使用英文界面。▼Github注册▼使用google浏览器可以翻译成中文哦-02-开始你的github之旅如果你想在github上搞事情,首先,你要建立一个仓库。在网页的右上角有一个加号,点击加号,新建一个仓库。▼Newrepository▼中文网页,是不是很酷?▼下一步▼在这里添加必要的信息说明一下这一页的内容。使用中文的话,内容就比较简单易懂。比如,你需要给你的仓库取一个简单易懂的名字。仓库的名字使用中文会出问题,所

  • 数据库最大连接数量

    在数据库操作过程中,经常会遇到一些非业务逻辑错误,这样的错误要求开发人员对于自己正在操作的硬件软件乃至网络都有一定的了解,这里说说关于数据库最大连接数量的那点事儿在某个项目操作过程中,数据库使用MySQL,在进行用户并发访问测试时,当并发量达到一定程度的时候就会出现程序连接数据库1040错误,1040错误的具体描述是:“CannotconnecttoMySQLserver.Toomanyconnections”,也就是过多的数据库连接数量,这个明显就不是业务本身的问题,而是数据库系统配置的问题了。解决这个问题从以下几个方面进行处理查看当前数据库最大连接数量和最大允许连接数量修改最大连接数量1.查看当前数据库mysql最大连接数量和最大允许连接数量查看最大连接数量SHOWVARIABLESLIKE'max_connections';复制mysql最大允许连接数量限制16384个2.设置mysql数据库最大连接数量设置最大连接数量有两种方式(命令行修改|配置文件修改)命令行修改最大连接数量setglobalmax_connections=1000复制优点:即时生效,运行

  • MartinFowler告诉你大数据架构师必备的NoSQL技能-版本戳(下)

    上一集:MartinFowler告诉你大数据架构师必备的NoSQL技能-版本戳(上) 上集我们说了在single-server以及在“主从复制模型”(master-slavereplication)下的生成版本戳的特技。今天我们主要说的是在“对等分布模型”(peer-to-peerdistributionmodel)的情况下如何生成版本戳!VersionStampsonMultipleNodes在多节点下如何生成版本戳?当你只有一个“数据的权威源”(authoritativesourcefordata)的时候,比如采用单服务器(singleserver)或者“主从复制模型”(master-slavereplication),这个时候,上一文中提到的那些基本的版本戳技术就可以搞定了,workswell!在那种情况下版本戳是被一个主节点(master)负责生成,任何其他的从节点(slaves)只需要使用主节点生成的版本戳就可以了。然而!这样的做法当遇到“对等分布模型”(peer-to-peerdistributionmodel)时,就不得不进行改进了,因为“对等分布模型”再也不会有一个地方

  • Git版本控制Windows版快速上手

      说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行。写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手。  说白了Git就是一个控制版本的工具,其实没想象中的那么复杂,咱在这就不扯那些太原理性的东西,不过Git是分布式管理方式这个要知道的,关于Git更详细的介绍在百度上一谷歌资料就很多了,在这不做赘述。因为平时习惯了在Windows下做东西,所以就已Windows为例。1.首先你得去Git官网https://github.com/上下一个git吧,如下图所示:     下完以后是在线安装的,装完如下所示:2.本地初始化     在GitShell下用cd命令切换到你要初始化的文件下,然后用 gitinit命令初始化就OK了,初始化后的文件里多出了.git的文件,如下图: 3.配置你的个人信息      因为git是版本控制工具,方便多人合作,所以当你提交时为了让别人知道是谁提交的所以得配置你的个人信息,若不配置也不能提交的,配置过程如下        gitconfig--globaluser.nameauthor#将用户名设为author      

  • TensorFlow实现时间序列预测

      常常会碰到各种各样时间序列预测问题,如商场人流量的预测、商品价格的预测、股价的预测,等等。TensorFlow新引入了一个TensorFlowTimeSeries库(以下简称为TFTS),它可以帮助在TensorFlow中快速搭建高性能的时间序列预测系统,并提供包括AR、LSTM在内的多个模型。 时间序列问题   一般而言,时间序列数据抽象为两部分:观察的时间点和观察的值(以商品价格为例,某年一月的价格为120元,二月的价格为130元,三月的价格为135元,四月的价格为132元。那么观察的时间点可以看作是1,2,3,4,而在各时间点上观察到的数据的值为120,130,135,132)。观察的时间点可以不连续,比如二月的数据有缺失,那么实际的观察时间点为1,3,4,对应的数据为120,135,132。所谓时间序列预测,是指预测某些未来的时间点上(如5,6)数据的值应该是多少。   TFTS库按照时间点+观察值的方式对时间序列问题进行抽象包装。观察的时间点用“times”表示,对应的值用“values”表示。在训练模型时,输入数据需要同时具有times和values两个字段;在预测时,

  • 面向对象程序设计

    object 对象和类  封装、继承、多态 对象:  属性(静态)、方法(动态) 类:  一组相似事物的统称 封装:只保留有效的接口与外部进行联系,只需要知道怎么调用不需要知道怎么实现 继承:子类可以继承父类的属性和方法,并且可以重写或添加新的属性和方法,通过继承可以实现代码的重复利用 多态:同一事物的多种形态   类的定义和使用 classClassName:        #类名首字母大写       '''   类的帮助信息'''   stetement        #类体 主要是方法和属性构成  属性和方法可以用pass语句来代替   创建类的实例 类名(可选参数)   创建__init__()方法 &

  • tf.layers.Conv1D,1维卷积层

    @tf_export(v1=['layers.Conv1D']) classConv1D(keras_layers.Conv1D,base.Layer): """1Dconvolutionlayer(e.g.temporalconvolution). Thislayercreatesaconvolutionkernelthatisconvolved (actuallycross-correlated)withthelayerinputtoproduceatensorof outputs.If`use_bias`isTrue(anda`bias_initializer`isprovided), abiasvectoriscreatedandaddedtotheoutputs.Finally,if `activation`isnot`None`,itisappliedtotheoutputsaswell. 这个Layer创建一个卷积核对input进行卷积并产生一个outputstensor。如果use_biasisTrue并且提供了bias_initializer,一个bias向量会被添

  • 程序的本质复杂性和元语言抽象

    组件复用技术的局限性 常听到有人讲“我写代码很讲究,一直严格遵循DRY原则,把重复使用的功能都封装成可复用的组件,使得代码简短优雅,同时也易于理解和维护”。显然,DRY原则和组件复用技术是最常见的改善代码质量的方法,不过,在我看来,以这类方法为指导,能帮助我们写出“不错的程序”,但还不足以帮助我们写出简短、优雅、易理解、易维护的“好程序”。对于熟悉MartinFowler《重构》和GoF《设计模式》的程序员,我常常提出这样一个问题帮助他们进一步加深对程序的理解: 如果目标是代码“简短、优雅、易理解、易维护”,组件复用技术是最好的方法吗?这种方法有没有根本性的局限? 虽然基于函数、类等形式的组件复用技术从一定程度上消除了冗余,提升了代码的抽象层次,但是这种技术却有着本质的局限性,其根源在于每种组件形式都代表了特定的抽象维度,组件复用只能在其维度上进行抽象层次的提升。比如,我们可以把常用的HashMap等功能封装为类库,但是不管怎么封装复用类永远是类,封装虽然提升了代码的抽象层次,但是它永远不会变成Lambda,而实际问题所代表的抽象维度往往与之并不匹配。 以常见的二进制消息的解析为例,组

  • Storm同步调用之DRPC模型探讨

      摘要:Storm的编程模型是一个有向无环图,决定了storm的spout接收到外部系统的请求后,spout并不能得到bolt的处理结果并将结果返回给外部请求。所以也就决定了storm无法提供对外部系统的同步调用功能。     最近新的黑名单项目需要在storm实时计算平台上提供对外部系统请求调用的同步响应(也就是让storm支持同步调用而不是回调),而Storm的编程模型是一个有向无环图,也就决定了storm的spout接收到外部系统的请求后,将请求数据分发给下游的bolt进行处理后,spout并不能得到bolt的处理结果并将结果返回给外部请求。   在传统也就是业界大部分应用场景storm对外部系统的调用都是采用回调的方式。本人之前参与的某4000万用户,日均1000万交易量的信用卡中心也是采用回调的方式。   原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/7602242.html            &nbs

  • cocos命令行生成项目

    cocos命令行生成项目: cocosnewGoodDay(项目名称)-pcom.boleban.www(包名字)-lcpp(项目类型)-dD:\DevProject\cocos2dx_workspace(项目存放路径)复制   把生成的dll和exe文件拷到Resources文件夹中,设置方法: 在自己的项目上,右键菜单->属性->配置属性->生成事件->后期生成事件,在命令行里添加下面的批处理语句。 xcopy/Y/Q$(SolutionDir)$(Configuration).win32\*.dll$(SolutionDir)..\Resources\ xcopy/Y/Q$(SolutionDir)$(Configuration).win32\*.exe$(SolutionDir)..\Resources\复制  

  • Flowable快速入门

    flowable官方文档    官网:https://tkjohn.github.io/flowable-userguide/#_getting_started  工作流(Workflow),是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。 简介   Flowable工作流是active5.x的分支,表结构和框架设计有部分类似的。Flowable集成于springboot,相比Activity使用更方便。  Flowable的后台是有数据库的支持,所有的表都以ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。  ACT_RE_*:'RE'表示repository。这个前缀的表包含了流程定义和流程静态资源(图片,规则,配置等)。  ACT_RU_*:'RU'表示runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Flowable只在流程实例执行

  • 11、pytest -- 测试的参数化

    往期索引:https://www.cnblogs.com/luizyao/p/11771740.html 在实际工作中,测试用例可能需要支持多种场景,我们可以把和场景强相关的部分抽象成参数,通过对参数的赋值来驱动用例的执行; 参数化的行为表现在不同的层级上: fixture的参数化:参考4、fixtures:明确的、模块化的和可扩展的--fixture的参数化; 测试用例的参数化:使用@pytest.mark.parametrize可以在测试用例、测试类甚至测试模块中标记多个参数或fixture的组合; 另外,我们也可以通过pytest_generate_tests这个钩子方法自定义参数化的方案; 1.@pytest.mark.parametrize标记 @pytest.mark.parametrize的根本作用是在收集测试用例的过程中,通过对指定参数的赋值来新增被标记对象的调用(执行); 首先,我们来看一下它在源码中的定义: #_pytest/python.py defparametrize(self,argnames,argvalues,indirect=Fals

  • SpringCloud Gateway拦截器遇到的小坑汇总

    很多朋友在使用SpringCloudGateway的时候可能都碰到过以下几个问题 SpringCloudGateway中如何读取Post请求体 privateBodyInsertergetBodyInserter(ServerWebExchangeexchange){ ServerRequestserverRequest=newDefaultServerRequest(exchange); Mono<String>modifiedBody=serverRequest.bodyToMono(String.class) .flatMap(body->{ //这里的body就是Post的请求体 }); BodyInserterbodyInserter=BodyInserters.fromPublisher(modifiedBody,String.class); returnbodyInserter; } 复制 SpringCloudGateway中Post请求参数只能读取一次 这是因为Gateway默认使用的是SpringWebflux,解决这个问题需要容重新构造一个req

  • 勇敢、信念

    (炫耀只是为了获得别人的恭维,渴望他人的认同,以填满内心的空虚与不足。永远要警惕我们内心深处的幽暗与人性的弱点) 1、如何变的勇敢? 首先明确一点,勇敢和勇气是不同的。 勇气是一时的,也就是说勇气是带有一定时间段的,是不可持续的。比如,你冲动的时候,突然做的一件事。比如跳楼,平时你是完全不敢跳的。当在紧急或者情绪失控的状况下,突然跳楼了。只在这个时刻有这个勇气。 勇敢是持续的,是敢于活出自我,敢于追求内心想法的一种态度。不怕困难、不怕失败,依然坚信自己的人生信条。勇敢的来源是:你是否相信自己配得上你想要的东西!! 做了失败了,都比不敢去做要好,而不敢去做,更让人后悔。不去做的后悔是最后悔,做了失败,相对来说也是一种成功,至少,你获得了经验,下次可以争取改进。 所谓相信程度就是自己是相信,还是毫无理由的坚信,还是信仰。 相信什么,相信自己是否能得到,这是潜意识的相信。 恐惧一般来源于本能恐惧,来源于童年阴影,或者挫败经历等。 2、信念 信念是一种力量。有信念和没有信念的人一定是不同的。比如有的人相信神灵,被神灵附体之后,能做很多事,像在火上走,完全不害怕。他有这个信念,啥都不怕。有的人相

相关推荐

推荐阅读