SpringBootWeb案例 Part 5

4. 配置文件

员工管理的增删改查功能我们已开发完成,但在我们所开发的程序中还一些小问题,下面我们就来分析一下当前案例中存在的问题以及如何优化解决。

4.1 参数配置化

在我们之前编写的程序中进行文件上传时,需要调用AliOSSUtils工具类,将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时,需要一些参数:

  • endpoint // 阿里云OSS域名

  • accessKeyID // 用户身份ID

  • accessKeySecret // 用户密钥

  • bucketName // 存储空间的名字

关于以上的这些阿里云相关配置信息,我们是直接写死在Java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:

  1. 如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐)

  2. 如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,导致不方便集中的管理和维护

思考:怎样将这些参数集中配置管理呢?

回答:Java代码会有很多这毋庸置疑,但是对于SpringBoot项目来说,什么东西一般只有一个?配置文件只有一个,代码当中所有容易变动的参数建议放在配置文件当中进行管理和维护,也就是application.properties。

将参数集中保存/配置在properties配置文件当中的优点:

  1. 在application.properties当中的配置做了修改,我们不用进行编译,而且,所有的配置如果都交给了application.properties配置文件来集中管理,以后如果我们想修改,我们直接找到properties配置文件来做一个修改就可以了,软编码
  2. 其次,安全:敏感的参数(如数据库连接密码)不应该直接硬编码在代码中,而是通过配置文件进行管理,这样可以降低配置泄漏的风险,并更好的保护敏感信息。
  3. 灵活性和可移植性:不同环境的参数配置只需在对应的配置文件中进行修改即可。
  4. 易用性和可读性:将参数配置到配置文件中,使得参数的设置更加直观和易于理解,提高配置文件的可读性和维护性。

注意:这里的配置文件指的可不是pom.xml,pom.xml这份配置文件是Maven项目的配置文件,是用来配置依赖的,而application.properties才是SpringBoot项目的配置文件。

为了解决以上分析的问题,我们可以将参数配置在配置文件中。而application.properties配置文件的形式就是key = value,前面的key可以自己定义,注意在项目开发时,尽量要定义的有一定的业务含义,如下:

问题解决: 

#自定义的阿里云OSS配置信息
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret=4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketName=gch-web-tlias01

注意:

  • 由于properties配置文件当中的信息本身就是一个字符串,所以我们就不需要再来加引号,后面的分号也不需要,等号两边的空格也不需要。

在将阿里云OSS配置参数交给properties配置文件来管理之后,我们的AliOSSUtils工具类就变为以下形式:

/**
 * 使用阿里云OSS进行文件存储的工具类
 */
@Component
public class AliyunOSSUtils {
    /** 以下4个参数没有指定值(默认值:null)*/
    /** 指定连接的阿里云OSS服务的地址 */
    private String endpoint;
    /** 阿里云OSS AccessKey */
    private String accessKeyId;
    private String accessKeySectre;
    /** 存储空间Bucket的名称 */
    private String bucketName;

    //省略其他代码...
}

此时如果直接调用AliOSSUtils类当中的upload方法进行文件上传时,这4项参数全部为null,原因是因为并没有给它赋值。

此时我们是不是需要将配置文件当中所配置的属性值读取出来,并分别赋值给AliOSSUtils工具类当中的各个属性呢?那应该怎么做呢?

想法:IO流,通过IO流读取并解析配置文件当中配置项的值,然后再给成员变量赋值。          

因为application.properties是springboot项目默认的配置文件,所以SpringBoot程序在启动时会默认读取application.properties配置文件,而我们可以使用SpringBoot提供一个的现成的注解:@Value获取配置文件中的数据。  

  • @Value 注解通常用于外部配置的属性注入,具体用法为: @Value("${配置文件中的key}")  
  • 通过@Value注解进行属性注入,将外部的属性配置注入进来赋值给成员变量,在@Value注解当中来指定我们要注入的是配置文件当中的哪一个Key对应的属性值。
/**
 * 使用阿里云OSS进行文件存储的工具类
 */
