Spring Boot相关概念、创建与运行

news2024/11/13 23:39:32

文章目录

  • 一、Spring Boot的创建与使用
    • (一)为什么要学习 Spring Boot?
    • (二)Spring Boot的优势
    • (三)Spring Boot的创建
      • 1. 安装插件
      • 2. 创建项目
      • 3. 配置国内源
      • 4. 删除无效目录
    • (四)项目目录介绍和运行
      • 1. 启动 Spring Boot
      • 2. 输出 Hello World
    • (五)注意事项
      • 1. 正确的包路径
      • 2. 五大注解URL的区别
      • 注意:约定大于配置
  • 二、配置文件
    • (一)配置文件作用
    • (二)配置文件的格式
    • (三)properties 配置文件说明
      • 1. 为 properties 配置文件安装提示插件
      • 2. properties 基本语法
      • 3. 读取配置文件
      • 4. properties 缺点分析
    • (四)yml 配置文件说明
      • 1. yml 基本语法
      • 2. yml 进阶用法
        • (1)yml 配置不同数据类型及 null
        • (2)yml配置读取
        • (3)注意事项:value 值加单双引号
      • 3. 配置对象
      • 4. 配置集合
    • (五)properties VS yml
  • 三、日志文件
    • (一)日志的作用
    • (二)日志打印
      • 1. 项目自动打印的日志
      • 2. 自定义日志打印
      • 3. 日志格式
    • (三)日志级别
      • 1. 作用
      • 2. 分类与使用
    • (四)日志持久化
    • (五)更简单的日志输出——lombok
      • 0. 添加插件
      • 1. 引入依赖 lombok
      • 2. 使用 @Slf4j 注解
      • 3. lombok 原理解释
      • 4. lombok 更多注解说明

一、Spring Boot的创建与使用

(一)为什么要学习 Spring Boot?

  Spring 是为了简化 Java 开发而诞生的,SpringBoot 是为了简化 Spring 程序开发的

(二)Spring Boot的优势

  1. 快速集成框架,Spring Boot提供了启动添加依赖的功能,用于秒级集成各种框架
  2. 内置运行容器,无需配置 Tomcat 等 Web 容器,直接运行和部署程序
  3. 快速部署项目,无需外部容器即可启动并运行项目
  4. 可以完全抛弃繁琐的 XML,使用注解和配置的方式进行开发
  5. ⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况

(三)Spring Boot的创建

  Spring Boot可以使用 IDEA 来创建,也可以使用 Spring 官方提供的网页版来创建,在这里只介绍使用 IDEA 创建的Spring Boot 的方式

1. 安装插件

  由于作者使用的是 IDEA 社区版,因此先要安装 Spring Assistant 插件,才能创建 Spring Boot 项目,如下图:
Spring Assistant插件
  注意:IDEA2022版本的可能没有这个插件,作者也是又下载了一个2020.3版本的才安装上插件(幸好一台电脑能装多个IDEA)

2. 创建项目

  1. 在我们装好插件之后,New Project 页面上就会出现 Spring Assistant,选中。Spring Boot2支持的最低 JDK 版本是Java8,但是Spring Boot3支持的最低 JDK 版本是Java17,大家可以看自己的环境进行配置,点击下一步
    New Project
  2. 确定创建项目需要的各种环境
    确定创建项目需要的各种环境
  3. 确定项目版本和需要的各种框架支持
    选择项目版本与导入框架
    需要的框架
    (1)Developer Tools:Spring Booot DevTools(开发阶段需要用到的工具包)
    (2)Developer Tools:Lombok
    (3)Web:Spring Web(为了支持 HTTP 协议)
  4. 确定项目名称和保存的文件路径,最后点击finish
    确定项目名称与保存路径
  5. 打开项目后,需要对项目进行加载
    加载完成前
    加载完成前
    加载完成后
    加载完成后

  如果在加载完成之后有的地方报红,那么下面的操作就需要重点关注

