【Java】Spring Boot的创建和使用,以及配置文件(.properties和.yml)和日志文件(LoggerFactory和lombok)

news2024/11/19 22:43:10

  • 什么是Spring Boot
  • Spring Boot的优点
  • 创建Spring Boot项目
  • Spring Boot的配置文件
    • 配置文件的作用
    • 配置文件的格式
    • properties 配置文件说明
      • properties的基本语法
      • 读取配置文件
      • properties的缺点
    • yml 配置文件说明
      • 基本语法
      • yml 连接数据库
      • 读取配置文件
      • yml进阶
        • yml 配置不同数据类型及 null
        • value 值加单双引号
        • 配置对象
        • 配置集合和map
        • 设置banner
      • 多平台配置文件的设置
      • yml的优点
  • Spring Boot的日志文件
    • 自定义日志
      • 获取日志对象
        • 日志框架
      • 打印内容
    • 日志级别
      • 设置日志级别
      • 分目录设置日志级别
    • 日志的持久化
    • lombok日志输出
      • 添加lombok依赖
      • 使用@Slf4j输出日志
      • lombok原理
      • lombok的注解

什么是Spring Boot

Spring 为了简化 Java 程序,而Spring Boot为了简化 Spring 程序。

Spring Boot的优点

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

创建Spring Boot项目

安装 Spring Boot Helper 插件。安装好之后,它的名字就变成了 Spring Initializr and Assistant。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring Boot项目的目录:
在这里插入图片描述
在这里插入图片描述
运行SpringBoot项目

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,SpringBoot";
    }
}

在这里插入图片描述

注意:把bean交给Spring Boot管理需要配置扫描路径,SpringBoot有默认的扫描路径,就是当前启动类的路径,即就是com.examle.demo及其子路径。这就是Spring Boot的约定大于配置
在这里插入图片描述

Spring Boot的配置文件

我们知道Servlet项目是通过Content path来区分项目的,而在Spring项目中,则是通过端口号来区分项目,如果tomcat下部署了多个项目,分别使用不同的端口号来启动不同的项目。对于Spring项目而言,tomcat内嵌到Spring项目中,一个tomcat进归一个Spring项目,而一个服务器可以通过启动多个tomcat来部署多个项目。那端口号在哪里设置呢?就是在配置文件中。
比如,将上面示例中的端口号从8080改为9090:
在这里插入图片描述

配置文件的作用

整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:

  • 数据库的连接信息(包含⽤户名和密码的设置);
  • 项⽬的启动端⼝;
  • 第三方系统的调⽤秘钥等信息;
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等。

想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以用于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的。

配置文件的格式

Spring Boot 配置⽂件主要有以下两种:

  • application.properties
  • application.yml
    在这里插入图片描述

理论上properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在⼀个项目中时,如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了“server.port”,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最⾼,但加载完 .properties 文件之后,也会加载 .yml ⽂件的配置信息
虽然理论上 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置文件格式,这样可以更好的维护(降低故障率)。这就好像连锁店的服饰⼀样,不管是⽼款的服装还是新款的服装,⼀定要统⼀了才好看。

properties 配置文件说明

properties的基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的。其中Key是一个字符串,多个单词用 . 分隔。如:

#服务端口号
server.port=9090
#数据库配置信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

读取配置文件

Spring Boot的的配置文件中有Spring的相关配置,还有自定义配置。如果在项目中想要主动的读取配置⽂件中的内容,可以使用 @Value 注解来实现。@Value 注解使⽤“${}”的格式读取,如下代码所示:

@RestController
public class ValueController {
    @Value("${mykey.key1}")
    private String key1;
    @PostConstruct
    public void postConstruct(){
        System.out.println("==================");
        System.out.println("key1:" +  key1);
    }
}

在这里插入图片描述
打印的结果:
在这里插入图片描述

注意,如果不加${},会直接把双引号里的值赋给key1变量
在这里插入图片描述

properties的缺点

properties 配置是以 key-value 的形式配置的,从配置key看出,properties 配置文件中会有很多的冗余的信息。
在这里插入图片描述

yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔”。

基本语法

yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使用英⽂冒号加空格的方式组成的,其中的空格不可省略
在这里插入图片描述

yml 连接数据库

配置文件:

#连接数据库
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
    username: root
    password: root

读取配置文件

ym读取配置文件的方式和properties一样,通过@Value 注解使⽤“${}”的格式读取。