@Component
public class AliyunOSSUtils {
    /** 指定连接的阿里云OSS服务的地址 */
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    /** 阿里云OSS AccessKey */
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    /** 存储空间Bucket的名称 */
    @Value("${aliyun.oss.bucketName}")
    private String bucketName;
}

总结:

  • 如果在项目开发当中,我们需要用到一些技术或者是服务,我们就可以把这个技术或者是服务它在运行时所需要的参数直接配置在配置文件当中,交给配置文件进行统一的管理和维护,然后在程序当中我们就可以通过@Value注解来注入对应的外部配置的属性值。

4.2 yml配置文件

  • 全新格式的配置文件 - yml配置文件 

在SpringBoot项目当中,是支持多种配置方式的,前面我们一直使用SpringBoot项目创建完毕后自带的application.properties配置文件进行属性的配置,properties配置文件的配置形式就是键值对Key=Value,等号之前是Key,等号之后是Value,那其实呢,在SpringBoot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件,就是我们接下来要学习的yml格式的配置文件

  • yml格式的配置文件,它的后缀可以是yml(推荐),也可以是yaml,这两个配置文件它的配置形式都是相同的,仅仅是后缀名不同而已。
  • 如果是yml格式的配置文件,配置文件的名字也必须叫做application.yml。

yml 格式的配置文件,后缀名有两种:

  • yml (推荐)

  • yaml

SpringBoot提供了多种属性配置方式 / SpringBoot所支持的配置文件

  • application.properties

    server.port=8080
    server.address=127.0.0.1
    
  • application.yml

    server:
      port: 8080
      address: 127.0.0.1
  • application.yaml

    server:
      port: 8080
      address: 127.0.0.1
  • 可以看到,在SpringBoot当中所支持的这三种配置文件,配置文件的名字都是相同的,都叫applictaion,只是文件扩展名不同而已。
  • 如果是yml格式的配置文件,它的配置形式是键值对Key:Value,而且这个Key还是按照层级书写的,相比于传统的properties格式,YAML格式的配置文件使用缩进和结构化语法来表示数据的层级关系。
  1. 层级结构:YAML配置文件使用缩进来表示层级关系,前面的缩进相同,代表它们的层级也相同。比如我们要配置服务器运行的端口号:server.port,

  • 在上面的示例中,porthost 和 timeout 是 server 的子属性它们位于不同的缩进级别

2. 键值对(对象/Map集合):YAML 使用冒号(:)来表示键值对。冒号后面是一个空格,然后是相应的值。

  • 在上面的示例中,urlusername 和 password 是 database 的子属性。

3. 列表(数组/List/Set集合):YAML 支持表示列表数据的方式,使用短横线(-)表示列表中的项目。

  • 在上面的示例中,fruits 是一个包含三个元素的列表。 

