SpringBoot3学习记录(有ssm基础)

目录

一、SpringBoot3 介绍

SpringBoot3 简介

SpringBoot3 快速入门

入门总结

1.为什么依赖不需要写版本

2.Startrer(启动器)是什么

3.@SpringBootApplication

二、SpringBoot3 配置文件

统一配置管理

使用yaml配置文件(推荐)

读取配置文件

多环境配置和使用

三、SpringBoot3 整合 SpringMVC

实现过程

SpringMvc相关的配置:

静态资源处理

自定义拦截器

四、SpringBoot3 整合 Druid

操作过程

五、SpringBoot3 整合 Mybatis

1.Mybatis整合步骤

2.mybatis整合实践

3.声明式事务整合配置

4.AOP整合配置

六、SpringBoot3 项目打包和运行


一、SpringBoot3 介绍

SpringBoot3 简介

spring的配置文件或配置类太过繁琐,当编写微服务项目时,每有一个子项目,都需要编写对应的配置文件或配置类等。而SpringBoot能帮我们简单,快速地创建一个独立,生产级别的Spring应用(SpringBoot底层是Spring),大多数SpringBoot应用只需要编写少量配置即可快速整合Spring平台以及第三方技术。

简单来说,SpringBoot整合了Spring,简化了开发。

SpringBoot主要目的:

  • 为所有spring开发提供更快捷、可广泛访问的入门体验
  • 设置合理的默认值,也可以根据需求进行适当的调整
  • 提供一系列大型项目通用的非功能性程序(如内置服务器、安全性、指标、运行检查等)
  • 约定大于配置,基本不需要主动编写配置文件或配置类

总结:简化开发,简化配置,简化整合,简化部署,简化监控,简化运维。

SpringBoot3 系统要求:

maven        3.6.3+

Tomcat        10.0+

Servlet        9.0+

JDK             17+

SpringBoot3 快速入门

场景:通过浏览器发送 /hello 请求,返回“Hello,SpringBoot 3”

操作步骤:

1.创建Maven工程:springboot_mvc

2.添加依赖 (SpringBoot父工程依赖,web启动器依赖)

    <parent>
<!--        只要把它作为父工程,此项目就是一个springboot工程--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent><dependencies>
<!--        web启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

3.编写启动引导类(SpringBoot项目运行的入口)

@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);//自动创建ioc容器,启动tomcat服务器软件}
}

4.编程处理类(controller)

@Controller
@RequestMapping("hello")
@ResponseBody
public class HelloController {@GetMappingpublic String hello(){return "Hello,SpringBoot 3";}}

5.启动项目

运行Main就行

入门总结

1.为什么依赖不需要写版本

        父项目spring-boot-starter-parent的父工程spring-boot-dependencies(版本仲裁中心)中把常见的依赖版本都声明好了。

2.Startrer(启动器)是什么

        SpringBoot提出了Starter的概念,它是一组预定义的依赖项集合,旨在简化Spring项目的配置和构建过程。Starter包含了一组相关依赖项,以便在启动项目时自动引入需要的库,配置和功能,

(注意:不仅仅是导入库)。

像上面项目中导入了spring-boot-starter-web这个启动器,以往要web开发需要导入依赖:spring-webmvc,servlet,json等,还要写对应的配置文件或配置类。但web启动器内部帮我们导入web相关的依赖,还帮我们导入一些相应的web配置。 

Start启动器有两种:官方提供和第三方提供。

官方提供的,一般命名为:spring-boot-starter-*

第三方提供的,一般命名为:*-spring-boot-starter

官方启动器:Developing with Spring Booticon-default.png?t=N7T8https://docs.spring.io/spring-boot/docs/current/reference/html/using.html?spm=wolai.workspace.0.0.68b623067jPfWP#using.build-systems.starters

启动器与依赖传递:

依赖传递是MAVEN底层实现,它并不全面,如:要使用mybatis,需要导入mysql,druid,mybatis。

