Spring Boot 项目的创建、配置文件、日志

文章目录

  • Spring Boot 优点
  • 创建 Spring Boot 项目
    • 创建项目
    • 认识目录
    • 网页创建(了解)
  • 约定大于配置
  • Spring Boot 配置文件
    • 配置文件格式
    • 读取配置项
    • properties 配置文件
    • yml 配置文件
      • 基本语法
      • 进阶语法
      • 配置对象
      • 配置集合
      • yml 设置不同环境的配置文件
  • Spring Boot 日志文件
    • 看日志
    • 日志格式
    • 输出自定义日志
    • 将日志持久化
      • 设置日志名称
      • 设置日志保存路径
    • 设置日志级别 & 筛选日志
    • 更简单的日志输出——lombok
    • Lombok 的常用注解

Spring Boot 优点

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

创建 Spring Boot 项目

创建项目

IDEA 社区版需要安装 Spring Boot Helper 插件,专业版不需要。

新建项目,选择 Spring Initializr,给项目取名,项目类型这里使用 Maven

img

选择 Next,在下面的页面选择 Spring Boot 版本和需要的依赖

img

这边选择了三个依赖,Lombok 可以用来快速构建Getter Setter方法。Spring Boot DevTools 用来支持热部署,Spring Web 用来实现网络编程。

选择 Create 开始创建项目,第一次创建会比较慢,需要下载的东西比较多,建议配置国内源。

启动项目,正常启动说明创建成功:

img

认识目录

首先将下面 4 个无用的文件删除

img

关于各目录的介绍:

img

网页创建(了解)

前往官网:https://start.spring.io/

img

在这里将选项配置好后,点击 GENERATE,会下载一个压缩包,解压,然后用 IDEA 打开即可。

约定大于配置

Spring 核心设计思想——约定大于配置,也就是说,能通过约定解决就不要去动配置文件。

比如我们在创建项目时自动生成的启动文件:

img

Spring Boot 约定,和这个文件同目录或在该目录的子目录下,对象才可以被注入到容器中。

在之前学习的 Spring 中,我们还需要在 xml 中注册 bean、配置扫描路径,Spring Boot 就不需要了。

例:

在 demo 下面创建 TestController 文件:

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @RequestMapping("/hi")
    public String hi() {
        return "Hello";
    }
}

访问 http://localhost:8080/hi,输出 Hello

img

如果你把 TestController 文件移动到上级目录,比如 com 下面,再次访问就访问不到了。

img

Spring Boot 配置文件

配置文件格式

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

  • .properties (项目创建时的默认格式)
  • .yml(新版配置文件格式)

在 Spring Boot 中,配置文件命名为 application.properties 或 application.yml

这两种配置文件的语法不一样,比如我们要设置端口号:

在 application.properties 下:

server.port=9090

在 application.yml 下

server:
  port: 9090

特别说明:

  • properties 和 yml 可以同时存在一个项目中,当它们同时存在一个项目中时,都会被加载,如果两个配置文件中出现了同样的配置,此时为以 properties 中的配置为主,也就是说 properties 配置文件的优先级最高。
  • 虽然两个格式的配置文件可以共存,但是实际业务中通常采取一种配置文件格式
  • 更多配置项,见官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
  • 用户可以自定义配置项

读取配置项

自定义一个配置项:

#自定义配置项
mykey.key1=hahaha

读取配置项:

使用 ${} 来读取配置项的值,非自定义配置项也可以通过这种方式来读取

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Value("${mykey.key1}")
    private String mykey;

    @RequestMapping("/hi")
    public String hi() {
        return mykey;
    }
}

结果:

img

注:这种方式只能读取基本数据类型,关于其他数据类型在下面的 yml 中会涉及到。

properties 配置文件

使用 # 来注释,使用键值对来进行配置。

例,配置数据库信息:

#设置端口号
server.port=9090
#设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

优点:

  • 写法简单

缺点:

  • 不够灵活

  • 容易乱码:

    比如我写的中文注释,重新打开的时候都变成了 ?

    #?????
    server.port=9090
    #??????????
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8
    spring.datasource.username=root
    spring.datasource.password=123456
    
    #??????
    mykey.key1=hahaha
    

    这是编码问题导致的,properties 的默认编码格式是 ISO-8859-1

    解决方法,在设置里将编码改成 UTF-8(注意当前项目设置和新项目设置都要设置):

    img