4. 注释:使用井号(#)表示注释。井号后面的内容将被视为注释,不会被解析。

  • 在上面的示例中,井号后面的内容是注释,不会影响配置的读取和解析。 

这些是 YAML 配置文件的一些常见形式。通过使用缩进、键值对、列表和注释等语法规则,YAML 配置文件可以更清晰和易读地表示数据的结构和层级关系。

在SpringBoot的resources目录下来创建一份儿applictaion.yml格式的配置文件,创建后可以看到,在我们所创建出来的application.yml格式的配置文件前面多了一个SpringBoot的Logo,这就说明SpringBoot是识别这份配置文件的。 

application.yml

演示:输入server之后给出自动提示,我们要配置的是SpringBoot内嵌的Tomcat服务器运行的端口号,默认是8080,我们可以修改内嵌的Tomcat服务器端口号为9000:

常见的三类配置文件格式的优缺点对比:  

  • XML配置文件当中,我们要定义很多的标签,既要定义开始标签,又要定义结束标签,既有父标签,也有子标签,虽然层级结构比较清晰,但是配置比较臃肿
  • properties配置文件相对于XML配置文件来说,会更加轻量化一些,它的配置格式是键值对Key=Value,但是,在项目开发当中,我们经常会使用大量的框架以及第三方的技术,而在使用框架时,我们又需要在配置文件当中来配置很多的参数,而在框架当中,为了让这个Key更加的简明知意,并且具有一定的标识意义,所以这个Key通常来说都是分层级的,如果用properties配置文件来配置,那就是平铺直叙层级结构并不清晰,而且这个Key越复杂,层级架构约不清晰,所以properties配置文件相对于XML配置文件来说,它会更加轻量化一些,但是它并没有XML配置文件结构清晰。 
  • 如果采用yml格式来配置,这个层级结构就会更加清晰没有一点儿多余的配置,而且通过该配置结构可以更清晰的表示数据的结构和层级关系,完全以数据为中心,简洁,没有一点儿多余的配置。

在SpringBoot当中,仅支持properties和yml格式的配置,而在现在的企业开发当中,SpringBoot项目基本上采用的都是yml格式的配置文件,很少使用properties,所以,推荐使用yml格式的配置文件。

对于yaml格式的配置文件,我们一般会选择yml这个拓展名,更加简单

我们可以看到配置同样的数据信息,yml格式的数据有以下特点:

  1. - 容易阅读
  2. - 容易与脚本语言交互
  3. - 以数据为核心,重数据轻格式

简单的了解过SpringBoot所支持的配置文件,以及不同类型配置文件之间的优缺点之后,接下来我们就来了解下yml配置文件的基本语法:  

  • 大小写敏感

  • 数值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(对于现在的开发工具来说,使用Tab制表符或者空格无所谓,因为高级开发工具idea中会自动的将yml格式配置文件当中的Tab转换为空格)

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

 

yml文件当中常见的两类数据格式:

在这里我们主要介绍最为常见的两类:

  1. 定义对象或Map集合

  2. 定义数组、List或Set集合

对象/Map集合  

 

 

数组/List/Set集合  

 

总结: 

 

4.3 yml配置 

熟悉完了yml文件的基本语法后,我们修改下之前案例中使用的配置文件,变更为application.yml配置方式:  

  • 在application.yml中配置案例相关的配置项,接着删除传统的application.properties配置文件 

对比: 

原有的application.properties配置文件:

#数据库连接
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的URL
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456

#开启mybatis的日志输出{配置MyBatis的日志,指定输出到控制台}
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启数据库表字段 到 实体类属性的驼峰映射 a_column ---> aColumn
mybatis.configuration.map-underscore-to-camel-case=true

#PageHelper分页插件的配置
#配置数据库方言
pagehelper.helper-dialect=mysql
#分页合理化参数配置
pagehelper.reasonable=true

#配置单个文件最大上传大小的限制,默认是1MB
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小的限制(一次请求可以上传多个文件),默认是10MB
spring.servlet.multipart.max-request-size=100MB

#自定义的阿里云OSS配置信息
aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret=4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketName=gch-web-tlias01

新建的application.yml配置文件:

#注意,yml格式的配置是键值对Key: Value,并且是Key: +空格 + Value
#数据库连接四要素
spring:
  datasource:
    #驱动类名称
    driver-class-name: com.mysql.cj.jdbc.Driver
    #数据库连接的URL
    url: jdbc:mysql://localhost:3306/tlias
    #连接数据库的用户名
    username: root
    #连接数据库的密码
    password: 123456

#文件上传的配置(关键字:multipart)
  servlet:
    multipart:
      #配置单个文件最大上传大小的限制,默认是1MB
      max-file-size: 10MB
      #配置单个请求最大上传的大小的限制(一次请求可以上传多个文件),默认是10MB
      max-request-size: 100MB

#MyBatis配置(关键字camel、log-impl)
mybatis:
  configuration:
    #开启MyBatis的日志输出{配置MyBatis的日志,指定输出到控制台}
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启数据库表字段 到 实体类属性的驼峰映射 a_column ---> aColumn
    map-underscore-to-camel-case: true


#PageHelper分页插件的配置
pagehelper:
  #配置数据库方言
  helper-dialect: mysql
  #分页合理化参数配置
  reasonable: true


#自定义的阿里云OSS配置信息
aliyun:
  oss:
    #OSS对象存储服务的域名
    endpoint: https://oss-cn-beijing:aliyuncs:com
    #阿里云账号AccessKey
    accessKeyId: LTAI5tHGMz3QSEMrwu6wSmSC
    #阿里云账号AccessKey对应的密钥
    accessKeySecret: 4yBkKaSJvvqobtnK36fTGXiPreqh5P
    #存储空间Bucket的名称
    bucketName: gch-web-tlias01

#配置服务器相关信息
server:
  port: 8080
  address: 127.0.0.1

#定义对象/Map集合(key:Value)
user:
    name: Tom
    age: 18
    password: 20


#数组/List/Set集合(列表):使用短横线-表示列表中的项目
hobby:
  -java
  -game
  -sport

4.4 @ConfigurationProperties

  • 注解@ConfigurationProperties  

学习完了yml配置文件之后,最后再来介绍一个注解@ConfigurationProperties。在介绍注解之前,我们先来看一个场景,分析下代码当中可能存在的问题:  

  • 我们在application.properties或者application.yml中配置了阿里云OSS的四项参数之后如果Java程序中需要这四项参数数据,我们直接通过@Value注解来进行注入,通过@Value注解来注入外部配置文件当中的属性值,并且在@Value注解当中要通过${""}的形式来指定我们要注入的是哪一个配置项的值,这种方式本身没有什么问题问题,但是如果说需要注入的属性较多(例:需要20多个参数数据),每一个属性/成员变量上都需要加上这么一个@Value注解,导致我们整个编码写起来就会比较繁琐,而且比较臃肿。

那么有没有一种方式可以简化这些配置参数的注入呢?我们不用在每一个成员变量上都加上这个@Value注解,就可以自动的将配置文件当中配置项的值直接注入给这个对象的属性当中来呢?

  • 答案是肯定的,在Spring中给我们提供了一种简化方式,可以直接将配置文件中配置项的值自动的注入到对象的属性当中,但是,它是有前提条件的(Spring提供的简化方式套路):
  1. 需要创建一个实体类,并且配置文件当中Key的名字必须要和实体类当中的属性名保持一致(比如:配置文件当中叫endpoints,实体类当中的属性也得叫endpoints ),并且还要为实体类属性提供Getter/Setter方法,所以在实体类上面要加上@Data注解
  2. 需要将实体类的实例交给IOC/Spring容器管理,成为IOC/Spring容器当中的bean对象,所以需要在实体类上面加上@Component注解;
  3. 当前,bean对象当中的属性还不能够完成自动注入,原因是因为现在仅仅是这个bean对象的属性名与配置项的后缀保持一致了,而配置项前面还有一个前缀,所以我们还需要指定一下配置项的前缀,指定前缀我们就可以使用@ConfigurationProperties这个注解来指定,我们只需要在实体类上面加上@ConfigurationProperties注解,并通过prefix属性来指定配置项的前缀,此时就代表我需要将该前缀下面的子属性/子配置项对应的值自动的注入到实体类对象(bean对象)当中的属性当中来。
  • 此时,在其他类当中我们要想获取配置项对应的属性值,那我们只需要注入该实体类的bean对象,然后调用它的get方法就可以获取到对应的属性值了。
  • prefix:前缀  configuration:配置

实体类:AliyunOSSProperties  

package com.gch.utils;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
   阿里云OSS相关配置:将配置文件当中配置项的值自动的注入到bean对象的属性当中
 */
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {
    /** 指定连接的阿里云OSS对象存储服务的域名/地址 */
    private String endpoint;
    /** 阿里云OSS账号AccessKey身份ID */
    private String accessKeyId;
    /** 阿里云OSS账号AccessKey身份ID对应的密钥 */
    private String accessKeySecret;
    /** 存储空间Bucket的名称 */
    private String bucketName;
}

AliyunOSSUtils:

package com.gch.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/**
   使用阿里云OSS进行文件存储的工具类
 */
@Component // 当前类对象由Spring创建和管理
public class AliyunOSSUtils {
    /** 注入配置参数实体类对象 */
    @Autowired
    private AliyunOSSProperties aliyunOSSProperties;
    /**
     * 实现文件上传到OSS
     * @param multipartFile 在服务端来接收到上传的文件
     * @return 返回图片访问的URL
     * @throws IOException
     */
    public String upload(MultipartFile multipartFile) throws IOException {
        // 获取阿里云OSS参数
        String endpoint = aliyunOSSProperties.getEndpoint();
        String accessKeyId = aliyunOSSProperties.getAccessKeyId();
        String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();
        String bucketName = aliyunOSSProperties.getBucketName();

        /** 构造唯一的文件对象名称:UUID + 文件扩展名 */
        String objectName = UUID.randomUUID().toString() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, multipartFile.getInputStream());
            // 上传文件到OSS
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } finally {
            if (ossClient != null) {
                // 关闭ossClient
                ossClient.shutdown();
            }
        }
        // 返回文件访问路径
        return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;
    }
}