3. 配置国内源

  这么做的目的是为了快速创建 Spring Boot 项目,不用每次都去访问国外官网的源

  1. 先将当前项目的源设置为国内源
    注意下面的两个文件,以及两个文件后面都需要打√
    当前项目配置国内源
    第一个 settings.xml 需要做如下配置
    settings.xml
    第二个文件夹中的文件会在我们进行加载时自动下载,如果加载完之后发现还有报错,那么删除该文件夹下的全部文件,并点击 Maven 中的刷新进行重新加载,如下图:
    Maven刷新

  2. 将以后创建的新项目的源也设置为国内源
    新项目配置路径
    新项目配置

4. 删除无效目录

  1. .mvn文件,该文件的作用是让我们通过命令行对maven项目进行打包等等操作,但是我们已经集成了插件,因此不需要这么麻烦了
  2. HELP.md文件,该文件就是项目的帮助文档
  3. mvnw文件以及mvnw.cmd文件,与maven有关的文件,都可以删除掉

(四)项目目录介绍和运行

  经过上述操作,我们就得到了 Spring Boot 的项目目录,如下图:
Spring Boot项目目录
Spring Boot项目有两个主要的目录:

  • src/main/java 为 Java 源代码
  • src/main/resources 为静态资源或配置文件
    • /static:静态资源文件夹(包括html/js/css/img等等)
    • /templates:模板资源文件夹(通用资源,比如通用的css文件/js文件等等)
    • /application.properties:配置文件
  • src/test/java 为 Java 单元测试文件
  • target 为经过编译后的可执行 .class 文件
  • .gitignore:git的忽略文件,里面存放了不提交的文件有哪些
  • pom.xml:Maven项目必须要有的文件,Spring Boot不是必须要有的

1. 启动 Spring Boot

运行项目1
运行项目2

2. 输出 Hello World

  我们学习 Spring Boot 是为了更方便的实现 Web 项目的,因此接下来我们就要用 Spring Boot 来实现和浏览器及用户的交互,实现代码及路径如下
编写服务器代码
运行结果
运行结果

(五)注意事项

1. 正确的包路径

正确路径:我们只有把要注入的容器类(包)和启动类放到同一级目录下时,Spring Boot 项目才能正常的将 bean 注入到容器中,如上面的输出 Hello World 示例以及下方的示例:
容器类正确路径

2. 五大注解URL的区别

  Spring Boot 对于五大注解也做了特殊的约定,由于 @Controller 就是我们规定的控制器类,因此 Spring Boot 官方设定被 @Controller 修饰的类不需要在类上加 @RequestMapping,只需要对方法修饰 @RequestMapping 即可,此时方法上的路径就是一级路径,也可以给类上加 @RequestMapping,那么类上的就是一级路由,方法上就是二级路由
  其他注解不是控制器注解,所以如果也想要通过浏览器访问,那么就必须既在类上添加 @RequestMapping,也在方法上添加 @RequestMapping,通过二级路由才能访问到具体的方法,不过为了项目规范,不建议这样做

注意:约定大于配置

  我们注意到,我们在运行项目前,并没有对 Spring Boot 项目进行什么配置,比如在 Spring 中配置 Bean 的扫描路径。但是仍然可以运行,因为 Spring Boot 不需要,官方已经约定好了,用户创建了容器类之后必须放到和启动类同级目录或者同级目录的包下面,等到运行时,Spring Boot 自然会对那些类进行扫描,但是当我们把容器类放到其他目录下时,就无法被框架识别。因此我们说,Spring Boot 配置比较少,就是因为 Spring Boot 的设计思想是:约定大于配置

二、配置文件

(一)配置文件作用

整个项目中所有重要的数据都是在配置文件中配置的,比如:

  • 数据库的连接信息(包含用户名和密码的设置)
  • 项目的启动端口
  • 第三方系统的调用密钥等信息
  • 用于发现和定位问题的普通日志和异常日志等
    配置文件包括两类,一种是系统的配置文件,比如连接字符串、日志的相关设置,这是系统定义好的;另一种就是用户自定义的配置文件

(二)配置文件的格式

Spring Boot 的配置文件主要分为以下两种格式:

  • *.properties
  • *.yml
    如下图所示:
    配置文件的格式

  上述两种格式的作用一样,只不过是两种时期的产物,.properties是创建 Spring Boot 项目时默认的文件格式,而 .yml 则需要自己创建