yml 配置文件

基本语法

yml 是 YAML 的缩写,全称 Yet Another Markup Language

优点:

  • yml 可读性高,写法简单,语法和 JSON 类似
  • 支持更多的数据类型,可以简单表达清单(数组)、散列表、标题等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等
  • 支持更多的编程语言

yml 语法格式:

一级目录

key: value

: 后面的空格不可省略

多级目录

key:
  key2:
    key3: value

例:多级目录的系统配置项(数据库连接)

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

进阶语法

yml 支持很多数据类型:

#字符串
string: 'Hello, World!'
#整数
number: 42
#布尔
boolean: true
#null
null_value: null
#列表
list:
  - item1
  - item2
  - item3
#字典
dictionary:
  key1: value1
  key2: value2
#多行字符串
multiline_string: |
  This is a multiline
  string in YAML.
#日期时间
date_time: 2023-12-06T12:34:56Z

注:

字符串使用不同的引号会有不同的效果,只有使用双引号的时候,特殊字符都会发挥作用。

例:

mykey:
  str1: aaa \n bbb
  str2: 'aaa \n bbb'
  str3: "aaa \n bbb"
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Value("${mykey.str1}")
    private String mykey1;

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

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


    @RequestMapping("/hi")
    public String hi() {
        System.out.println("str1: " + mykey1);
        System.out.println("str2: " + mykey2);
        System.out.println("str3: " + mykey3);
        return null;
    }
}
/*输出:
str1: aaa \n bbb
str2: aaa \n bbb
str3: aaa 
 bbb
*/

配置对象

  1. 原始写法

    student:
      id: 1
      name: zhangsan
      age: 18
    
  2. 行内写法

    student: {id: 1, name: zhangsan, age: 18}
    

读取配置的对象:

首先要把 Student 类定义出来,给这个类添加 @Component 注解,存到 Spring 中,添加 @ConfigurationProperties(prefix = "student") 注解,表示将配置文件中的 student 配置赋值给当前的对象(为了完成这一步,一定要添加 Setter 方法)。

package com.example.demo.model;

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

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

接下来我们去获取这个对象,这里采取属性注入的方式:

@RestController
public class TestController {
    @Autowired
    private Student student;

    @RequestMapping("/hi")
    public String hi() {
        return student.getName() + " age: " + student.getAge();
    }
}

结果:

img

注意事项

  1. 读取配置文件的实体类不能没有 Setter 方法,@ConfigurationProperties 注解在实现时是通过 Setter 将配置文件中的内容赋值 给字段的
  2. @ConfigurationProperties 需要配合类注解一起使用

配置集合

  1. 原始写法

    mylist:
      dbtype:
        - mysql
        - sqlserver
        - db2
    
  2. 行内写法

    mylist: {dbtype: [mysql, sqlserver, db2]}
    

例:

首先定义 MyList 类,这次我们使用 lombok 中的 @Data 注解来自动生成 Getter 和 Setter 方法。

package com.example.demo.model;


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

import java.util.List;

@Data
@ConfigurationProperties(prefix = "mylist")
@Component
public class MyList {
    private List dbtype;
}

获取并读取:

@RestController
public class TestController {
    @Autowired
    private MyList myList;

    @RequestMapping("/hi")
    public String hi() {
        return "size: " + myList.getDbtype().size() + " get(0): " + myList.getDbtype().get(0);
    }
}

结果:

img

yml 设置不同环境的配置文件

创建 application-{profile}.yml 格式的配置文件,其中,{profile} 是指激活的环境配置文件的名称。例如,application-dev.yml 将用于开发环境,而 application-prod.yml 将用于生产环境。

application.propertiesapplication.yml 中设置 spring.profiles.active 属性来指定激活的环境。例如:

# application.properties
spring.profiles.active=dev

或者

# application.yml
spring:
  profiles:
    active: dev

这将使 Spring Boot 使用 application-dev.yml 中的配置。

Spring Boot 日志文件

看日志

Spring Boot 项目在启动时就有日志输出:

img

日志格式

img

输出自定义日志

  1. 得到日志对象
  2. 打印日志