重新启动项目: 

总结:

  • 通过@ConfigurationProperties注解就可以自动的将配置文件当中的配置项自动的注入到bean对象的属性当中来。 

在我们添加上注解后,会发现IDEA窗口上面出现一个红色警告:

 

这个警告提示是告知我们还需要引入一个依赖:  

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

当我们在pom.xml文件当中配置了这项依赖之后,我们重新启动服务,大家就会看到在properties或者是yml配置文件当中,就会提示阿里云 OSS 相关的配置项。所以这项依赖它的作用就是会自动的识别被@ConfigurationProperties注解标识的bean对象,然后在配置文件当中配置的时候就会自动的提示与这个bean对象的属性名相对应的配置项的名字。

注意:刚才的红色警告,已经变成了一个灰色的提示,提示我们需要重新运行SpringBoot服务  

 

4.5 @ConfigurationProperties 与 @Value 

相同点:都是用来注入外部配置的属性的。

不同点:

  • @Value注解只能一个一个进行外部属性的注入

  • @ConfigurationProperties注解可以批量的将外部的属性配置注入到bean对象的属性中

  • 如果要注入的属性非常的多,并且还想做到复用,就可以定义这么一个bean对象,通过 @ConfigurationProperties 批量的将外部的属性配置直接注入到bean对象的属性当中
  • 在其他的类当中,我要想获取到注入进来的属性,我直接注入bean对象,然后调用 get 方法,就可以获取到对应的属性值了。