@RestController
public class ValueController {
    @Value("${spring.datasource.username}")
    private String sqlusername;
    @PostConstruct
    public void postConstruct(){
        System.out.println("==================");
        System.out.println("sqlusername:" + sqlusername);
    }
}

运行结果:
在这里插入图片描述

yml进阶

yml 配置不同数据类型及 null

配置文件:

# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~

结果:
在这里插入图片描述

value 值加单双引号

配置文件:

string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

运行结果:
在这里插入图片描述
从上述结果可以看出:
字符串默认不⽤加上单引号或者双引号。
单引号不会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据。
双引号会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思。

配置对象

定义学生类:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

这里使用lombok里的@Data注解相当于写了getter、setter方法、toString方法和一些构造函数。@Component是把这个对象交给Spring来管理。此时不能⽤ @Value 来读取配置中的对象,需要使用另⼀个注解@ConfigurationProperties 来读取,并指定配置文件的值。这里的prefix可以省略。
配置文件:

student:
  id: 1
  name: Java
  age: 18

在这里插入图片描述

配置集合和map

配置文件:

student:
  id: 1
  name: Java
  age: 18
  dbtypes:
    - mysql
    - sqlserver
    - db2
  map2:
    k1: kk1
    k2: kk2
    k3: kk3

Student类:

@ConfigurationProperties("student")
@Component
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private List<String> dbtypes;
    private HashMap<String,String> map2;
}

打印结果:
在这里插入图片描述

设置banner

自定义banner文件,让SpringBoot项目在启动时打印banner文件里的内容。
在这里插入图片描述

多平台配置文件的设置

实际开发中,开发环境,测试环境,以及发布环境的配置是不一样的。可以针对㒺环境设置不同的配置。
先写各个平台的配置文件:
开发环境的配置文件:application-dev.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
    username: root
    password: 123456

测试环境的配置文件:application-test.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
    username: root
    password: 112233

发布环境的配置文件:application-prod.yml

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/sqlsql?characterEncoding=utf8
    username: root
    password: root123456

为了拿到不同环境下数据库的密码,首先需要在主配置文件application.yml中删除原来的数据库配置,然后添加如下配置

spring:
  profiles:
    active: dev

其中active后面跟的是环境名称,比如dev/test/prod。

运行结果:
在这里插入图片描述

yml的优点

(1)yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
(2)yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和大量依赖外观的特⾊,特别适合用来表达或编辑数据结构、各种配置文件等。
(3)yml 支持更多的编程语⾔,它不止是 Java 中可以使用在 Golang、PHP、Python、JavaScript、Perl 中。

Spring Boot的日志文件

Spring Boot项目在启动时有默认的日志输出。日志的作用就是为了发现和定位问题。
在这里插入图片描述
通过上述日志信息我们能发现以下 几个问题:
①默认情况下,输出的日志并非是开发者定义和打印的,开发者如何在程序中自定义打印日志?
②⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,也就是不能持久化。如何把⽇志永久的保存下来?

自定义日志

开发者⾃定义打印⽇志的实现步骤:

  • 获取日志对象
  • 打印日志内容

获取日志对象

在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:

    //1.获取日志对象
    private Logger logger = LoggerFactory.getLogger(LogController.class);

日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位到问题类。因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调⽤ slf4j 来输出日志。Logger 对象是属于 org.slf4j 包下

日志框架

在这里插入图片描述
这里的日志门面和日志实现的关系相当于JDBC和MySql、Sql Server之间的关系。SpringBoot默认使用的是logback。

打印内容

@Controller
public class LogController {
    //1.获取日志对象
    private Logger logger = LoggerFactory.getLogger(LogController.class);

    @PostConstruct
    public void postConstruct(){
        //打印日志
        logger.info("第一条日志信息");
    }
}

打印结果:
在这里插入图片描述

日志级别

日志打印过多会不利于排查问题,而打印过少会影响系统性能。将日志级别划分为以下6种:
trace:微量,少许的意思,级别最低;
debug:需要调试时候的关键信息打印;
info:普通的打印信息(默认日志级别);
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的,因为代码异常导致程序退出执行的事件。
在这里插入图片描述
Spring Boot项目默认的日志级别是info,低于info级别的日志不打印,高于info级别的打印。
在这里插入图片描述

设置日志级别

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

logging:
  level:
    root: info

当配置为info级别时,只会打印info级别以及比info级别高的日志。