例:

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    // 1.得到日志对象,注意是 slf4j 包里的,转入的参数表示日志来源于哪个类
    private static Logger log = LoggerFactory.getLogger(TestController.class);

    @RequestMapping("/hi")
    public String hi() {
        // 打印日志
        log.info("Hello");
        return null;
    }
}

结果:

img

将日志持久化

设置日志名称

#日志保存名称
logging:
  file:
    name: springboot.log

启动项目即可在项目根目录下面找到 springboot.log 文件,打开就能看到日志

特别注意:

  • 日志不会丢失,会一直追加
  • 当日志比较大的时候,会自动分割成多个文件

设置日志保存路径

也可以设置日志的路径:

logging:
  file:
    name: D:\Test\

启动项目,可以看到这个路径下自动生成了一个 spring.log 文件

设置日志级别 & 筛选日志

通过调用日志对象的不同方法输出不同级别的日志信息

log.trace("I am trace");
log.debug("I am debug");
log.info("I am info");
log.warn("I am warn");
log.error("I am error");

日志级别(从低到高)

  • trace:微量,少许的意思,级别最低
  • debug:调试信息
  • info:普通的打印信息
  • warn:警告,不影响使用,但需要注意的问题
  • error:错误,级别较高的错误日志信息
  • fatal:致命的,因为代码异常导致程序退出执行的事件

fatal 没有相应的方法来主动打印出来,fatal 级别的日志只有在程序发生严重错误的时候自动打印。


在之前的操作中,我们没有见过 debug 日志和 trace 日志,因为默认的日志级别是 info,trace 和 debug 日志都被筛选掉了。

在配置文件中设置 logging.level 配置项来筛选日志,输出指定日志级别以及比它级别高的日志信息,屏蔽比它级别低的日志。

logging.level.root 表示根日志,可以理解为所有的日志,默认值为 info。

如下配置,程序只会输出 debug 及级别更高的日志信息

logging:
  level:
    root: debug

更精细化的设置:

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

以上配置表示,将日志输出的最低级别设置成 warn,而 com.example.demo 下的日志最低级别设置为 debug

更简单的日志输出——lombok

每个类都要 LoggerFactory.getLogger(xxx.class); 来获取日志对象太麻烦了,使用 lombok 可以实现更简单的输出。

使用 @Slf4j 注解,会自动给你提供一个名为 log 的日志对象

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController {
    @RequestMapping("/hi")
    public String hi() {
        // 打印日志
        log.trace("I am trace");
        log.debug("I am debug");
        log.info("I am info");
        log.warn("I am warn");
        log.error("I am error");
        return null;
    }
}

Lombok 的常用注解

基本注解

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

组合注解

注解作用
@Data等效于 @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode

日志注解

注解作用
@Slf4j添加一个名为 log 的日志对象

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

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

相关文章

springboot——自动装配

自动装配 Condition: Condition内置方法:boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata),返回值为布尔型 重写matches方法的类:SpringBootCondition等 SpringBootCondition:springboot自带的实现类…

QT5.4.1无法打开文件

问题描述:起初是在QT代码中运行打开文件代码: QString gFilename QFileDialog::getOpenFileName(this,"open File",path,"*", nullptr,QFileDialog::DontUseNativeDialog);时,出现了堵塞情况,经过多次实验一…

Qt进程和线程

一、进程 在设计一个应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大,或者是因为该功能已经可以使用现成的程序很好的实现了,这时就可以在当前的应用程序中调用外部的程序来实现该功能,这就会使用到进程。Qt应用程序…

go语言 | etcd源码导读(一)

参考 本文参考https://zhuanlan.zhihu.com/p/600893553 https://www.topgoer.com/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C/go%E6%93%8D%E4%BD%9Cetcd/etcd%E4%BB%8B%E7%BB%8D.html 前沿etcd 与 raft etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系…

分享“技艺与传承”的魅力!春城晚报(开屏新闻)生活节第七期媒体开放日活动举行

近日,由云南报业传媒(集团)有限责任公司、云南春晚传媒有限公司指导;金格金俊广场、云南精品文化传媒有限公司联合主办的第七期媒体开放日活动在金格金俊广场B1共享空间举办。本次活动以「技艺与传承」为主题,特邀青年…