说明:

  1. 理论上两种文件可以同时存在在同一个 Spring Boot 项目中,此时如果配置文件中出现了同样的配置,那么就会以 properties 中的配置为主,就是说properties 配置文件的优先级最高,但加载完 .properties 文件之后,也会加载 .yml 文件的配置信息
  2. 虽然理论上两种文件可以共存,但是我们在实际使用时,我们会采用统一的配置文件格式,这样可以更好的维护
  3. Spring Boot 由于约定大于配置的特点,因此只有application.properties文件可以被识别,其他名字的properties文件都没用

(三)properties 配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件

1. 为 properties 配置文件安装提示插件

  properties 配置文件默认情况下配置时不会有提示信息,对我们不太友好,因此我们可以安装一个插件来辅助我们编写配置文件代码
properties提示插件

2. properties 基本语法

  properties 是以键值对的形式配置的, key 和 value 之间是以"="连接的,注意:不能加空格,包括键值对的前后,中间,如:

# 系统的配置文件
# 服务器端口
server.port=9090
# 数据库连接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false
spring.datasource.name=root
spring.datasource.password=xxx

# 自定义配置项,举例
qq.test=xxx

  properties如果不经过配置可能会出现乱码,因为它是早期的配置文件,默认编码格式不是 utf8,接下来我们对它进行配置一下

  1. 给当前项目处理中文乱码问题
    设置当前项目编码方式
  2. 给以后的项目处理中文乱码问题
    设置以后项目的编码方式
  3. 注意:设置完之后可能当前文件仍然是中文乱码,接下来我们需要做的就是删除 application.properties 文件,重新创建一个就可以正常使用了

3. 读取配置文件

  在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用”${}“的格式读取,如下代码所示:

@Controller
public class UserController {
    // 获取配置文件中的端口号
    @Value("${server.port}")
    private Integer port;
    
    @ResponseBody // 告诉服务器返回一个非静态页面的数据
    @RequestMapping("/hello") //设置路由地址,路由地址尽量不要大写混小写
    public String hello() {
        return "Hello World! port: " + port;
    }
}

运行结果:
获取端口结果

4. properties 缺点分析

  properties 配置是以 key-value 的形式配置的,从下面的配置 key 就能看出,properties 配置文件中会有很多的冗余的信息,想要解决这个问题,就可以使用 yml 配置文件的格式化了
配置文件信息冗余

(四)yml 配置文件说明

  yml是 YAML 的缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另一种标记语言”
yml优点分析:

  • yml 是一个可读性高,写法简单、易于理解的标记语言,它的语法和 JSON 语言类似
  • yml 支持更多的数据类型,它可以简单表达数组、散列表、标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合同来表达或编辑数据结构、各种配置文件等
  • yml 支持更多的编程语言,它不止是 Java 中可以使用,在 Golang、PHP、Python等等中同样可以

1. yml 基本语法

  yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒号加空格的方式组成,其中的空格不可省略,基础语法如下:
yml文件语法

使用 yml 连接数据库

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false
    name: root
    password: 000000

2. yml 进阶用法

(1)yml 配置不同数据类型及 null

# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value: true
boolean.value1: false

# 整数
int.value: 10
int.value1: 0000_0000_0000_0000_0000_0000_0000_1010 # 二进制

# 浮点数
float.value: 3.14
float.value1: 314e-2 # 科学计数法

# NULL,~表示null
null.value: ~

(2)yml配置读取

yml 读取配置的方式和 properties 相同,使用 @Value 注解即可

(3)注意事项:value 值加单双引号

规则:

  1. 字符串默认不⽤加上单引号或者双引号
  2. 单引号会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据
  3. 双引号不会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思

示例:

# yml文件配置
string:
  str1: hello \n world
  str2: 'hello \n world'
  str3: "hello \n world"
// 测试
@Controller
public class UserController {
    @Value("${string.str1}")
    private String str1;

    @Value("${string.str2}")
    private String str2;

    @Value("${string.str3}")
    private String str3;

    @ResponseBody // 告诉服务器返回一个非静态页面的数据
    @RequestMapping("/hello") //设置路由地址,路由地址尽量不要大写混小写
    public String hello() {
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "Hello World! port: " + port;
    }
}

结果:
value形式注意3

3. 配置对象

  我们除了上述的功能之外,还可以在 yml 中配置对象,如下配置:

student:
  id: 1
  name: zhangsan
  age: 12

或者行内写法:

student1: {id: 2, name: lisi, age: 18}

此时就不能用 @Value 来读取配置中的对象,要使用另一个注解 @ConfigurationProperties 来读取,具体实现如下:
配置对象创建新类
配置对象的注入
  注意,在上述代码中,@Data是不可省略的,因为 @ConfigurationProperties 需要通过 set 和 get 方法将配置文件中的属性一一匹配并注入到对应的 Bean 属性上,然后在其他地方进行读取

4. 配置集合

配置文件也可以配置 list 集合,也有两种写法,如下所示:

# 配置文件名
dbtypes:
  # 配置文件名中的集合名
  name:
    # 集合中的内容
    - mysql
    - server
    - db

dbtypes2: {name: [mysql, server, db1]}

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取,具体实现如下:

@Data
@ConfigurationProperties("dbtypes")
@Component
public class ListConfig {
    private List<String> name;
}

打印类的实现

@Controller
public class UserController {
    @Autowired
    private ListConfig listConfig;

    @ResponseBody // 告诉服务器返回一个非静态页面的数据
    @RequestMapping("/hello") //设置路由地址,路由地址尽量不要大写混小写
    public String hello() {
        return "ListConfig : " + listConfig.getName();
    }
}

运行结果:
配置集合运行结果

(五)properties VS yml

  1. properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤" : "英⽂冒号加空格的⽅式设置,并且空格不可省略
  2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的解决数据冗余的问题
  3. yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置⽂件作为 Java 和 Go 的共同配置⽂件
  4. yml ⽀持更多的数据类型

  要说明的是,Spring Boot 读取配置文件的方法一共有五种,这里只是介绍了其中的两种,要想了解的更多,可以参考这篇文章:https://juejin.cn/post/7132641888166739982

三、日志文件

(一)日志的作用

  日志也是我们程序的重要组成部分,无论是调试代码,查看修改记录等等操作,查看日志都是一个很好的定位和排除问题的途径
  除了发现和定位问题,我们还可以通过日志实现以下功能:

  1. 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户
  2. 记录系统的操作日志,方便数据恢复和定位操作人
  3. 记录程序的执行时间,方便为以后优化程序提供数据支持

(二)日志打印

1. 项目自动打印的日志

  Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
项目自动日志打印
  通过上述日志信息我们能发现三个问题:

  1. Spring Boot 内置了日志框架
  2. 默认情况下,输出的日志不是开发者定义和打印的
  3. 日志默认是打印在控制台上,但控制台上的日志不能被保存

2. 自定义日志打印

开发者自定义打印日志的实现步骤:

  • 在程序中得到日志对象
    在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory(日志框架),如下代码所示:
@Controller
@ResponseBody
public class LoggerController {
    // 1. 获取日志对象(来自 slf4j)
    private final static Logger log =
            LoggerFactory.getLogger(LoggerController.class);
}

  注意:Logger 对象是属于 org.slf4j 包下的,不要导错包。日志工厂需要将每个类的类型传递进去,这样我们才知道⽇志的归属类,才能更⽅便、更直观的定位到问题类
  Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 Slf4j 来输出日志,Slf4j 和 JDBC 类似,我们并不是直接控制工具,而是通过框架来控制工具,至于底层工具是什么,我们并不关心,这样的结果就是如果当前工具不好用了,我们可以很容易的就换一个工具
Slf4j

  • 使用日志对象的相关语法输出要打印的内容
@Controller
@ResponseBody
public class LoggerController {

    // 1. 获取日志对象(来自 slf4j)
    private final static Logger log =
            LoggerFactory.getLogger(LoggerController.class);

    @RequestMapping("/logger")
    public void logger() {
        // 2. 使用日志对象提供的打印方法进行日志打印
        // 从上到下日志级别逐渐提高
        log.trace("trace 方法");
        log.debug("debug 方法");
        log.info("info 方法");
        log.warn("warn 方法");
        log.error("error 方法");
    }
}

运行结果:
自定义日志打印
关于为什么我们写了五条日志语句结果只打印了三条的原因将在下面说明

3. 日志格式

日志结构

(三)日志级别