启动器是人为根据开发场景设置的,会根据场景包装对应的依赖,如:mybatis的启动器就会包含对应的依赖和配置。

3.@SpringBootApplication

@SpringBootApplication添加到启动类上,是一个组合注解,它的子注解有:

@SpringBootConfiguration

@EnableAuotConfiguration

@ComponentScan

@SpringBootConfiguration:声明当前类是配置类,如果之后想要添加ioc对象可以直接在该类下添加。

@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}@Beanpublic Object object(){return new Object();}
}

@EnableAutoConfiguration:自动加载配置类,加载我们编写的配置类和SpringBoot内部自带的配置类。

@ComponentScan:默认扫描当前类所在包以及子包的注解。

Main方法中的SpringApplication.run(Main.class, args)的功能为:

1.创建ioc容器,加载配置

2.启动内置的tomcat服务器

二、SpringBoot3 配置文件

统一配置管理

SpringBoot项目下,进行统一配置管理,如何想设置的参数(端口号,项目根路径,数据库连接信息等等)都集中在一个固定位置命名的配置文件(application.properties、application.yml、application.yaml)中。

配置文件应该放在SpringBoot工程的src/main/resources目录下。因为此目录是SpringBoot默认的类路径(classpath),配置文件会被自动加载并可供应用程序访问。

在这个配置文件中使用两种方式设置参数:

1.固定的key配置参数(官方提供)

Common Application Propertiesicon-default.png?t=N7T8https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html?spm=wolai.workspace.0.0.68b623067jPfWP#appendix.application-properties

2.自定义key配置参数(示例application.properties格式)

        如:qiu.name=qiu

        在组件中可以使用@Value(${key})接收参数

#使用SpringBoot提供的key修改程序的参数
server.port=81
#项目访问根路径
server.servlet.context-path=/qiu
#自定义key配置参数
qiu.name=qiu
qiu.age=22
@Controller
@RequestMapping("hello")
@ResponseBody
public class HelloController {@Value("${qiu.name}")private String name;@GetMappingpublic String hello(){System.out.println(name);return "Hello,SpringBoot 3";}}

使用yaml配置文件(推荐)

yaml语法:1.数据结构有树状结构呈现,通过缩进表示层级

                   2.连续的项目(集合)通过减号"- "来表示(减号后面有一个空格)

                   3.键值结构key/value使用": "(冒号后面有一个空格)

                   4.yaml配置文件的拓展名为:yml或yaml

server:port: 82servlet:context-path: /qiu
qiu:user:name: qiuage: 22py:- a- b- c

读取配置文件

方式1:@Value("${key}"):该注解本身使用的是di注入,因此使用该注解的类需要放到ioc容器。

@Data
@Component
public class User {@Value("${qiu.user.name}")private String name;@Value("${qiu.user.age}")private int age;@Value("${qiu.user.py}")private List<String> py;
}

@Value注解key必须写全,而且只能读取单个值。

方式2:@ConfigurationProperties注解,将注解内prefix指向要赋值的key那一层。

        该注解会把对应的属性赋值(只有类中属性名与指定的那一层key值相同才会赋值)

qiu:user:name: qiu2age: 23py:- a- b- cpys:sex: 1
@Data
@Component
@ConfigurationProperties(prefix = "qiu.user")
public class User {
//    @Value("${qiu.user.name}")private String name;
//    @Value("${qiu.user.age}")private int age;
//    @Value("${qiu.user.py}")private List<String> py;private String sex;
}

该测试无误。

多环境配置和使用

在开发一个项目过程中会有不同的时期:开发,测试,生产。对应不同的时期所使用的配置参数可能不同(数据库,日志级别等等)。

这时我们可以在application.yaml(properties)之外再创建 文件名如:application-test.yaml(application-*.yaml)的配置文件,再使用application.yaml中的spring.profiles.active: test来激活application-test.yaml。

当配置文件内容太多时,也可以使用该方法,如:druid的配置内容可以放在application-druid.yaml。

