Spring概念

1.1.1 spring 是什么

  1. Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoCInverse Of Control:反转控制)和 AOPAspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。

Spring 的发展历程

  1. 1997 IBM 提出了 EJB 的思想
  2. 1998 年,SUN 制定开发标准规范 EJB1.0
  3. 1999 年,EJB1.1 发布
  4. 2001 年,EJB2.0 发布
  5. 2003 年,EJB2.1 发布
  6. 2006 年,EJB3.0 发布
  7. Rod Johnsonspring 之父)
  8. Expert One-to-One J2EE Design and Development(2002)
  9. 阐述了 J2EE 使用 EJB 开发设计的优点及解决方案
  10. Expert One-to-One J2EE Development without EJB(2004)
  11. 阐述了 J2EE 开发不使用 EJB 的解决方式(Spring 雏形)
  12. 2017 9 月份发布了 spring 的最新版本 spring 5.0 通用版(GA

spring 的优势

方便解耦,简化开发

通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造

成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可

以更专注于上层的应用。

AOP 编程的支持

通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。

声明式事务的支持

可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,

提高开发效率和质量。

方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可

做的事情。

方便集成各种优秀框架

Spring 可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz

等)的直接支持。

降低 JavaEE API 的使用难度

Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的

使用难度大为降低。

Java 源码是经典学习范例

Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以

及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。

spring 的体系结构

IoC 的概念和作用

程序的耦合和解耦

什么是程序的耦合

  1. 耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调
  2. 用模块的方式以及通过界面传送数据的多少。<b>模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关
  3. 系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立
  4. 性)</b>。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。
  5. 在软件工程中,耦合指的就是对象之间的依赖性。<b>对象之间的耦合越高,维护成本越高。</b>因此对象的设计
  6. 应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个
  7. 准则就是高内聚低耦合。
  8. 它有如下分类:
  9. 1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另
  10. 一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
  11. 2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大
  12. 量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
  13. 3 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传
  14. 递该全局变量的信息,则称之为外部耦合。
  15. 4 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进
  16. 行适当的动作,这种耦合被称为控制耦合。
  17. 5)标记耦合 。若一个模块 A 通过接口向两个模块 B C 传递一个公共参数,那么称模块 B C 之间
  18. 存在一个标记耦合。
  19. 6 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形
  20. 式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另
  21. 一些模块的输入数据。
  22. 7 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实
  23. 现的。
  24. 总结:
  25. 耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须
  26. 存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
  27. 内聚与耦合
  28. 内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从
  29. 功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件
  30. 结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通
  31. 过接口的数据。 程序讲究的是低耦合,高内聚。<b>就是同一个模块内的各个元素之间要高度紧密,但是各个模块之
  32. 间的相互依存度却要不那么紧密。</b>
  33. 内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他
  34. 模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
  1. 我们在开发中,有些依赖关系是必须的,有些依赖关系可以通过优化代码来解除的。
  2. 请看下面的示例代码:
  3. /**
  4. * 账户的业务层实现类
  5. *
  6. */
  7. public class AccountServiceImpl implements IAccountService {
  8. private IAccountDao accountDao = new AccountDaoImpl();
  9. }
  10. 上面的代码表示:
  11. 业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译
  12. 将不能通过。这种编译期依赖关系,应该在我们开发中杜绝。我们需要优化代码解决。
  1. 再比如:
  2. 早期我们的 JDBC 操作,注册驱动时,我们为什么不使用 DriverManager register 方法,而是采
  3. Class.forName 的方式?
  4. public class JdbcDemo1 {
  5. /**
  6. * @author 黑马程序员
  7. * @Company http://www.ithiema.com
  8. * @Version 1.0
  9. * @param args
  10. * @throws Exception
  11. */
  12. public static void main(String[] args) throws Exception {
  13. //1.注册驱动
  14. //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  15. Class.forName("com.mysql.jdbc.Driver");
  16. //2.获取连接
  17. //3.获取预处理 sql 语句对象
  18. //4.获取结果集
  19. //5.遍历结果集
  20. } }
  21. 原因就是:
  22. 我们的类依赖了数据库的具体驱动类(MySQL),如果这时候更换了数据库品牌(比如 Oracle),需要
  23. 修改源码来重新数据库驱动。这显然不是我们想要的。

解决程序耦合的思路

  1. 当是我们讲解 jdbc 时,是通过反射来注册驱动的,代码如下:
  2. Class.forName("com.mysql.jdbc.Driver");//此处只是一个字符串
  3. 此时的好处是,我们的类中不再依赖具体的驱动类,此时就算删除 mysql 的驱动 jar 包,依然可以编译(运
  4. 行就不要想了,没有驱动不可能运行成功的)。
  5. 同时,也产生了一个新的问题,mysql 驱动的全限定类名字符串是在 java 类中写死的,一旦要改还是要修改
  6. 源码。
  7. 解决这个问题也很简单,使用配置文件配置。