总结: 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于RUM高效治理网站用户体验入门-价值篇

用户体验 用户体验基本包含访问网站的性能、可用性和正确性。通俗的讲&#xff0c;就是一把通过用户访问测量【设计者】意图的尺子。 本文目的 网站如何传递出设计者的意图&#xff0c;可能页面加载时间太长、或者页面在用户的浏览器中渲染时间太慢&#xff0c;或者第三方设备…

ssm+vue医院医患管理系统源码和论文

ssmvue医院医患管理系统源码和论文077 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm vue.js 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已…

网络编程套接字(3): 简单的TCP网络程序

文章目录 网络编程套接字(3)4. 简单的TCP网络程序4.1 服务端创建(1) 创建套接字(2) 绑定端口(3) 监听(4) 获取新连接(5) 处理读取与写入 4.2 客户端创建(1)连接服务器 4.3 代码编写(1) v1__简单发送消息(2) v2_多进程版本(3) v3_多线程版本(4) v4_线程池版本 网络编程套接字(3)…

华为数通方向HCIP-DataCom H12-821题库(单选题:141-160)

第141题 Router-LSA 能够描述不同的链路类型&#xff0c;不属于Router LSA 链路类型的是以下哪一项? A、Link Type 可以用来描述到末梢网络的连接&#xff0c;即 SubNet B、Link Type 可以用来描述到中转网络的连接&#xff0c;即 TranNet C、Link Type 可以用来描述到另一…

mac软件安装后打开软件显示损坏

#mac传输安装包后安装后打开软件显示损坏处理方式 以postman为例&#xff0c;输入前面的代码&#xff0c;打开访达&#xff0c;把有问题的软件拉到命令行窗口&#xff0c;确认即可 sudo xattr -r -d com.apple.quarantine /Applications/Postman.app sudo xattr -r -d com.ap…

C语言的发展及特点