如果有多个配置文件需要激活在后面加 " , " 分隔。如:application-test.yaml,application-dev.yaml可以在application.yaml中使用:"spring.profiles.active: test,dev"。

如果配置文件有重复的key,会按顺序覆盖。

当项目完成后会被打成一个jar包,我们在执行项目时可以添加命令在启动项目时动态指定要激活哪个配置。

三、SpringBoot3 整合 SpringMVC

实现过程

创建maven项目

继承父工程:spring-boot-starter-parent

导入web开发场景的启动器:spring-boot-starter-web

定义启动类

@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

编写controller层

@Controller
@ResponseBody
@RequestMapping("/hello")
public class HelloController {@GetMappingpublic String hello(){return "你好,springboot";}}

运行启动类即可访问:localhost:8080/hello

SpringMvc相关的配置:

server.port        端口号

server.servlet.context-path        项目访问根路径

spring.resources.static.locations        静态资源的位置

spring.http.encoding.charset        Http请求的字符编码

spring.http.encoding.enabled        响应的字符编码

静态资源处理

我们如何访问项目静态资源?

方式1:将资源放到默认的文件夹

  • classpath:/META-INF/resources/
  • classpath:/resources/(该文件夹与项目自带的resources文件夹不同)
  • classpath:/static/
  • classpath:/public/

方式2:使用spring.web.resources.static-locations: … 修改

自定义拦截器

1.声明拦截器

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor.preHandle");return true;}
}

2.创建配置类

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor());}
}

只要配置类放在启动类的包或子包下,SpringBoot就会自动扫描。

四、SpringBoot3 整合 Druid

整合Druid连接池一般整合两个功能:数据库连接池功能和监控页面。

但暂时只整合连接池功能,因为druid 1.2.18 目前对springboot3整合并不是很好。

操作过程

1.导入依赖

<?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 http://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>3.0.5</version></parent><groupId>com.atguigu</groupId><artifactId>springboot-starter-druid-04</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--  web开发的场景启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 数据库相关配置启动器 jdbctemplate 事务相关--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid启动器的依赖  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驱动类--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies><!--    SpringBoot应用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.配置文件编写

spring:datasource:# 连接池类型 type: com.alibaba.druid.pool.DruidDataSource# Druid的其他属性配置 springboot3整合情况下,数据库连接信息必须在Druid属性下!druid:url: jdbc:mysql://localhost:3306/springbootusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver# 初始化时建立物理连接的个数initial-size: 5# 连接池的最小空闲数量min-idle: 5# 连接池最大连接数量max-active: 20# 获取连接时最大等待时间,单位毫秒max-wait: 60000# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。test-while-idle: true# 既作为检测的间隔时间又作为testWhileIdel执行的依据time-between-eviction-runs-millis: 60000# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)min-evictable-idle-time-millis: 30000# 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)validation-query: select 1# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-borrow: false# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-return: false# 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。pool-prepared-statements: false# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100max-pool-prepared-statement-per-connection-size: -1# 合并多个DruidDataSource的监控数据use-global-data-source-stat: truelogging:level:root: debug

3.创建pojo类和controller层

@Data
public class User {private Integer id;private String name;private Integer age;private String email;
}
@Controller
@RequestMapping("user")
@ResponseBody
public class UserController {@Autowiredprivate JdbcTemplate jdbcTemplate;@GetMappingpublic List<User> show(){String sql = "select * from user";List<User> users = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(User.class));return users;}
}

当导入jdbc启动器,springboot会帮我们完成配置类的加载,JdbcTemplate会自动放到ioc容器中,我们需要时注入就行。

4.编写启动类并启动

启动项目时会报错,因为springboot3和druid 1.2.18 不兼容,缺少自动装配的配置文件。(druid版本为1.2.20时已兼容,启动时不会报错)

解决方法:在resources目录下创建

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件,文件内容为

com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

五、SpringBoot3 整合 Mybatis

1.Mybatis整合步骤

