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

news2025/1/21 0:55:58

文章目录

  • 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 的日志对象

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

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

相关文章

使用MIB builder自定义物联网网关的MIB结构

文章目录 物联网网关初识(了解即可)IoT的通用MIB库结构MIB Builder开发流程指导问题总结子叶没所属分组值范围不为0 物联网网关初识(了解即可) 网关又称网间连接器、协议转换器。简单说,物联网网关是一台智能计算机&a…

Java集合进阶(上)

集合 集合在Java开发中应用极为广泛,它其实就是一些常用的数据结构的包装类,分为单列集合(Collecton接口类,例如LinkdeList集合)和双列集合(Map接口类,例如HashMap集合)两种 Collection Coll…

Sprite Editor图片编辑器的使用_unity基础开发教程

Sprite Editor图片编辑器的使用 什么是Sprite Editor安装插件(3D项目)切片方式Automatic:自动切片Grid By Cell Size:按照像素大小进行切片Grid By Cell Count:按照个数进行切片Isometric Grid:等距网格切片…

Java利用UDP实现简单群聊

一、创建新项目 首先新建一个新的项目,并按如下操作 二、实现代码 界面ChatFrame类 package 群聊; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.InetAddress; public abstract class ChatFrame extends JFrame { p…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含pytho、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架,引入CNN进行模型训练,采用Dropout梯度下降算法,按比例…

MAC 系统在vs code中,如何实现自动换行

目录 问题描述: 问题解决: 问题描述: 在vscode中,有些时候,一行内容过多,如果不能自动换行,就需要拖动页面,才能看到完整的内容。如下图两行所示: 问题解决&#xff1a…

华为数通---使用基本ACL限制Telnet登录权限案例

组网需求 如下图所示,PC与设备之间路由可达,用户希望简单方便的配置和管理远程设备,可以在服务器端配置Telnet用户使用AAA验证登录,并配置安全策略,保证只有符合安全策略的用户才能登录设备。 配置通过Telnet登录设备…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok,在上篇文章中我们讲了在Spring cloud中使用Zuul网关,这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话,本篇博客就是配置子模块,或者说是微服务,然后将微服务正式启动之前…

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段教师组(样卷) 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段教师组样题, 内容包括:网络安全渗透、理论技能与职业素养。 本次比赛时间为180分钟。 介绍 Ge…

Unity中Batching优化的GPU实例化(1)

文章目录 前言一、GPU实例化的规则1、必须满足 Mesh 网格一样2、只有OpenGL es 3.0及以上才支持(3.0及以上有部分硬件可能也不支持) 二、GPU实例化的应用场景1、公开几个成员属性,用于存放可以调整的数据2、用Random.insideUnitCircle随机生成…

Linux(ubuntu)利用ffmpeg+qt设计rtsp_rtmp流媒体播放器(完全从0开始搭建环境进行开发)

一、前言 从0开始搭建Linux下Qt、ffmpeg开发环境。 从安装虚拟机开始、安装Linux(Ubuntu)系统、安装Qt开发环境、编译ffmpeg源码、配置ffmpeg环境、编写ffmpeg项目代码、完成项目开发。 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开…

决策树 (人工智能期末复习)

几个重要概念 信息熵:随机事件未按照某个属性的不同取值划分时的熵减去按照某个属性的不同取值划分时的平均 熵。即前后两次熵的差值。 表示事物的混乱程度,熵越大表示混乱程度越大,越小表示混乱程度越小。 对于随机事件,如果它的…

【Hadoop_01】Hadoop介绍与安装

1、Hadoop、HDFS、YARN介绍(1)Hadoop简介与优势(2)Hadoop组成(3)HDFS概述(4)YARN概述(5)MapReduce概述 2、安装(1)Centos7.5软硬件安装…

数据仓库与数据挖掘复习资料

一、题型与考点[第一种] 1、解释基本概念(中英互译解释简单的含义); 2、简答题(每个10分有两个一定要记住): ① 考时间序列Time series(第六章)的基本概念含义解释作用(序列模式挖掘的作用); ② 考聚类(第五章)重点考…

用23种设计模式打造一个cocos creator的游戏框架----(四)装饰器模式

1、模式标准 模式名称:装饰器模式 模式分类:结构型 模式意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式比生成子类更为灵活。 结构图: 适用于: 当需要给一个对象在运行时添加更…

Linux系统调试课:网络性能工具总结

文章目录 一、网络性能指标二、netstat三、route四、iptables沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章一起了解下网络性能工具。 一、网络性能指标 从网络性能指标出发,你更容易把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握。这样,…

网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit

miniconda与anaconda的区别: Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点: 1. 安装内容和大小: Anaconda: Anaconda 是一个完整的 Python 数据科学平台,包含…

Kafka使用指南

Kafka简介架构设计Kafka的架构设计关键概念Kafka的架构设计关键机制 Partition介绍Partition工作机制 应用场景ACK机制介绍ACK机制原理ACK机制对性能的影响ACK控制粒度Kafka分区数对集群性能影响调整分区优化集群性能拓展Kafka数据全局有序 Kafka简介 Kafka是由Apache软件基金…

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享 前言竞赛简介竞赛目的如何备战1.基础学习2.实战训练(非常重要) 资料分享 前言 博主在蓝桥杯中获得过十四届Java B 组的省一国二,本文为大家介绍一下蓝桥杯并分享一下自己的参赛经验。 竞赛简介…