处理实时视频流:第三方美颜SDK的实时图像处理策略

为了提高用户体验,许多应用和平台开始采用第三方美颜SDK,通过先进的图像处理技术实时改善视频中的面部外观。本文将深入探讨这些第三方美颜SDK在实时视频流处理中所采用的图像处理策略,揭示其背后的技术原理和创新。 一、引言 实时视频流处理…

软著项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

深度学习(六):paddleOCR理解及识别手写体,手写公式,表格

1.介绍 1.1 什么是OCR? 光学字符识别(Optical Character Recognition, OCR),ORC是指对包含文本资料的图像文件进行分析识别处理,获取文字及版面信息的技术,检测图像中的文本资料,并且识别出文本的内容。…

文献阅读:基于改进ConvNext的玉米叶片病害分类

文献阅读:基于改进ConvNext的玉米叶片病害分类 CBAM注意力机制模块: 1:通道注意力模块,对输入进来的特征层分别进行全局平均池化(AvgPool)和全局最大池化(MaxPool)(两个…

详解nginx优势以及应用场景,实操编译安装和nginx版本平滑升级

目录 一、nginx的特点 那么nginx有哪些特点? 先讲nginx的优点: 缺点: 二、nginx与Apache的区别 三、nginx的应用场景 四、nginx为什么能支持高并发 五、为什么nginx不使用多线程 六、nginx的两种进程分别有什么作用 七、编译安装ngi…

Linux文件部分知识

目录 认识inode 如何理解创建一个空文件? 如何理解对文件写入信息? 如何理解删除一个文件? 为什么拷贝文件的时候很慢,而删除文件的时候很快? 如何理解目录 ​编辑 文件的三个时间 ​编辑 Access: …

HarmonyOS架构及关键技术整理

技术解析:鸿蒙系统的底层优势 鸿蒙系统采用了先进的微内核设计,这是一种全新的系统架构,能够更好地适应现代智能设备的多样性和互联性。微内核通过最小化系统的核心功能,提高了系统的安全性和可定制性。此外,鸿蒙系统…

利用阿里云 DDoS、WAF、CDN 和云防火墙为在线业务赋能

在这篇博客中,我们将详细讨论使用阿里云 CDN 和安全产品保护您的在线业务所需的步骤。 方案描述 创新技术的快速发展为世界各地的在线业务带来了新的机遇。今天的人们不仅习惯了,而且依靠互联网来开展他们的日常生活,包括购物、玩游戏、看电…

react 学习笔记 李立超老师 | (学习中~)

文章目录 react学习笔记01入门概述React 基础案例HelloWorld三个API介绍 JSXJSX 解构数组 创建react项目(手动)创建React项目(自动) | create-react-app事件处理React中的CSS样式内联样式 | 内联样式中使用state (不建议使用)外部样式表 | CSS Module React组件函数式组件和类组…

UDP多人群聊

一,创建类 二,类 1,Liao类 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String;public class Liao extends JFrame{private static final int D…

图像处理中的角点检测Python-OpenCV 中的实现

马丁亚当斯 (Martin Adams)在Unsplash上拍摄的照片 一、说明 在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如…

JFrog Artifactory二进制文件管理工具部署使用

1.简介 JFrog Artifactory二进制文件管理工具,目前已经在使用的公司有很多,足见他的方便好用。 2.下载安装包 点击下载地址 这里我下载的是7.9.2版本 3. 安装 (1)在安装JFrog Artifactory之前需要安装好jdk(需…

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 (1)自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…

梯度下降(批量梯度下降、随机梯度下降、小批量梯度下降)

在上一篇中我们推导了损失函数 J ( θ ) 1 2 m ∑ i 1 m ( y i − h θ ( x i ) ) 2 J(\theta) \frac{1}{2m} \sum_{i1}^{m} (y^{i} - h_{\theta}(x^{i}))^2 J(θ)2m1​∑i1m​(yi−hθ​(xi))2的由来,结尾讲到最小化这个损失函数来找到最优的参数 θ \theta θ&…

【C++】简单工厂模式

2023年12月6日,周三下午 今天又学习了一次简单工厂模式 每多学习一次,都会加深对设计模式的理解 目录 什么是简单工厂模式简单工厂模式的优缺点举例说明 什么是简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型…