1. 作用

  • ⽇志级别可以帮助我们筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者信息筛选的时间
  • ⽇志级别可以控制不同环境下,⼀个程序是否需要打印⽇志,如开发环境我们需要很详细的信息,⽽⽣产环境为了保证性能和安全性就会输⼊尽量少的⽇志,⽽通过⽇志的级别就可以实现此需求

2. 分类与使用

日志级别分为:

  1. trace:微量的意思,级别最低;
  2. debug:需要调试时候的关键信息打印;
  3. info:普通的打印信息(默认日志级别);
  4. warn:警告,不影响使用,但需要注意的问题;
  5. error:错误信息,级别较高的错误日志信息
  6. fatal:致命,因为代码异常导致程序退出执行的事件(这个级别用户无法自定义,只能系统输出)

日志级别设置
日志级别配置只需要在配置文件中设置“logging.level”配置项即可,如下所示:

logging:
  level:
    # 设置全局默认的日志级别
    root: info

运行结果:
error日志打印
由上述日志打印可知,越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的⽇志了,又由我们上面日志打印示例可知,日志的输出级别,默认是info

局部文件设置日志级别

logging:
  level:
    # 设置全局默认的日志级别
    root: info
    # 设置局部文件夹的日志级别,从java文件夹的下一级别开始算起
    # 精确到文件夹级别
    com.example.demo.controller: trace

运行结果:
error日志打印
局部日志级别优先级 > 全局日志级别

(四)日志持久化

  以上的日志输出都是在控制台输出,无法长久保存,然而在生产环境上我们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化
  想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,
Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下
配置日志文件的保存路径:

# 设置日志的保存目录
logging:
  file:
    # 注意,由于windows系统地址使用的是反斜杠,地址可能会出现\d或者\D等转义字符
    # 在这种情况下,spring boot 无法正确识别保存路径,日志无法正确保存
    # 因此我们可以采用下面几种方式避免问题
    # 1. 按照 linux 的地址形式,使用斜杠(推荐,以后 linux 系统上部署起来也方便)
    # 2. 使用两个反斜杠进行转义
    path: D:\study\loggingData

运行结果
持久化日志保存

配置日志文件的文件名:

logging:
  file:
    # 设置日志的保存文件名,这里写成 linux 的格式
    name: D:/study/loggingData/spring-boot.log

运行结果:
持久化日志保存2

关于上述持久化日志保存会出现几个问题:

  1. 如果我们重启服务器,文件中的日志是否会重新写入,将之前的日志覆盖掉
    解答:通过下方文件日志记录表示,可以看出,重启服务器时并不会将之前的日志进行覆盖,而是接着往下写
    持久化日志保存3
  2. 如果我们的日志内容很多并且不进行处理的话,随着时间的推移,这个日志文件将会非常非常大,我们打开文件也要等很长时间
    解答:由下图可知,Spring Boot 一个日志文件默认最大容量是10MB,而如果超过最大容量,之后就会创建一个新的文件并在后面加上编号
    持久化日志存储默认大小
  3. 最长保存时间,保存格式等等一系列的操作我们都可以通过配置来手动设置

练习题:
  将 controller 包下 error 级别以上的⽇志保存到 log_all.log 下,将 service 下 warn 级别以上的⽇志保存到 log_all.log 下
代码示例:

logging:
  level:
    com.example.demo.controller: error
    com.example.demo.service: warn
  file:
    name: D:/study/loggingData/log_all.log

运行结果
日志练习题

(五)更简单的日志输出——lombok

  每次都使⽤ LoggerFactory.getLogger(xxx.class) 且每个类都添加⼀遍,很麻烦,还有⼀种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出

  1. 添加 lombok 框架支持
  2. 添加 @slf4j 注解输出日志

0. 添加插件

  这步属于前置工作,需要安装 EditsStarters 插件,该插件是为了让我们在已经创建完项目之后,如果想要再给项目添加框架提供帮助的,添加步骤仍然是在file目录下 Settings 中,选择 Plugins
EditStarters插件