分目录设置日志级别

当日志级别设置为debug时,可以看到系统的日志信息,但我们只想看到自己程序的debug日志,此时需要分目录设置日志级别。

logging:
  level:
    root: warn
    com:
      example:
        demo: debug

上述配置就是整体要打印warn级别的日志,然后在com.example.demo目录下打印debug级别的日志。
在这里插入图片描述

日志的持久化

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

配置日志文件的保存路径:

logging:
  file:
    path: D:\test\log

配置日志文件的文件名:

logging:
  file:
    name: D:\test\log\springboot.log

日志文件是追加的形式。这种情况可能会导致日志文件越来越大。默认最大的日志大小为10MB。
在这里插入图片描述
可以自定义配置日志的大小,当超出设置值时会自动分割。

logging:
  logback:
    rollingpolicy:
      max-file-size: 1KB

lombok日志输出

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦。可以使用lombok 来更简单的输出日志。
1.添加 lombok 框架支持。
2.使用 @Slf4j注解输出日志。

添加lombok依赖

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

使用@Slf4j输出日志

@Slf4j
@Controller
public class LogController2 {

    @PostConstruct
    public void postConstruct(){
        log.trace("trace日志信息");
        log.debug("debug日志信息");
        log.info("info日志信息");
        log.warn("warn日志信息");
        log.error("error日志信息");
    }
}

打印结果:
在这里插入图片描述

lombok原理

在上述示例中,查看编译后的class文件可以看到,文件中没有@Slf4j注解了,相对的多出了一行log对象的定义。
在这里插入图片描述
在这里插入图片描述

lombok的注解

基本注解

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

@Getter和@Setter可以添加到类上,也可以添加到属性上。这两个注解可以单独使用。类注解就表示所有的属性都具备了对应注解的方法。如果注解加在了属性了,那当前属性就具备了对应注解的方法。

组合注解

注解作用
@Data@Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor

日志注解

注解作用
@Slf4j添加⼀个名为 log 的日志,使用 slf4j

继续加油~
在这里插入图片描述

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

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

相关文章

IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)

1.守护进程&#xff08;幽灵进程&#xff09; #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpid fork();if(0cpid){ //创建新的会话pid_t sidsetsid();printf("sid%d\n",sid);//修改运行目录为不可卸载的文件…

蓝牙资讯|三星Galaxy SmartTag 2亮相FCC,智能防丢市场持续火爆

三星的 Galaxy SmartTag 2 已经现身美国联邦通信委员会&#xff08;FCC&#xff09;网站&#xff0c;外观设计也随之曝光&#xff0c;该设备呈扁平的椭圆形&#xff0c;顶部有一个巨大的钥匙环孔&#xff0c;看起来有点像雪茄切割器。如果这是一个普通的钥匙环大小的孔&#xf…

UG\NX 二次开发 选择相切面、相邻面的选择面控件

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗&#xff1f;” 这个用Block UI的"面收集器"就可以&#xff0c;ufun函数是不行的。 效果&am…

基于text2vec和faiss开发实现文档查询系统初体验

最近接触到了一些文本向量化的预训练模型&#xff0c;感觉相比较自己去基于gensim去训练词向量来说&#xff0c;使用预训练模型可能是更高效的方式了&#xff0c;正好有一个想法一直在想能够以什么样的形式间接的实现问答&#xff0c;说白了这里的问答跟我们理解的chatGPT类型的…

iOS——Block one

块类似于匿名函数或闭包&#xff0c;在许多其他编程语言中也存在类似的概念。 可以访问上下文&#xff0c;运行效率高 Block 以下是块的一些基本知识&#xff1a; 块的定义&#xff1a;块是由一对花括号 {} 包围的代码片段&#xff0c;可以包含一段可执行的代码。块的定义使…

125.验证回文串