工厂模式解耦

  1. 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的

方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。

那么,这个读取配置文件,创建和获取三层对象的类就是工厂。

控制反转-Inversion Of Control

  1. 上一小节解耦的思路有 2 个问题:
  2. 1、存哪去?
  3. 分析:由于我们是很多对象,肯定要找个集合来存。这时候有 Map List 供选择。
  4. 到底选 Map 还是 List 就看我们有没有查找需求。有查找需求,选 Map
  5. 所以我们的答案就是
  6. 在应用加载时,创建一个 Map,用于存放三层对象。
  7. 我们把这个 map 称之为容器。 2、还是没解释什么是工厂?
  8. 工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
  9. 原来:
  10. 我们在获取对象时,都是采用 new 的方式。是主动的。

  1. 现在:
  2. 我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。

  1. 这种被动接收的方式获取对象的思想就是控制反转,它是 spring 框架的核心之一。

  1. 明确 ioc 的作用:
  2. 削减计算机程序的耦合(解除我们代码中的依赖关系)。

使用 spring 的 IOC 解决程序耦合

基于 XML 的配置(入门案例)

首先编制bean.xml配置文件

  1. ![](https://img2020.cnblogs.com/blog/2092133/202007/2092133-20200719194205682-1877864804.png)
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7. </beans>

让 spring 管理资源,在配置文件中配置 service 和 dao

  1. <!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
  2. id 属性:对象的唯一标识。
  3. class 属性:指定要创建对象的全限定类名
  4. -->
  5. <!-- 配置 service -->
  6. <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
  7. </bean>
  8. <!-- 配置 dao --> <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>

测试配置是否成功

  1. /**
  2. * 模拟一个表现层
  3. * @author 黑马程序员
  4. * @Company http://www.ithiema.com
  5. * @Version 1.0
  6. */
  7. public class Client {
  8. /**
  9. * 使用 main 方法获取容器测试执行
  10. */
  11. public static void main(String[] args) {
  12. //1.使用 ApplicationContext 接口,就是在获取 spring 容器
  13. ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
  14. //2.根据 bean 的 id 获取对象
  15. IAccountService aService = (IAccountService) ac.getBean("accountService");
  16. System.out.println(aService);
  17. IAccountDao aDao = (IAccountDao) ac.getBean("accountDao");
  18. System.out.println(aDao);
  19. } }
  20. 运行结果:

Spring 基于 XML 的 IOC 细节

** BeanFactory 和 ApplicationContext 的区别**

  1. BeanFactory 才是 Spring 容器中的顶层接口。
  2. ApplicationContext 是它的子接口。
  3. BeanFactory ApplicationContext 的区别:
  4. 创建对象的时间点不一样。
  5. ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
  6. BeanFactory:什么使用什么时候创建对象。

ApplicationContext 接口的实现类

  1. ClassPathXmlApplicationContext
  2. 它是从类的根路径下加载配置文件 推荐使用这种
  3. FileSystemXmlApplicationContext
  4. 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
  5. AnnotationConfigApplicationContext:
  6. 当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

IOC 中 bean 标签和管理对象细节

bean 标签

  1. 作用:
  2. 用于配置对象让 spring 来创建的。
  3. 默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
  4. 属性:
  5. id:给对象在容器中提供一个唯一标识。用于获取对象。
  6. class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
  7. scope:指定对象的作用范围。
  8. * singleton :默认值,单例的.
  9. * prototype :多例的.
  10. * request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
  11. * session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
  12. * global session :WEB 项目中,应用在 Portlet 环境.如果没有 集成环境那么
  13. globalSession 相当于 session.
  14. init-method:指定类中的初始化方法名称。
  15. destroy-method:指定类中销毁方法名称。

bean 的作用范围和生命周期

  1. 单例对象:scope="singleton"
  2. 一个应用只有一个对象的实例。它的作用范围就是整个引用。
  3. 生命周期:
  4. 对象出生:当应用加载,创建容器时,对象就被创建了。
  5. 对象活着:只要容器在,对象一直活着。
  6. 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
  7. 多例对象:scope="prototype"
  8. 每次访问对象时,都会重新创建对象实例。
  9. 生命周期:
  10. 对象出生:当使用对象时,创建新的对象实例。
  11. 对象活着:只要对象在使用中,就一直活着。
  12. 对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。

实例化 Bean 的三种方式

  1. 第一种方式:使用默认无参构造函数
  2. <!--在默认情况下:
  3. 它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。
  4. --> <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>
  5. 第二种方式:spring 管理静态工厂-使用静态工厂的方法创建对象
  6. /**
  7. * 模拟一个静态工厂,创建业务层实现类
  8. */
  9. public class StaticFactory {
  10. public static IAccountService createAccountService(){
  11. return new AccountServiceImpl();
  12. }
  13. }
  14. <!-- 此种方式是:使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
  15. id 属性:指定 bean id,用于从容器中获取
  16. class 属性:指定静态工厂的全限定类名
  17. factory-method 属性:指定生产对象的静态方法
  18. --> <bean id="accountService"class="com.itheima.factory.StaticFactory" factory-method="createAccountService"></bean>
  1. 第三种方式:spring 管理实例工厂-使用实例工厂的方法创建对象
  2. /**
  3. * 模拟一个实例工厂,创建业务层实现类
  4. * 此工厂创建对象,必须现有工厂实例对象,再调用方法
  5. */
  6. public class InstanceFactory {
  7. public IAccountService createAccountService(){
  8. return new AccountServiceImpl();
  9. } }
  10. <!-- 此种方式是:
  11. 先把工厂的创建交给 spring 来管理。
  12. 然后在使用工厂的 bean 来调用里面的方法
  13. factory-bean 属性:用于指定实例工厂 bean id
  14. factory-method 属性:用于指定实例工厂中创建对象的方法。
  15. --> <bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean> <bean id="accountService"
  16. factory-bean="instancFactory"
  17. factory-method="createAccountService"></bean>

spring 的依赖注入

依赖注入的概念

  1. 依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。
  2. 我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。
  3. ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。
  4. 那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。
  5. 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

构造函数注入

  1. <!-- 使用构造函数的方式,给 service 中的属性传值
  2. 要求:
  3. 类中需要提供一个对应参数列表的构造函数。
  4. 涉及的标签:
  5. constructor-arg
  6. 属性:
  7. index:指定参数在构造函数参数列表的索引位置
  8. type:指定参数在构造函数中的数据类型
  9. name:指定参数在构造函数中的名称 用这个找给谁赋值
  10. =======上面三个都是找给谁赋值,下面两个指的是赋什么值的==============
  11. value:它能赋的值是基本数据类型和 String 类型
  12. ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean
  13. -->
  14. <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
  15. <constructor-arg name="name" value="张三"></constructor-arg>
  16. <constructor-arg name="age" value="18"></constructor-arg>
  17. <constructor-arg name="birthday" ref="now"></constructor-arg>
  18. </bean> <bean id="now" class="java.util.Date"></bean>

set 方法注入

  1. <!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式
  2. 涉及的标签:
  3. property
  4. 属性:
  5. name:找的是类中 set 方法后面的部分
  6. ref:给属性赋值是其他 bean 类型的
  7. value:给属性赋值是基本数据类型和 string 类型的
  8. 实际开发中,此种方式用的较多。
  9. --> <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
  10. <property name="name" value="test"></property>
  11. <property name="age" value="21"></property>
  12. <property name="birthday" ref="now"></property>
  13. </bean> <bean id="now" class="java.util.Date"></bean>

使用 p 名称空间注入数据(本质还是调用 set 方法)

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:p="http://www.springframework.org/schema/p"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation=" http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="accountService"
  7. class="com.itheima.service.impl.AccountServiceImpl4"
  8. p:name="test" p:age="21" p:birthday-ref="now"/>
  9. </beans>

5 注入集合属性

  1. <!-- 注入集合数据
  2. List 结构的:
  3. array,list,set
  4. Map 结构的
  5. map,entry,props,prop
  6. -->
  7. <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
  8. <!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
  9. <!-- 给数组注入数据 --> <property name="myStrs"> <set><value>AAA</value> <value>BBB</value> <value>CCC</value>
  10. </set>
  11. </property>
  12. <!-- 注入 list 集合数据 --> <property name="myList"> <array> <value>AAA</value> <value>BBB</value> <value>CCC</value>
  13. </array>
  14. </property>
  15. <!-- 注入 set 集合数据 --> <property name="mySet"> <list><value>AAA</value> <value>BBB</value> <value>CCC</value>
  16. </list>
  17. </property>
  18. <!-- 注入 Map 数据 --> <property name="myMap"> <props> <prop key="testA">aaa</prop> <prop key="testB">bbb</prop>
  19. </props>
  20. </property>
  21. <!-- 注入 properties 数据 -->
  22. <property name="myProps"> <map><entry key="testA" value="aaa"></entry> <entry key="testB"> <value>bbb</value>
  23. </entry>
  24. </map>
  25. </property>
  26. </bean>

spring的IOC(反转控制)的更多相关文章

  1. Spring IoC反转控制的快速入门

    * 下载Spring最新开发包 * 复制Spring开发jar包到工程 * 理解IoC反转控制和DI依赖注入 * 编写Spring核心配置文件 * 在程序中读取Spring配置文件,通过Spring框 ...

  2. spring ioc(反转控制)

    在Java中,我们建立一个对象的方式是new,有时需要单例,有时需要工厂,而spring中的bean的定义可以直接使用,如scope属性single产生单例对象,prototype产生新对象,bean ...

  3. Spring之IOC(控制反转)与AOP(面向切面编程)

    控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.可以认为IoC与JND ...

  4. 08 Spring框架的概念、优势、体系结构、耦合性和IOC(反转控制)

    1.spring介绍 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect ...

  5. Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式

    ### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...

  6. Spring && 实验IOC

    一.Spring作用 1.生态体系庞大,全能型选手![springmvc是其一个子模块,jdbcTemplate能直接操作数据库!]    2.将其他组件粘合在一起    3.IOC容器和AOP[As ...

  7. Spring之IoC详解(非原创)

    文章大纲 一.Spring介绍二.Spring的IoC实战三.IoC常见注解总结四.项目源码及参考资料下载五.参考文章 一.Spring介绍 1. 什么是Spring   Spring是分层的Java ...

  8. spring框架IoC

    IoC反转控制, 举个反例: //数据操作类 public class DataBase { //向数据库中存储数据 public void saveDB() { } } //业务逻辑类 public ...

  9. Spring 反转控制(IOC) 依赖注入(DI)

    简单的理解: 之前是我为了完成业务A 需要某个对象B的支持 那么我在这个业务A中就会创建一个对象B使用,说白了就是我根据需求来控制对象B, 而spring的ioc把对象B的控制权从业务A手中拿到自己手 ...

  10. 3. Spring 核心之 IOC(控制反转) & DI(依赖注入)

    注:此文摘自 http://blog.csdn.net/it_man/article/details/4402245 IOC(DI):其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述 ...

随机推荐

  1. 浅谈.Net Core DependencyInjection源码探究

    前言     相信使用过Asp.Net Core开发框架的人对自带的DI框架已经相当熟悉了,很多刚开始接触.Net Core的时候觉得不适应,主要就是因为Core默认集成它的原因.它是Asp.Net ...

  2. python进阶之内置方法

    python进阶之内置方法 字符串类型的内置方法 常用操作与方法: 按索引取值 str[index] 切片 ste[start:stop:step] 长度 len(str) 成员运算in和not in ...

  3. requests接口自动化3-url里带参数的get请求:params

    url里带参数的get请求:用params传参 #2.带参数的get请求,把参数写成字典格式,用params传参 para2={"type":"math"} r ...

  4. java 面向对象(三十五):泛型在继承上的体现

    泛型在继承上的体现: /* 1. 泛型在继承方面的体现 虽然类A是类B的父类,但是G<A> 和G<B>二者不具备子父类关系,二者是并列关系. 补充:类A是类B的父类,A< ...

  5. 数据可视化之powerBI基础(二)PowerBI动态图表技巧:钻取交互

    https://zhuanlan.zhihu.com/p/64406366 查看可视化图表的时候,我们可能想深入了解某个视觉对象的更详细信息,或者进行更细粒度的分析,比如看到2017年的总体数据,同时 ...

  6. 机器学习实战基础(九):sklearn中的数据预处理和特征工程(二) 数据预处理 Preprocessing & Impute 之 数据无量纲化

    1 数据无量纲化 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”.譬如梯度和矩阵为核心的算法中,譬如逻辑回 ...

  7. 软件测试大牛都是这样写测试用例的,你get到了嘛?

    1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...

  8. springboot整合swagger。完爆前后端调试

    web接口开发时在调试阶段最麻烦的就是参数调试,前端需要咨询后端.后端有时候自己也不是很了解.这时候就会造成调试一次接口就需要看一次代码.Swagger帮我们解决对接的麻烦 springboot接入s ...

  9. 在VS2017中创建C++的代码块模板

    在VS2017中创建C++的代码块模板 有任何问题,请留言!!! 在VS2017中有工具–>代码片段管理器,方便我们使用固有的代码块模板,同时我们也可以自定义模板. 在VS2017中代码片段的模 ...

  10. 题解 CF785E 【Anton and Permutation】

    考虑用分块解决这个题,一次交换对当前逆序对个数的影响是,加上两倍的在区间\([l+1,r-1]\)中比\(a_r\)小的元素个数,减去两倍的在区间\([l+1,r-1]\)中比\(a_l\)小的元素个 ...