1. 引入依赖 lombok

  这步是针对我们在创建项目时没有引入插件,此时还想引入时,就需要我们在 pom.xml 文件中借助 EditStarters 插件来引入

  1. 在 pom.xml 文件中选中 Generate
    Generate
  2. 选中 Edit Starters
    Edit Starters
  3. 就会进入我们熟悉的 Spring Boot 引入框架界面,选择搜索 lombok,进行添加,最后注意一定要点OK
    引入lombok

2. 使用 @Slf4j 注解

如下示例:

@Controller
@ResponseBody
@Slf4j
public class LoggerController {

    // 1. 获取日志对象(来自 slf4j)
//    private final static Logger log =
//            LoggerFactory.getLogger(LoggerController.class);

    @RequestMapping("/logger")
    public void logger() {
        // 2. 使用日志对象提供的打印方法进行日志打印
        // 从上到下日志级别逐渐提高
        log.trace("trace 方法");
        log.debug("debug 方法");
        // 等于 info 或者高于 info 的日志等级可以打印
        log.info("info 方法"); 
        log.warn("warn 方法");
        log.error("error 方法");
    }
}

注意:加入注解后,日志对象名是 log,这里也体现了约定大于配置的特点

3. lombok 原理解释

  根据java文件经过编译后生成的class文件,我们就可以明白 lombok 的原理
lombok原理1
lombok原理2
  由上图可知,lombok 利用的就是 java 文件编译成 class 文件的间隙,不用我们再手写,而是它替我们写出来,实际实现效果和我们自己创建对象一模一样

4. lombok 更多注解说明

基本注解

注解说明
@Getter自动添加 getter 方法
@Setter自动添加 setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序
@NonNull属性不能为null
@RequiredArgsConstructor自动添加必需属性的构造方法,final + @NonNull 的属性为必须

组合注解

注解说明
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor
@Slf4j添加一个名为 log 的日志对象

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

祝大家劳动节快乐

文章目录 为我的笔记整理了一个小目录 Python基础 Python基础——0.Python环境的安装 Python基础——1.变量和简单数据类型 Python基础——2.列表简介 Python基础——3.操作列表 Python基础——4.if语句 Python基础——5.字典 Python基础——6.用户输入和while循环 Python基…

【王道·计算机网络】第二章 物理层【未完】

一、通信基础 1. 基本概念 1.1 物理层接口特性 物理层解决如何在连接各种计算机的传输媒体上传输比特流&#xff0c;不指定具体的传输媒体主要任务&#xff1a;确定与传输媒体接口有关的一些特性 → 定义标准接口特性&#xff1a; 机械特性&#xff1a;定义物理连接的特性&a…

十分钟点亮iCLed35

文章目录 前言iCLed35整体介绍iCLed概念iCLed系列产品优势iCLed35(6pin)的特性&#xff1a; iCLed35(6pin)的硬件设计iCLed35(6pin)的软件配置通讯时序&#xff1a;通讯协议介绍&#xff1a;整体的数据结构&#xff1a;睡眠模式&#xff1a; 点亮iCLed35(6pin)S32K144EVB配置驱…

linux入门---软硬链接

软链接 使用指令ln -s 被链接的文件 生成的软链接文件 便可以创建软连接文件&#xff0c;ln是link的简写表明当前要创建链接文件&#xff0c;s是soft的简写表明当前创建的链接文件为软链接文件&#xff0c;然后加上被链接的文件&#xff0c;最后写上生成的链接文件的文件名比如…

【谷粒商城之服务认证OAuth2.0】

本笔记内容为尚硅谷谷粒商城服务认证OAuth2.0部分 目录 一、OAuth 2.0 二、微博登录测试 1、微博登陆准备工作 2、获取微博Access Token 3、登录测试 1.添加HttpUtils工具类 2.controller 3.service 4.vo 总结 一、OAuth 2.0 OAuth&#xff1a; OAuth&#xff08;开…

【账号激活】

由于注册时会遇到诸多错误提示&#xff01;所以出此详细教程。 重点是要巧妙的运用无痕浏览窗口。 步骤分为两步&#xff0c;sign up 激活邮箱以及 log in 短信验证码验证。 右上角新建无痕浏览窗口。新建完后记得关闭此有痕浏览窗口。 成功创建。完成第一步。 若要连续操作切记…

双极性信号、正交信号和PAM信号通信系统matlab程序+仿真