1. C语言的发展历程 C语言作为计算机编程领域的重要里程碑&#xff0c;其发展历程承载着无数开发者的智慧和创新。C语言诞生于20世纪70年代初&#xff0c;由计算机科学家Dennis Ritchie在贝尔实验室首次推出。当时&#xff0c;Ritchie的目标是为Unix操作系统开发一门能够更方便…

基于Java+SpringBoot+Vue前后端分离社区医院管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

JavaScript—BOM

BOM是什么&#xff1f; Browser Object Model是浏览器对象模型 官方&#xff1a;浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构&#xff0c;BOM由多个对象构成&#xff0c;其中代表浏览器窗口的window对象是BOM的顶层对象&#xff0c;其他对象都是该…

HHDESK一键改密功能

HHDESK新增实用功能——使用SSH连接&#xff0c;对服务器/端口进行密码修改。 1 测试 首页点击资源管理——客户端&#xff0c;选择需要修改的连接&#xff1b; 可以先对服务器及端口进行测试&#xff0c;看是否畅通&#xff1b; 右键——测试——ping&#xff1b; 以及右…

【Prometheus】概述及部署

目录 Prometheus 概述 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 部署 Prometheus Prometheust Server 端安装和相关配置 部署 Exporters 监控 MySQL 配置示例 监控 Nginx 配置示例 部署 Grafana 进行展示 部署 Pro…

Git仓库简介

1、工作区、暂存区、仓库 工作区&#xff1a;电脑里能看到的目录。 暂存区&#xff1a;工作区有一个隐藏目录.git&#xff0c;是Git的版本库&#xff0c;Git的版本库里存了很多东西&#xff0c;其中最重要的就是称为stage&#xff08;或者叫index&#xff09;的暂存区&#xf…

javacv基础02-调用本机摄像头并预览摄像头图像画面视频

引入架包&#xff1a; <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.5.5-1</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId…

计算机网络MTU和MSS的区别

在计算机网络中&#xff0c;MTU代表最大传输单元&#xff08;Maximum Transmission Unit&#xff09;&#xff0c;而MSS代表最大分节大小&#xff08;Maximum Segment Size&#xff09;。 1.MTU&#xff08;最大传输单元&#xff09;&#xff1a; MTU是指在网络通信中&#x…

数据库——Redis 常见数据结构以及使用场景分析

文章目录 1. string2. list3. hash4. set5. sorted set 你可以自己本机安装 redis 或者通过 redis 官网提供的在线 redis 环境。 1. string 介绍 &#xff1a;string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的&#xff0c;但是 Redis 并没有使用 C 的字符串…

【Java架构-版本控制】-Git基础

本文摘要 Git作为版本控制工具&#xff0c;使用非常广泛&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Git基础、Git进阶、Gitlab搭那家&#xff09;来深入学习Git 文章目录 本文摘要1.Git仓库基本概念1.1 远程仓库(Remote)1.2 本地库(Repository) 2. Git仓库…

postman接口自动化测试框架实战!

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用…

公网远程访问局域网SQL Server数据库

文章目录 1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据库的重要性相信大家都有所了解&…

Jackpack - Hilt

一、概念 类中使用的某个对象不是在这个类中实例化的&#xff08;如Activity无法手动实例化使用&#xff09;&#xff0c;而是通过外部注入&#xff08;从外部传入对象后使用&#xff09;&#xff0c;这种实现方式就称为依赖注入 Dependency Injection&#xff08;简称DI&#…

JVM 垃圾收集

垃圾收集 分代理论Java 堆的内存分区不同分代收集垃圾收集算法 分代理论 弱分代假说&#xff1a;绝大多数对象都是朝生夕灭&#xff0c;即绝大多数对象都是用完很快需要销毁的。强分代假说&#xff1a;熬过多次垃圾收集过程的对象就越难以消亡&#xff0c;即如果对象经过多次垃…

uniapp热更新

首先热更新需要wgt包&#xff1b; 其次先了解这两个组件 下载的方法 安装的组件 场景&#xff1a; 当你项目的js文件或者页面文件或者静态图片文件css文件更新的时候可以走热更新&#xff1b; 而当你安装新的组件插件或者开启新的权限等功能的时候就无法通过热更新进行更新了…