第1章 SpringBoot开发入门
学习目标
-
了解SpringBoot的优点
-
掌握SpringBoot项目的构建
-
掌握SpringBoot的单元测试和热部署
-
熟悉SpringBoot的自动化配置原理
-
熟悉SpringBoot的执行流程
随着互联网的兴起,Spring势如破竹地占据了Java领域轻量级开发的王者之位。随着Java语言的发展以及市场开发的需求,Spring推出了新的SpringBoot框架。SpringBoot是Spring家族的一个子项目,其设计初衷是为了简化Spring配置,从而让用户可以轻松构建独立运行的程序,并极大提高开发效率。接下来,本章从SpringBoot开发入门知识入手,带领大家正式进入SpringBoot框架的学习,并对SpringBoot的相关原理进行深入分析。
1.1 SpringBoot概述
1.1.1 SpringBoot简介
在SpringBoot框架出现之前,JavaEE开发最常用的框架是SPringle,该框架开始于2003年,它是由Rod Johnson创建的一个轻量级开源框架。Spring框架是为了解决企业应用开发的复杂性而创建的,它的出现使得开发者无需开发重量级的EJB,而是用过控制反转(IOC)和面向切面编程(AOP)的思想进行更轻松的企业应用开发,取代了EJB臃肿,低效的开发模式。
虽然Spring框架是轻量级的,但它的配置确实重量级的。Spring的早期本本专注于xml配置,开发一个程序需要配置各种xml配置文件。为了简化开发,在Spring2.x本本开始引入少量的注解,如@Component,@Service等。由于支持的注解不是很多且功能尚不完善,所以只能辅助使用。
随着实际生产中敏捷开发的需要,以及Spring注解的大量出现和功能改进,到了Spring4.x本本基本可以脱离xml配置文件进行项目开发,多数开发者也逐渐感受到了基于注解开发的便利,因此,在Spring中使用注解开发逐渐占据了主流地位。与此同时,Pivotal团队在原有Spring框架的基础尚通过注解的方式进一步简化了Spring框架的使用,并基于Spring框架开发了全新的SpringBoot框架,于2014年4月正式推出了SpringBoot1.x版本,同时在2018年3月又推出了SPringBoot2.0版本。SpringBoot2.x版本在SpringBoot1.x版本的基础尚进行了诸多功能的改进和扩展,同时进行了大量的代码重构,所以读者在学习开发过程中,选择合适的版本也是非常重要的。我们推荐使用优化后的SpringBoot2.x版本。
SpringBoot框架本身并不是提供Spring框架的核心特性以及扩展性能,知识用于快速,敏捷的开发新一代基于Spring框架的应用,并且在开发过程中大量使用“约定有限配置”的思想来拜托Spring框架中各种复杂的手动配置,同时衍生出了Java Config(取代传统xml配置文件的Java配置类)这种有限的配置方式。也就是说,SpringBoot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,同时SpringBoot还集成了大量常用的第三方库配置(例如Jackson,JDBC,Redis,Mail等)。使用SpringBoot开发程序时,几乎是开箱即用,大部分SpringBoot应用只需少量配置就能完成相应的功能,这一特性进一步促使开发者专注于业务逻辑的实现。
另外,随着近几年微服务开发需求的迅速增加,怎样快速,简便的构建一个准生产环境的Spring应用也是摆在开发者面前的一个难题,而SpringBoot框架的出现恰好完美的解决了这些问题,同时其内部还简化了许多常用的第三方库配置,使得微服务开发更加便利,这也间接体现了SpringBoot框架的优势和学习SpringBoot的必要性。
1.1.2 SpringBoot的优点
相较于传统的Spring框架,SpringBoot框架具有以下优点。
-
可快速构建独立的Spring应用
SpringBoot是一个依靠大量注解实现自动化配置的全新框架。在构建Spring应用时,我们只需要添加相应的场景依赖,SpringBoot就会根据添加的场景依赖自动进行配置,在无须额外手动天机啊配置的情况下快速构建出一个独立的Spring应用。
-
直接嵌入tomcat,jetty和undertow服务器(无需配置war文件)
传统的Spring应用部署时,通常会将应用打成war包形式并部署到tomcat,jetty或者undertow服务器中。SpringBoot框架内嵌了tomcat,jetty和undertow服务区,而且可以自动将项目打包,并在项目运行时部署到服务器中。
-
通过依赖启动器简化构建配置
在SpringBoot项目构建过程中,无须准备各种独立的jar文件,只需要构建项目时根据开发场景需求选择对用的依赖启动器“starter”,在引入的依赖启动器“starter”内部已经包含了对应卡法场景所需的依赖,并会自动下载和拉取相关jar包。例如,在web开发时,只需在构建项目时选择对应的web场景依赖启动器spring-boot-starter-web,SpringBoot项目便会自动导入spring-webmvc,spring-web,spring-boot-starter-tomcat等子依赖,并自动下载和获取web开发需要的相关jar包。
-
自动化配置Spring和第三方库
SpringBoot充分考虑到与传统Spring框架以及其他第三方库融合的场景,在提供了各种场景依赖启动器的基础上,内部还默认提供了各种自动化配置类,使用SpringBoot开发项目时,一旦引入了某个场景 的依赖启动器,SpringBoot内部提供的默认自动化配置类就会生效,开发者无须手动在配置文件中进行相关配置(除非开发者需要更改默认配置),从而极大减少了开发人员的工作量,提高了程序的开发效率。
-
提供生产就绪功能
SpringBoot提供了一些用于生产环境运行时的特性,例如指标,监控检查和外部化配置。其中,指标和监控检查可以帮助运维人员在运行期间监控项目运行情况;外部化配置可以使运维人员快速,方便的进行外部化配置和部署工作。
-
极少的代码生成和xml配置
SpringBoot框架内部已经实现了与Spring以及其他常用第三方库的整合连接,并提供了默认最优化的整合配置,使用时基本尚不需要额外生成配置代码和xml配置文件。在需要自定义配置的情况下,SpringBoot更加提倡使用JavaConfig替换传统的xml配置方式,这样更加方便查看和管理。
虽然说SpringBoot有诸多的优点,但SpringBoot也有一些缺点。例如,SpringBoot入门较为简单,但是深入理解和学习却有一定难度,这是因为SpringBoot时在Spring框架的基础上推出的,所以读者想要弄明白SpringBoot的底层运行机制,有必要对Spring框架有一定的了解。
1.2 SpringBoot入门程序
通过上一节的学习,相信读者已经对SpringBoot有了初步认识,为了帮助读者快速的了解SpringBoot的基本用法,下面我们快速开发一个基于SpringBoot框架的入门程序。
1.2.1 环境准备
为了方便入门程序的编写,以及为后续章节提供对SpringBoot项目演示的支持,在开发入门程序之前,有必要对项目运行所需环境进行介绍,并提前准备完成。
-
JDK环境
本书讲解使用SpringBoot2.1.3版本。根据SpringBoot官方文档说明,SpringBoot版本要求JDK版本必须时JDK8以上
-
项目构建工具
在进行SpringBoot项目构建和案例演示时,为了方便管理,我们选择官方支持并且开发最常用的项目构建工具进行项目管理。SpringBoot2.1.3版本官方文档声明的第三方项目构建工具包括Maven(3.3+)和Gradle(4.4+),我们采用Maven3.6.1版本进行项目构建管理。
-
开发工具
在SpringBoot项目开发之前,有必要选择一款优秀的开发工具。目前Java项目支持的常用开发工具包括SpringToolSuite(STS),Eclipse和IntelliJ IDEA等。其中IntelliJ IDEA时近几年比较流行的,且业界评价最高的一款Java开发工具,尤其在只能代码助手,重构,各类版本工具(Git,SVN等)支持等方面的功能非常不错,因此我们选择使用IDEA开发SpringBoot应用。
1.2.2 使用Maven方式构建SpringBoot项目
在创建项目之前,我们需要先配置和搭建Maven工程的环境,这一部分内容请看其他篇幅,这里不再赘述。
准备号项目运行所需的环境后,就可以使用idea开发工具搭建一个SpringBoot入门程序了。我们既可以使用Maven方式构建项目,也可以使用Spring Initializr快捷方式构建项目。这里先介绍如果使用Maven方式构建SpringBoot项目,具体步骤如下:
-
初始化idea配置
进入idea开发软件的【file】-》【Setting】设置界面,在左侧搜索【maven】关键字找到Maven设置选项,在右侧对应的设置界面中进行Maven初始化设置
点击【file】-》【Project Structure】打开设置界面
2.创建Maven项目
点击【file】-》【new】-》【project】
点击【next】下一步
点击【next】下一步
点击【finish】创建好项目
3.添加SpringBoot依赖
打开当前项目下的pom.xml文件,在该文件中添加构建SpringBoot项目和Web场景开发对应的依赖
<!--引入SpringBoot依赖--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><dependencies><!--引入web场景依赖启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>RELEASE</version></dependency></dependencies>
上述代码中,<parent>标签中添加的spring-boot-starter-parent依赖时SpringBoot框架集成项目的同意父类管理依赖,添加该依赖后就可以使用SpringBoot的相关特性;<version>标签指定SpringBoot的版本号是2.1.3.RELEASE;<dependencies>标签中添加的spring-boot-starter-web依赖是SpringBoot框架对Web开发场景集成支持的依赖启动器,添加该依赖后就可以自动导入SpringMVC框架相关依赖进行Web开发了。
如果添加依赖后,项目没有自动导入下载更新,则可以使用以下方式
4.编写主程序启动类
在当前项目的java目录下创建包名,在该包下创建主程序启动类
package com.yhh;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//标记该类为主程序启动类
@SpringBootApplication
public class MyClass1 {public static void main(String[] args) {SpringApplication.run(MyClass1.class,args);}
}
@SpringBootApplication注解是SpringBoot框架的核心注解,该注解用于表明当前类是SpringBoot项目的主程序启动类,SpringApplication.run(MyClass1.class,args);该方法是表示启动主程序类。
5.创建一个用于Web访问的Controller
在以上包下创建controller包,在该包下创建一个请求控制器类,并编写一个请求处理方法
package com.yhh.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;//控制器
@RestController
public class MyController {@GetMapping("/hello")public String hello(){return "hello Spring Boot";}
}
@RestController注解是一个组合注解,等同于@Controller和@ResponseBody两个注解结合使用的效果。主要作用是将当前类作为控制层的组件添加到Spring容器中,同时该类的方法无法返回JSP页面,而且会返回JSON字符串。
@GetMapping("/hello")注解等同于@RequestMapping(method=RequestMethod.GET)注解,主要作用是设置方法的访问路径并限定其访问方式为Get请求。hello()方法的请求处理路径为“/hello”,并且方法的返回值是一个字符串对象。
6.运行项目
选择主程序进行运行
项目启动成功后,在控制台上会发现SpringBoot项目默认启动端口号为8080,此时,可以在浏览器上访问“http://localhost:8080/hello”,即在浏览器上可看到控制器hello()方法返回的数据显示出来。至此,一个简单的SpringBoot项目就完成了。
1.2.3 使用Spring Initializr方式创建SpringBoot项目
除了可以使用Maven方式构建SpringBoot项目外,还可以通过Spring Initializr方式快速构建SpringBoot项目。从本质上说,Spring Initializr是一个Web应用,它提供了一个基本的项目结构,能够帮助我们快速构建一个基础的Spring Initializr项目。
1.创建SpringBoot项目
打开idea,点击【file】-》【new】-》【project】-》【Spring Initializr】
点击【next】下一步
点击【next】下一步
点击【next】下一步
点击【finish】完成创建
即可idea会帮我们自动构建一个SpringBoot项目,pom.xml文件中会配置一系列的依赖插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.yhh</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!--支持SpringBoot的web插件依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--支持SpringBoot测试的插件依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--单元测试的插件依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
我们在主程序启动类中编写启动程序方法
package com.yhh;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
2.创建一个用于Web访问的Controller
在该项目的包下创建controller包,在该包下创建控制器类,并编写一个请求处理方法
package com.yhh.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/hello")public String one(){return "你好 spring boot";}
}
3.运行项目
运行主程序启动类,可以在浏览器上访问“http://localhost:8080/hello”,即可看到信息显示。使用Spring Initializr方式构建项目完成。
1.3单元测试与热部署
1.3.1 单元测试
在实际开发中,每当完成一个功能接口或业务方法的编写后,通常都会借助单元测试验证该功能是否正确。SpringBoot对项目的单元测试提供了很好的支持,在使用时,需要提前在项目的pom.xml文件中添加Spring-boot-starter-test测试依赖启动器,可以通过相关注解实现单元测试。这里,以之前创建的项目为例对SpringBoot项目的单元测试进行使用演示。
1.添加Spring-boot-starter-test测试依赖启动器
在项目的pom.xml文件中添加Spring-boot-starter-test测试依赖启动器
<!--支持SpringBoot测试的插件依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
2.编写单元测试类和测试方法
在Spring Initializr方式创建的SpringBoot项目中有一个自动生成的单元测试类,在该类中编写测试方法
package com.yhh;import com.yhh.controller.MyController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** 使用SpringInitializr方式自动创建的主程序启动类对应的单元测试类*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {//导入控制器@AutowiredMyController controller;@Testpublic void contextLoads() {}@Testpublic void oneTest(){String one = controller.one();System.out.println(one);}}
@SpringBootTest注解用于标记测试类,并加载项目的上下文环境ApplicationContext
@RunWith注解时一个测试类运行期,用于加载SpringBoot测试注解@SpringBootTest
@Autowired注入控制层类的对象
并在oneTest()方法运行时调用
1.3.2 热部署
在开发过程中,通常会对一段业务代码不断的修改测试,在修改之后往往需要重启服务,有些服务需要加载很久才能启动成功,这种不必要的重复操作极大降低了程序开发效率。为此,SpringBoot框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无须开发人员手动重启项目。
1.添加spring-boot-devtools热部署依赖启动器
在SpringBoot项目进行热部署测试之前,需要先在项目的pom.xml文件中添加spring-boot-devtools热部署依赖启动器。
<!--热部署依赖启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><version>2.1.3.RELEASE</version></dependency>
2.idea工具热部署设置
选择idea工具界面的【file】-》【Settings】选项,打开Compiler面板设置页面
在项目任意页面中使用组合键“Ctrl+Shift+Alt+/”打开Maintenance选项框,选中并打开Registry界面
勾选上后,将程序运行方式设置为自动编译
3.热部署效果测试
启动项目,打开浏览器访问项目,可看到控制器返回的内容,当运行后,我们改变返回的数据时,不需要再重新运行,idea会自动重新编译,直接刷新浏览器再次访问即可。
1.4 SpringBoot原理分析
通过前面的学习,我们对SpringBoot有了大致的了解。传统的Spring框架实现一个Web服务,需要导入各种依赖JAR包,然后编写对应的xml配置文件等,相比而言,SpringBoot显得更加方便,快捷和高效。那么,SpringBoot究竟如何做到这些呢?下面分别针对SpringBoot框架的依赖管理,自动配置和执行流程进行深入分析和讲解。
1.4.1 SpringBoot依赖管理
在SpringBoot入门程序中,项目pom.xml文件有两个核心依赖,分别时spring-boot-starter-parent和spring-boot-starter-web
1.spring-boot-starter-parent依赖
在项目中的pom.xml文件中找到spring-boot-starter-parent依赖
<!--SpringBoot父项目依赖管理--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent>
以上代码中将spring-boot-starter-parent依赖作为SpringBoot项目的同意父项目依赖管理,并将项目版本号同意为2.1.3RELEASE,该版本号根据实际开发需求时可以修改的。使用“Ctrl+鼠标左键”进入并查看spring-boot-starter-parent底层源文件
再进入spring-boot-dependencies依赖
从源代码中可以看到SpringBoot底层中已经帮我们封装和集成了非常多的常用jar包,这也就省去了我们Spring框架中的关联大量jar包和配置文件信息的麻烦。
2.spring-boot-starter-web依赖
spring-boot-starter-parent父依赖启动器的主要作用时进行版本统一管理,那么项目运行依赖的JAR包时从何而来,又是怎么管理的呢?下面,查看项目pom.xml文件中的spring-boot-starter-web依赖。
<!--支持SpringBoot的web插件依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
通过上述代码发现,spring-boot-starter-web依赖启动器的主要作用时提供Web开发场景所需的底层所有依赖文件,它对Web开发场景所需的依赖文件及逆行了同意管理。
正是如此,在pom.xml中引入spring-boot-starter-web依赖启动器时,就可以实现Web场景开发,而不需要额外导入Tomcat服务器以及其他Web依赖文件等。当然,这些引入的依赖文件的版本号还是有spring-boot-starter-parent父依赖进行统一管理。
这里需要说明的是,SpringBoot官方并不是针对所有场景开发的技术框架都提供了依赖启动器,例如MyBatis,Druid等就没有提供依赖启动器,如果需要使用,我们在pom.xml文件中引入mybatis-spring-boot-starter,druid-spring-boot-starter这些第三方的依赖启动器,切记要配置对应的版本号。
本章小结
本章主要对SpringBoot入门的一些基础知识进行了讲解。首先,对SpringBoot概念和特点进行了介绍,让读者快速了解SpringBoot框架的优势以及学习的必要性;然后,通过一个入门程序让读者快速体验到了SpringBoot项目开发的便捷;其次,讲解了SpringBoot项目开发中经常用到的单元测试和热部署;最后,深入分析了SpringBoot的原理,包括依赖管理,自动配置和执行流程。通过本章的学习,大家应该对SpringBoot有一个初步认识,为后续学习SpringBoot做好铺垫。
习题
-
填空题
-
Pivotal团队在原有 框架的基础上开发了全新的SpringBoot框架。
-
SpringBoot框架在开发过程中大量使用 的思想来拜托框架中各种复杂的手动配置
-
SpringBoot2.1.3版本要求Java 及以上版本的支持
-
Spring2.1.3版本框架官方声明支持的第三方项目构建工具包括有 和 。
-
-
判断题
-
Spring2.1.3版本要求Java7及以上版本的支持,同时兼容Java11.( )
-
使用Spring Initializr搭建SpringBoot项目,可以选择任意不同的SpringBoot版本,而无须修改。( )
-
使用Spring Initializr搭建的SpringBoot项目会默认生成项目启动类。( )
-
编写单元测试需要提前加入spring-boot-starter-test测试依赖启动器。( )
-
SpringBoot提供给了对所有第三方技术框架的整合支持和版本管理。( )
-
-
选择题
-
以下选项中,哪些属于SpringBoot的优点?( )(多选)
A. 可快速构建独立的Spring应用
B.无须打包即可快速部署
C.提供依赖启动器简化构建配置
D.极大程度的自动化配置了Spring和第三方库
-
IDEA界面中,【Configure】-》【Project Defaults】中的Project Structure主要作用是( )
A. 用于全局JDK初始化配置
B.用于全局Maven初始化设置
C.用于全局运行环境设置
D.以上都不对
-
下列关于SpringBoot项目各个包作用的说法,正确的是( )(多选)
A. resources下static中用于存放静态资源文件
B.resources下templates中用于存放模板文件
C.application.properties是项目的全局配置文件
D.以上都正确
-
下列关于SpringBoot依赖管理的说法,正确的是( )
A. spring-boot-starter-parent父依赖可以为仙姑提供整合的子依赖文件
B.spring-boot-starter-parent父依赖可以为仙姑提供整合的子依赖版本管理
C.Web场景开发依赖spring-boot-starter-web可以针对所有Web场景开发
D.Web场景开发依赖spring-boot-starter-web的版本需要自行管理
-
下列关于SpringBoot自动配置原理的说法,错误的是( )
A. @SpringBootApplication只包含@SpringBootConfiguration,@EnableAutoConfiguration,@CompenentScan3个注解
B.@SpringBootConfiguration注解表示当前类为一个配置类并可以被组件扫描器扫描
C.@EnableAutoConfiguration的作用是启动自动配置,向容器中导入所有选中的自动配置类
D.@ComponentScan注解的主要作用是扫描指定包及其子包下所有注解类文件作为Spring容器的组件使用
-
相关文章:
第1章 SpringBoot开发入门
学习目标 了解SpringBoot的优点 掌握SpringBoot项目的构建 掌握SpringBoot的单元测试和热部署 熟悉SpringBoot的自动化配置原理 熟悉SpringBoot的执行流程 随着互联网的兴起,Spring势如破竹地占据了Java领域轻量级开发的王者之位。随着Java语言的发展以及市场…...
利用prometheus+grafana进行Linux主机监控
文章目录 一.架构说明与资源准备二.部署prometheus1.上传软件包2.解压软件包并移动到指定位置3.修改配置文件4.编写启动脚本5.启动prometheus服务 三.部署node-exporter1.上传和解压软件包2.设置systemctl启动3.启动服务 四.部署grafana1.安装和启动grafana2.设置prometheus数据…...
单词反转(字符串)
题目名字 单词反转 题目链接 题意 输入倒序的字符串,要求输出正序的字符串 思路 用while输入,这样当出现输入是空格时自动划分上一个为一个单词然后再次反输出 while循环的条件是当不再输入的时候,因为是字符串,不用getline输入…...
【Java 集合】LinkedBlockingDeque
在开始介绍 LinkedBlockingDeque 之前, 我们先看一下 LinkedBlockingDeque 的类图: 从其中可以看出他直接实现了 BlockingDeque 接口, 而 BlockingDeque 又实现了 BlockingQueue 的接口, 所以它本身具备了队列的特性。 而实现 BlockingDeque 使其在 BlockingQueue 的基础上多了…...
【hacker送书第3期】OpenCV轻松入门:面向Python(第2版)
第3期图书推荐 内容简介作者简介图书目录专家推荐参与方式 内容简介 本书基于面向 Python 的 OpenCV(OpenCV for Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用…...
手把手教你isPalindrome 方法在密码验证中的应用
在信息安全领域中,密码验证是一个极为重要的组成部分。一个强密码应具备足够的复杂性,以免遭到破解。而回文密码是一种具备特殊性质的密码,其正序和倒序相同,因此具有极高的安全性,并能发挥重要作用。在实际密码策略中…...
drf入门规范(二)
四 RESTful API规范 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征性状态转移)。 它首次出现在2000年Roy Fielding的博士论文中。 RESTful是一种定义Web API接口的设计风格,尤其适用…...
使用Redis和Nginx分别实现限制接口请求频率
前言 为啥需要限制接口请求频率?这个是因为防止接口一直被刷,比如发送手机验证码的接口,一直被刷的话,费钱费资源的,至少做点基本的防护工作。以下分别使用Redis和Nginx实现限制接口请求频率方案。 一、基于Redis实现…...
ansible模块 (7-13)
模块 7、hostname模块: 远程主机名管理模块 ansible 192.168.10.202 -m hostname -a nameliu 8、copy模块: 用于复制指定的主机文件到远程主机的模块 常用参数: dest: 指出要复制的文件在哪,必须使用绝对路径。如果源目标是…...
MySQL概括与SQL分类
文章目录 一、计算机语言二、SQL语言三、数据库系统四、MySQL简介 一、计算机语言 二、SQL语言 三、数据库系统 四、MySQL简介...
微信小程序:wx:for 获取view点击的元素currentTarget.dataset为空
遍历数组渲染一组view通过bindtap事件获取点击的元素 解决办法: 在遍历时,设置data-item即可。 示例: <view wx:for"{{types}}" data-item"{{item}}"wx:key"key" bindtap"syntheActiveItem"c…...
Word的兼容性问题很常见,禁用兼容模式虽步不是最有效的,但可以解决兼容性问题
当你在较新版本的Word应用程序中打开用较旧版本的Word创建的文档时,会出现兼容性问题。错误通常发生在文件名附近(兼容模式)。兼容性模式问题(暂时)禁用Word功能,从而限制使用较新版本Word的用户编辑文档。…...
环境搭建及源码运行_java环境搭建_idea版本下载及安装
1、介绍 Idea是一款被广泛使用的Java集成开发环境,它提供了丰富的功能和工具来帮助开发人员更高效地编写和调试代码。作为一款开源软件,Idea不仅提供了基本的代码编辑、自动完成和调试功能,还支持大量的插件和扩展,可为开发人员提…...
jvm相关命令操作
查看jvm使用情况 jmap -heap PID 查看线程使用情况 jstack pid 查看当前线程数 jstack 21294 |grep -E (#[0-9]) -o -c 查看系统线程数 top -H top -Hp pid #查看具体的进程中的线程信息 使用 jps 命令查看配置了JVM的服务 查看某个进程JVM的GC使用情况 jstat -gc 进程…...
芋道前端框架上线之后发现element-ui的icon图标全部乱码
前言 最近发现线上有人反映图标全部是乱码,登录上去看确实乱码,刷新就好最后一顿搜,发现是sass版本不兼容导致的图标乱码问题 解决办法 1.先把sass升级到1.39.0 2.来到vue.config.js文件配置代码-如果是芋道前端框架不用配置自带 css: {lo…...
每个伦敦金投资者都应该练习的日线图交易
在伦敦金市场中,每个投资者都应该试着去做日线图的交易。有的人一听到日线图马上摇头,原因是日线图的价格跨度大,导致止损距离也变大,这样对投资者来说无疑是增加了风险。如果资金量大的投资者还好说,可以降低仓位&…...
高通平台开发系列讲解(USB篇)adb应用adbd分析
沉淀、分享、成长,让自己和他人都能有所收获!😄 在apps_proc/system/core/adb/adb_main.cpp文件中main()函数会调用adb_main()函数,然后调用uab_init函数 在uab_init()函数中,会创建一个线程,在线程中会调用init_functionfs()函数,利用ep0控制节点,创建ep1、ep2输…...
【上海大学数字逻辑实验报告】七、中规模元件及综合设计
一、实验目的 掌握中规模时序元件的测试。学会在Quartus II上设计序列发生器。 二、实验原理 74LS161是四位可预置数二进制加计数器,采用16引脚双列直插式封装的中规模集成电路,其外形如下图所示: 其各引脚功能为: 异步复位输…...
JVM内存结构Java内存模型Java对象模型
导图: https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9 1.JVM内存结构&&Java内存模型&&Java对象模型 1.1.JVM内存结构 1.2.Java对象模型 Java对象模型表示的是这个对象本身的存储模型,JVM会给这个类创建一个instanceKlass保存在方…...
Istio 社区周报(第一期):2023.12.11 - 12.17
欢迎来到 Istio 社区周报 Istio 社区朋友们,你们好! 我很高兴呈现第一期 Istio 社区周报。作为 Istio 社区的一员,每周我将为您带来 Istio 的最新发展、有见地的社区讨论、专业提示和重要安全新闻内容。 祝你阅读愉快,并在下一期中…...
质量图导向法解包裹之---计算边缘可靠性
在这之前需要我们知道像素点的可靠性 % 这反映了相位变化的平滑程度。以下是一个可能的实现,它使用了二阶差分来计算可靠性: function rel calculateReliability(wrappedPhase)% 应用高斯滤波减少噪声filteredImg imgaussfilt(wrappedPhase, 2); % 2 …...
C# WPF上位机开发(进度条操作)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 软件上面如果一个操作比较缓慢,或者说需要很长的时间,那么这个时候最好添加一个进度条,提示一下当前任务的进展…...
vulnhub-Tre(cms渗透)
靶机和kali都使用net网络,方便探测主机获取ip1.靶机探测 使用fping扫描net网段 靶机ip:192.168.66.130 2.端口扫描 扫描发现该靶机三个端口,ssh,还有两个web,使用的中间件也是不一样的,一个是apache&…...
Re解析(正则表达式解析)
正则表达式基础 元字符 B站教学视频: 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图,而 .* 就表示贪婪匹配,即尽可能多的匹配到符合的字符串,如果使用贪婪匹配,那么结果就是图中的情况三 p…...
HTML输出特殊字符详细方法
以下是部分特殊字符代码表,它们的完整应用代码格式为:&#;用下面的四位数字替换,将得到对应的符号。(注意:应用这些代码,编辑器应该切换到HTML模式) ☏260f ☎260e ☺263a ☻263b ☼263c ☽…...
《漫画算法》笔记——计算两个大数的和
例题: 输入:“123”,“234” 输出:“357” 思路: 使用数组,分别计算每一位上的加和,注意记录进位信息。 然后,将数组恢复成字符串,输出。 值得注意的是,加和…...
Python3.13版本改进规划
大家好,最近faster-cpython 项目的文档介绍了关于 Python 3.13 的规划,以及在 3.13 版本中将要实现的一些优化和改进。faster-python 是 Python 的创始人 Guido van Rossum 和他的团队提出的计划 ,目标是在四年内将 CPython 的性能提升五倍。…...
aws配置以及下载 spaceNet6 数据集
一:注册亚马逊账号 注册的时候,唯一需要注意的是信用卡绑定,这个可以去淘宝买,搜索aws匿名卡。 注册完记得点击登录,记录一下自己的账户ID哦! 二:登录自己的aws账号 2.1 首先创建一个用户 首…...
进阶之路:高级Spring整合技术解析
Spring整合 1.1 Spring整合Mybatis思路分析1.1.1 环境准备步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:添加Mybatis核心配置文件步骤8:编写应用程序步骤9:运行程序 1.…...
【ArcGIS微课1000例】0081:ArcGIS指北针乱码解决方案
问题描述: ArcGIS软件在作图模式下插入指北针,出现指北针乱码,如下图所示: 问题解决 下载并安装字体(配套实验数据包0081.rar中获取)即可解决该问题。 正常的指北针选择器: 专栏介绍ÿ…...
dz论坛做分类网站/杭州小程序建设公司
连试了几次全部失败。 只要用地铁卡了。 手机是:小米note2 支付宝首页》更多》便民生活》城市服务》交通》羊城通乘车码 出现二维码。 接着就是失败,失败,失败……...
如何做汽车团购网站/怎么查看域名是一级还是二级域名
shell脚本是我们在工作中经常会写的一个东西 一个新手小白或者是不懂linux的初学者可能觉得很难(我也是渣渣),编写的过程中总是遇到各种个样的错误 这里举例一个我遇到的问题,在shell中定义变量 #!/bin/bash str “I am string” echo "…...
i深圳网站建设/营销型网站的公司
p9 svn配置多仓库与权限控制...
佛教网站大全网/办理培训机构需要具备的条件
1、在Java中,没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性,所以Java语言取消了goto的使用。同时,为了避免程序员自行使用goto所带来的混乱,Java语言仍将goto定义为一个关键字,但是没有定义任何语法…...
一个网站拿到手里想做优化第一步怎么做/seo研究协会网
2019独角兽企业重金招聘Python工程师标准>>> 11行代码就写出了一个配置文件的解析器。 def loadUserInfo(fileName):userinfo {}file open(fileName, "r")while file:line file.readline()if len(line) 0:breakif line.startswith(#):continuekey, va…...
免费做调查的网站/培训机构退费法律规定
事件广播 简介 Laravel 5.1 之中新加入了事件广播的功能,作用是把服务器中触发的事件通过websocket服务通知客户端,也就是浏览器,客户端js根据接受到的事件,做出相应动作。本文会用简单的代码展示一个事件广播的过程。 依赖 redis…...