资源地址&#xff1a; 双极性信号、正交信号和PAM信号通信系统MATLAB程序仿真资源-CSDN文库 部分程序及仿真图&#xff1a; clear all EbN00:10; %SNR的范围 for ii1:length(EbN0) SNREbN0(ii); %赋值给AWGN信道模块中的SNR sim(ex5); %运行仿…

【Java笔试强训 24】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;年终奖 …

一般对称性和轮换对称性

一般对称性 一元函数的对称性 几何意义是所围图形的面积绝对值 【注】使用对称性的时候&#xff0c;首先抓积分区域关于哪个轴对称&#xff0c;其次抓被积函数是为另一轴的奇&#xff08;偶函数&#xff09;。 二元函数的对称性(奇偶性) 【注】在一般对称性中&#xff0c;(x…

MCU固件升级系列1(STM32)

本系列将从升级流程、boot代码编写、APP代码编写以及固件打包来介绍&#xff0c;硬件选用STM32F407ZGT6&#xff08;手里只有&#xff09;&#xff0c;来完成这系列教程。 前言 为什么需要固件升级: 功能更新&#xff1a;随着产品的迭代和用户需求的变化&#xff0c;可能需要…

【DM】达梦数据库与MySQL适配

一、达梦入门技术文档 新手直接看达梦入门技术文档即可 二、达梦数据库 1、介绍 达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统&#xff0c;简称DM&#xff0c;它具有如下特点&#xff1a;通用性、高性能、高可用、跨平台、高可扩展 2、与…

网络安全:windows批处理写病毒的一些基本命令.

网络安全&#xff1a;windows批处理一些命令. echo off一般都写在批处理的最上面&#xff0c;用于关闭回显&#xff0c;意思是 关闭回显&#xff1a; 没有关闭回显: 所以&#xff0c;意思就是将输入指令的过程隐藏起来。 set是设置的意思&#xff0c;作业是打印、创建和修改变…

【算法】求最短路径算法

文章目录 一、迪杰斯特拉算法1.1 算法介绍1.2 算法步骤1.3 应用场景 二、弗洛伊德算法2.1 算法介绍2.2 算法步骤2.3 应用场景 一、迪杰斯特拉算法 1.1 算法介绍 从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中&#xff0c;各边上权值之和最小的一条路径叫做最短…

Hausdorff distance

Hausdorff距离量度度量空间中紧子集之间的距离 定义 设 X X X和 Y Y Y是度量空间 M M M的两个紧子集 d H ( X , Y ) max ⁡ { sup ⁡ x ∈ X inf ⁡ y ∈ Y d ( x , y ) , sup ⁡ y ∈ Y inf ⁡ x ∈ X d ( x , y ) } d_H\left(X, Y\right) \max \left\{\sup_{x\in X} \in…

Linux — 多线程的互斥与同步,信号量

1.线程互斥 进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区…

利用粒子群算法设计无线传感器网络中的最优安全路由模型(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 无线传感器网络&#xff08;WSN&#xff09;由数十个、数百个甚至数千个自主传感器组成。这些传感器以无线方式嵌入环境中&…

Day49 5.01 C++刷题

Go不是解释型语言&#xff0c;是编译型语言 Java是混合型语言

MOSFET正向导通,阻断,阈值电压研究

一 设计要求&#xff1a; N-为均匀掺杂、其他均为离子注入所形成的高斯掺杂&#xff1b;P的宽度为10、结深6um&#xff1b;氧化层oxide厚度为0.1um,宽度为10um&#xff1b;氧化层左侧空白需要定义为材料air&#xff1b;所有电极都定义为无厚度&#xff1b;所有的高斯掺杂峰值点…

( 数组和矩阵) 485. 最大连续 1 的个数 ——【Leetcode每日一题】

❓485. 最大连续 1 的个数 难度&#xff1a;简单 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大…

Vision Transformer架构Pytorch逐行实现

前言 代码来自哔哩哔哩博主deep_thoughts&#xff0c;视频地址&#xff0c;该博主对深度学习框架方面讲的非常详细&#xff0c;推荐大家也去看看原视频&#xff0c;不管是否已经非常熟练&#xff0c;我相信都能有很大收获。论文An Image is Worth 16x16 Words: Transformers f…