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

Spring Boot 项目的创建、配置文件、日志_第1张图片

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

Spring Boot 项目的创建、配置文件、日志_第2张图片

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

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

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

Spring Boot 项目的创建、配置文件、日志_第3张图片

认识目录

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

Spring Boot 项目的创建、配置文件、日志_第4张图片

关于各目录的介绍:

Spring Boot 项目的创建、配置文件、日志_第5张图片

网页创建(了解)

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

Spring Boot 项目的创建、配置文件、日志_第6张图片

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

约定大于配置

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

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

Spring Boot 项目的创建、配置文件、日志_第7张图片

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

Spring Boot 项目的创建、配置文件、日志_第8张图片

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

Spring Boot 项目的创建、配置文件、日志_第9张图片

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(注意当前项目设置和新项目设置都要设置):

    Spring Boot 项目的创建、配置文件、日志_第10张图片

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();
    }
}

结果:

Spring Boot 项目的创建、配置文件、日志_第11张图片

注意事项

  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);
    }
}

结果:

Spring Boot 项目的创建、配置文件、日志_第12张图片

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 项目在启动时就有日志输出:

Spring Boot 项目的创建、配置文件、日志_第13张图片

日志格式

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

你可能感兴趣的:(Java,spring,boot,服务器,数据库)