1.1.导入依赖:添加MyBatis和数据库驱动的相关依赖,如使用Mysql数据库,添加MyBatis和MySQL驱动的依赖。

1.2.配置数据源:在application.yaml中配置数据库连接信息(url,username,password,driver,mybatis的功能配置等)。

1.3.创建实体类:创建与数据库表对应的实体类。

1.4.创建Mapper接口:创建与数据库表交互的Mapper接口。

1.5.创建Mapper接口SQL实现:使用mapper.xml文件或注解方式。

1.6创建程序启动类

1.7.注解扫描:在启动类上添加@MapperScan注解,用于扫描和注册Mapper接口。

1.8.使用Mapper接口

2.mybatis整合实践

创建项目:springboot-mybatis

导入依赖:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.1</version></dependency><!-- 数据库相关配置启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid启动器的依赖  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驱动类--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>

配置文件:

server:port: 80servlet:context-path: /
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:url: jdbc:mysql:///springboot_mybatisusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis:configuration:  # setting配置auto-mapping-behavior: fullmap-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpltype-aliases-package: com.qiu.pojo # 配置别名mapper-locations: classpath:/mapper/*.xml # mapperxml位置

        druid会报错,记得之前的操作。

创建实体类:

@Data
@ToString
public class User {private String account ;private String password ;private Integer id ;
}

创建Mapper接口:

public interface UserMapper {List<User> queryAll();
}

创建Mapper接口SQL实现:由于application.yaml已经设置了mapperxml的位置,因此只需要在resources下创建mapper.Usermapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace = 接口的全限定符 -->
<mapper namespace="com.qiu.mapper.UserMapper"><select id="queryAll" resultType="user">select * from user</select></mapper>

创建启动类:

@SpringBootApplication
@MapperScan("com.qiu.mapper")//mapper接口所在的位置
public class Main {public static void main(String[] args) {
//        System.out.println("Hello world!");SpringApplication.run(Main.class,args);}
}

注解扫描:

在启动类上添加@MapperScan,以前想要mapper接口和mapperxml对应上我们需要为两个文件创建统一的文件路径,但springboot可以在application.json中指定mapperxml的路径,在启动类上@MapperScan上指定mapper接口的路径,这样就不需要两个文件的统一路径。

controller操作:

@Controller
@ResponseBody
@RequestMapping("user")
public class UserController {@Autowiredprivate UserMapper userMapper;@GetMappingpublic List<User> getUsers(){return userMapper.queryAll();}
}

访问localhost:80/user

3.声明式事务整合配置

导入依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

SpringBoot项目会自动配置一个 DataSourceTransactionManager,所以我们只需在方法(或者类)加上 @Transactional 注解,就自动纳入 Spring 的事务管理了

    @Transactionalpublic void addUser(){User user = new User();user.setId(4);user.setAccount("user4");user.setPassword("pass4");userMapper.addUser(user);}

4.AOP整合配置

导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

直接使用注解即可:com.qiu.advice.LogAdvice

@Component
@Aspect
@Order(4)
public class LogAdvice {@Before("execution(* com..service.*.*(..))")public void before(JoinPoint joinPoint){String classname = joinPoint.getClass().getSimpleName();String methodname = joinPoint.getSignature().getName();System.out.println("methodname = " + methodname+" classname = " + classname);}
}

六、SpringBoot3 项目打包和运行

在普通的web工程中,要打包需要打成war包,然后再tomcat服务器中运行。

在springboot工程中,由于内置了tomcat,所以可以直接打成jar包,使用命令执行java -jar xx。

1.添加打包插件:不使用插件也可以把项目打成jar包,但运行时会找不到项目入口,所以需要使用springboot的打包插件

<!--    SpringBoot应用打包插件-->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

2.打包

3.命令启动和命令参数

命令参数:

        命令格式:java -jar  [选项] [参数] <jar文件名>

1. -D<name>=<value>:设置系统属性,可以通过`System.getProperty()`方法在应用程序中获取该属性值。例如:java -jar -Dserver.port=8080 myapp.jar。
2. -X:设置JVM参数,例如内存大小、垃圾回收策略等。常用的选项包括:
           -Xmx<size>:设置JVM的最大堆内存大小,例如 -Xmx512m 表示设置最大堆内存为512MB。
           -Xms<size>:设置JVM的初始堆内存大小,例如 `-Xms256m` 表示设置初始堆内存为256MB。
3. -Dspring.profiles.active=<profile>:指定Spring Boot的激活配置文件,可以通过application-<profile>.properties或 application-<profile>.yml文件来加载相应的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar。

命令示例:java -jar -Dserver.port=81 springboot-mybatis-1.0-SNAPSHOT.jar

                  java -jar -Dserver.port=81 -Dspring.profiles.active=test,dev springboot-mybatis-1.0-SNAPSHOT.jar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540844.html

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

相关文章

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接&#xff1a;基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

Hadoop大数据应用:Linux 部署 MapReduce 与 Yarn

目录 一、实验 1.环境 2.Linux 部署 MapReduce 3.Linux 部署 Yarn 4.Linux 调用大数据集群分析数据 二、问题 1.hadoop 的启动和停止命令 2.HDFS 使用命令 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xf…

easyexcel读和写excel

请直接看原文: JAVA使用easyexcel操作Excel-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 之前写过一篇《JAVA操作Excel》&#xff0c;介绍了jxl和poi读写Excel的实现&am…

ELK之使用Filebeat插件收集日志到Logstash

对于Springboot项目接入ELK非常方便&#xff0c;对于非maven&#xff0c;非Spring项目来说就比较复杂&#xff0c;这个时候我们就可以使用Filebeat插件还完成日志的收集发送工作。 Filebeat介绍 Filebeat是用于转发和收集数据的轻量级工具&#xff0c;Filebeat可以监视指定的…

深度学习PyTorch 之 LSTM-中文多分类

LSTM 代码流程与RNN代码基本一致&#xff0c;只是这里做了几点优化 1、数据准备 数据从导入到分词&#xff0c;流程是一致的 # 加载数据 file_path ./data/news.csv data pd.read_csv(file_path)# 显示数据的前几行 data.head()# 划分数据集 X_train, X_test, y_train, y_…

【全志H616】1 --用orangepi控制硬件

【全志H616】1 --用orangepi控制硬件 本文介绍了如歌用orangepi 控制蜂鸣器&超声波模块&#xff0c;通过键盘输入1、2、3、4来控制转动角度舵机模块&#xff1b;同时还介绍了利用全志如何配置定时器&#xff1b;以及查看H616引脚状态的命令等… 超声波模块和舵机模块的讲解…

Seata 2.x 系列【11】多数据源分布式事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 多数据…

The service already exists!怎么解决,Windows怎么安装/卸载服务?

问题描述 有时候,我们在Windows系统上安装服务时会遇到报错,The service already exists! 问题分析 这个报错说明此服务已经存在了,所以我们不能再次安装,但有时候我们明明是第一次安装,为什么也会报这个错误呢? 在Windows上注册服务通常需要使用命令行工具或者特定的…

保姆级OpenSSL下载及安装教程

下载地址下载步骤安装步骤环境变量配置查看是否安装成功下载地址 官网链接:(https://slproweb.com/products/Win32OpenSSL.html ) 点击跳转 下载步骤 以下步骤截图,以当前官网界面为标准,后有变动请提示博主修改。 点击链接跳转后界面为 往下滚动找到安装包下载按钮…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…

预设收支类别,高效管理账户,轻松记录每一笔明细

在快节奏的现代生活中&#xff0c;财务管理变得越来越重要。你是否曾为繁琐的记账工作而烦恼&#xff1f;是否曾在忙碌的生活中遗漏了重要的收支信息&#xff1f;现在&#xff0c;有了这款强大的财务管理工具&#xff0c;你将能够轻松记录每一笔收支明细&#xff0c;实现高效的…

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…