目录 一、题目 二、代码 一、题目 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public: bool ABC(char& s) {if (s > 65 && s < 90){s 32;return true;}if (s > 97 && s < 122){return true;}if …

FPGA开发:音乐播放器

FPGA开发板上的蜂鸣器可以用来播放音乐&#xff0c;只需要控制蜂鸣器信号的方波频率、占空比和持续时间即可。 1、简谱原理 简谱上的4/4表示该简谱以4分音符为一拍&#xff0c;每小节4拍&#xff0c;简谱上应该也会标注每分钟多少拍。音符时值对照表如下图所示&#xff0c;这表…

无涯教程-Lua - while语句函数

只要给定条件为真&#xff0c;Lua编程语言中的 while 循环语句就会重复执行目标语句。 while loop - 语法 Lua编程语言中 while 循环的语法如下- while(condition) dostatement(s) end while loop - 流程图 在这里&#xff0c;需要注意的关键是 while 循环可能根本不执行。…

Go语音介绍

Go语言介绍 Go 即Golang&#xff0c;是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言&#xff0c;是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码&#xff0c;然后由解析器对代码进行解释执行。 编译型语言——源代码编…

【树形DP+换根思想】2022牛客多校加赛 H

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这个虽然是树形DP&#xff0c;却用了换根的思想.... 首先&#xff0c;后缀0的个数可以转化成min(cnt2,cnt5)&#xff0c;其中cnt2为2的因子个数&#xff0c;cnt5为5的因子个数 然后进行DP 设dp[u]…

面试之多线程(三)

1.进程和线程的区别 根本区别&#xff1a;进程是操作系统分配资源的最小单位&#xff1b;线程是CPU调度的最小单位所属关系&#xff1a;一个进程包含了多个线程&#xff0c;至少拥有一个主线程&#xff1b;线程所属于进程开销不同&#xff1a;进程的创建&#xff0c;销毁&…

基于Vue+ElementUI+Echarts+G2Plot的仪表盘设计器,代码完全开源

简介 &#x1f525;DashBoard基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘设计、预览、资源管理、组件管理等能力&#xff0c;支持JSON、MySQL、Oracle、PostgreSQL、HTTP、JavaScript、Groovy等数据集接入&#xf…

类加载器的双亲委派机制和源码分析

双亲委派机制 双亲委派就是一个从子到父的过程,然后还有一个从父到子的状态。具体如下: 如果一个类加载器收到了类加载的请求,它会首先去自己的缓存中查找是否加载过这个类(findLoadedClass),如果有,那么直接加载。如果没有就会让父加载器加载,父加载器会先去自己的缓…

自定义elementui的主题

通常情况下&#xff0c;我们使用elementui框架的时候默认组件的主题都是白色的&#xff0c;比如&#xff1a; 但是如果想自定义主题&#xff0c;改变主题颜色&#xff0c;以及各种默认颜色&#xff0c;其实也不难&#xff1a; 配置默认主题&#xff0c;选好后点击下载 在vu…

软件外包开发的PHP开发框架

PHP有许多流行的开发框架&#xff0c;每个框架都有其独特的特点和优势。下面列举的只是一部分PHP开发框架&#xff0c;还有其他一些框架如Slim、Zend Framework等也值得一提。选择合适的框架取决于项目的需求和开发团队的偏好&#xff0c;您可以根据项目规模、复杂性和功能需求…

Golang之路---02 基础语法——异常机制:panic 和 recover

Golang的异常处理 Go 没有像 Java 和 .NET 那样的 try/catch 异常机制&#xff1a;不能执行抛异常操作。 在 Golang 中&#xff0c;有不少常规错误&#xff0c;在编译阶段就能提前告警&#xff0c;比如语法错误或类型错误等&#xff0c;但是有些错误仅能在程序运行后才能发生&…

【推荐】通用全面的APP测试用例设计

1、安装卸载 用例编号 测试内容 操作步骤 预期结果 测试次数 测试结果 备注 安装 1 通过第三方软件协助安装是否正常 第三方软件搜索app&#xff0c;安装 目标:支持360、豌豆荚、应用宝等主流辅助工具 1 Pass 2 在不同操作系统下安装是否正常 1、使用测试手机安装 …

面试总被问高并发负载测试,你真的会么?

本文将介绍使用50K并发用户测试轻松运行负载测试所需的步骤&#xff08;以及最多200万用户的更大测试&#xff09;。 ❶ 写你的剧本 ❷ 使用JMeter在本地测试 ❸ BlazeMeter SandBox测试 ❹ 使用一个控制台和一个引擎设置每引擎用户数量 ❺ 设置和测试群集&#xff08;一个…

【环形链表(带环链表)超详细总结】

题目一 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 使用快慢指针&#xff0c;如果慢指针等于快指针&#xff0c;就说明是带环链表链表的中间结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;…

什么是 webpack?

Webpack 介绍 什么是 webpack&#xff1f; :::tip 官方描述 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个…