# 1.SpringBoot的配置文件

# 1.1 SpringBoot的三种配置文件

  1. application.properties
  2. application.yml 主流
  3. application.yaml

# 1.2 配置文件冲突问题, 配置文件优先级

当三个配置文件同时存在时, 不同配置属性叠加,相同配置属性覆盖,高优先级配置文件覆盖低优先级别配置文件

properties>yml>yaml

# 1.3 解决配置文件,没有提示信息问题

首先只有已经添加的依赖,在配置时会出现提示,提示信息是idea的企业版提供的,如果idea没有出现提示信息,说明idea没有将这个文件识别成配置文件,我们可以去 项目结构中进行配置

img

# 1.4 yaml和yml配置文件的数据格式

img

# 1.5 读取Yaml配置文件中的单一数据

  1. **使用@Value(${层级1.层级2})**注解来注入单一属性信息

    	@Value("${name}") //注入name
        private String name;
        @Value("${student.name}") //注入对象的单一属性
        private String studentName;
        @Value("${Colors[0]}") //注入数组的第一个元素
        private String color;
    
        @Value("${Students[0].name}") //注入数组的第一个对象的属性
        private String StudentArrayName;
    
  2. 配置文件中,配置信息相互引用,同样使用${},

#配置信息相互引用
basePath: D:/software
game: ${basePath}/game
  1. 如果想要解析字符串中的转义字符,我们需要将,配置的数据使用双引号,引起来

    #配置信息相互引用
    basePath: D:/software
    game: "${basePath}/game \t1 \t2 \t3"    #\t会被转译成制表符
    

# 1.6 将配置信息的所有数据,一次封装到一个对象中,这个对象通过自动注入来获取

//注入,包含所有配置信息的对象
    @Autowired
    private Environment env;
	  //通过Environment对象获取所有信息
        String student = env.getProperty("student.name");
        String name = env.getProperty("name");
        System.out.println(name);
        System.out.println(student);

# 1.7 将部分配置信息封装成对象,进行读取

  1. 定义与配置信息,属性名匹配的模型类

    注意书写Get和Set方法

  2. 将类加入到Spring容器,即添加@Component注解

  3. 将模型类与配置信息中的数据进行关联,添加@ConfigurationProperties(prefix = "对应的数据名")注解

    "对应的数据名" 不能含有大写字母, 可以使用 '-' 来分割单词

    1. 可选: 通过自动注入模型类,来使用里面的数据

# 2. springBoot 整合第三方技术

# 2.1 SpringBoot 整合Junit框架,进行测试

如果是通过自动创建的SpringBoot的项目的话,就已经整合好了SpringBoot,并且在对应的test文件夹中对应的结构位置,写好了测试类

如果是手动创建的SpringBoot项目,整合SpringBoot的步骤:

  1. 导入start-test依赖

    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
  2. 创建 测试类,并在测试类上添加@SpringBootTest注解

    注意测试类的位置,其位置结构要与SpringBoot的引导(启动)类所对应的包或者子包下匹配,否则抛出异常

    java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
    

    解决方法:

    1. 添加@ContextConfiguration注解,在测试类上面,并且指定classes属性引导类的class

      @SpringBootTest()
      @ContextConfiguration(classes = Application.class)
      
    2. 在@SpringBootTest注解中指定classes属性为引导类的Class

      @SpringBootTest(classes = Application.class)
      
    3. 将测试类放在引导类相同的位置结构,或者子包下,这样它就能找到包含@SpringBootConfiguration注解的引导类了

  3. 注入待测试的类

  4. 编写测试方法

# 2.2 SpringBoot 整合Mybatis

步骤:

  1. 导入对应的依赖,可以在创建SpringBoot项目时,采用勾选的方式,或者手动在Pom文件中添加

    添加的依赖包含,mybatis和数据库的驱动包,例如mysql的驱动包

    在SpringBoot中,官方整合的技术,在依赖中,坐标以SpringBoot开头,而第三方技术,以自己的名字开头,后面跟上SpringBoot,这只是一个大多数的规定,可能有不按照格式的依赖

    		<!--官方的技术, 以>spring-boot开头-->	
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<!--第三方技术, 以自己的技术开头,后面跟上spring-boot-->	
    		<dependency>
    			<groupId>org.mybatis.spring.boot</groupId>
    			<artifactId>mybatis-spring-boot-starter</artifactId>
    			<version>2.2.2</version>
    		</dependency>
    
  2. 在SpringBoot的配置文件中,配置数据源的相关信息

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost/mp
        username: root
        password: root
    
  3. 编写对应的mapper

    在mapper上添加对应的注解,像是@mapper或者@Repository

  4. 测试代码

# 可能出现的问题

  1. 当我们使用较低版本的SpringBoot时,例如2.4.1或者2.3.9, 它们管理的mysql连接驱动版本,要求连接时设置时区,如果不设置就会报错

    所以我们有两种解决方案,一是在url中添加时区设置的参数,或者一劳永逸的在mysql配置文件中设置时区

# 2.3 SpringBoot整合Mybatis-Plus

步骤:

  1. 手动导入mybatis-Plus的依赖坐标,或者使用阿里云的SpringBoot模板创建项目,有这个技术的选项
  2. 填写配置信息,与mybatis一样
  3. 编写mapper继承BaseMapper
  4. 测试代码

# 2.4 SpringBoot整合Druid

步骤:

  1. 手动导入druid的boot依赖

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.9</version>
    </dependency>
    
  2. 配置Druid的配置信息

    # 整合德鲁伊数据库连接池的第一种配法, 不常用
    #spring:
    #    datasource:
    #        driver-class-name: com.mysql.cj.jdbc.Driver
    #        url: jdbc:mysql://localhost/mp?serverTimezone=UTC
    #        username: root
    #        password: 9236
    #        type: com.alibaba.druid.pool.DruidDataSource
    #
    # 整合德鲁伊数据库连接池的第二种配法
    spring:
        datasource:
            druid:
                driver-class-name: com.mysql.cj.jdbc.Driver
                url: jdbc:mysql://localhost/mp?serverTimezone=UTC
                username: root
                password: 9236
    
  3. 编写dao层

  4. 测试代码

# 2. 5 整合第三方技术总结

发现整合步骤基本就分为两步,第一步手动到入对应的依赖,第二步编写对应的配置

# 3. 异常处理

在使用Spring时,我们学过AOP的思想,我们想要通过SpringBoot做异常处理时,一般都是把异常往表现层抛出,所以我们在controller层下建立一个异常处理器包 exceptionAdvice

@RestControllerAdvice //表名这个类处理RestController的异常,其实这个注解比@ControllerAdvice多了个@ResponseBody注解,所有的方法返回响应体数据
public class ExceptionAdvice {
    /**
     * 处理异常
     * @param ex 所抛出的异常
     * @return  返回一个R类型
     */
    //表名这是一个异常处理方法, 所有的异常都会执行这个方法,因为所有的异常都是Exception的子类,可以在里面传入自定义的异常的class,专门处理这个异常
    @ExceptionHandler
    public R doException(Exception ex){
        //通知运维
        //通知开发
        //打印错误信息
        ex.printStackTrace();
        //返回出现异常时的封装的R对象
        return new R("服务器故障,请过段时间重试!");
    }
    //处理自定义异常
    @ExceptionHandler(RuntimeException.class)
    public R doException(RuntimeException ex){
        //通知运维
        //通知开发
        //打印错误信息
        ex.printStackTrace();
        //返回出现异常时的封装的R对象
        return new R("运行时异常!");
    }
}

# 4.window平台,杀死占用端口的程序命令

img

# 5. Linux 平台部署项目

步骤:

注意项目的请求最好是通过相对路径进行请求,发送同源请求,这样只要获取了网页,就可以正常的发送Ajax或者Axios请求,而不会跨域

  1. 将项目通过Maven插件进行打包,打包前注意项目引入了maven打包插件,这样才能将所有的依赖全部打包,第二注意打包前最好是执行一些clean

  2. 将jar包上传到linux的家路径下(~)或者/usr/local 下,这两个文件夹经常用来存放运行的程序

  3. 使用 下列命令运行SpriingBoot项目

    java -jar SpringBootApplication.jar
    

如何想要后台运行,并且将日志输出到文件

#nohup 是后台运行, >是标准输出流, 2>是标准错误输出流, 2>&1 就是将错误也输出到日志文件里, &是后台执行,不占用窗口
nohup java -jar SpringBootApplication.jar > 日志文件名.log 2>&1 &
  1. 查询 跟java相关 进程

    # ps是查看进制 -e是所有等同于a -f 显示UID,PPIP,C与STIME栏位。
    # | 是管道符,将查询结果 送给grep指令, grep指令是查找到命令, 在里面查找字符串 "java"
    ps -ef | grep "java"
    
  2. 杀死进程

    #kill -9 杀死进程
    kill -9 "进程号"
    

# 6. SpringBoot临时属性的使用

在有些情况下,我们写在项目里面的配置文件,不能更改,比如说已经打好了jar包,但是我们想要修改时,我们可以使用 启动时通过临时参数进行覆盖配置,只在本次运行生效

例如,当我们想要修改原项目的启动端口时,可以在启动项目的指令后面 跟上 -- server.port=80,多个参数后面可以继续跟上 -- 进行配置

 #通过临时参数修改启动端口和数据库连接池连接的密码
java -jar SpringBoot_03_SSM-0.0.1-SNAPSHOT.jar --server.port=80 --spring.datasource.druid.password=9236

在SpringBoot中还有许多配置的方法,并且每种配置方式都有各自的优先级, 高优先级覆盖低优先级的配置

而临时的属性的优先级高于,配置文件的优先级

img

# 7.配置文件优先级

同一级目录下, Properties文件的优先级大于yml,yml大于yaml

img

在上面四种情况:

  1. 在我们的项目中的配置文件, 类加载路径下的配置文件优先级最低
  2. 类加载路径下的config文件夹中的配置文件优先级第三
  3. 当我们将项目打成jar包,后,当前目录下的配置文件优先级第二
  4. 在jar的目录下的config文件夹中的配置文件的优先级最高

当目录层级确定好后, 同样是配置文件, Properties 优先级大于 yml 大于 yaml

在这些同时存在的配置文件中, 配置相同的属性按照优先级的高低进行覆盖, 不冲突的属性,相互补充

# 8.指定SpringBoot程序所加载的配置文件

如果我们不使用默认的SpringBoot的配置文件名Application,SpringBoot就会无法识别配置文件

当我们不想使用Application作为我们配置文件的名字时,我们可在临时配置参数中去指定我们想要程序加载的配置文件的名字或者加载文件所在的路径

  1. 指定加载文件的名字

    ----spring.config.name=配置文件名 #注意不带后缀!
    
  2. 指定加载文件所在的路径

    --spring.config.location=classpath:/snake2.yml #可以使用绝对路径或者 类加载路径
    

这些配置,只适合单体服务器,实际上开发可能涉及到多台服务器,等学习了微服务SpringCloud时候,所有服务器的配置文件由它管理

# 9.SpringBoot 设置配置文件 对应多种环境

# 9.1 单文件配置多环境 yaml

我们的程序可能会运行在多个环境,例如开发环境,测试环境,生产环境

我们可以经这些环境设置到一个文件中,在通过改变应用的环境来实现快速切换

图解:

img

配置文件:

##应用环境
spring:
  profiles:
    active: new
---
##设置环境
# 生成环境
spring:
  profiles: pro
server:
  port: 80
---
#开发环境
spring:
  profiles: dev
server:
  port: 8080
---
#测试环境
spring:
  profiles: test
server:
  port: 1234
---
# 针对过时的spring.profiles的替代品
spring:
  config:
    activate:
      on-profile: new
server:
  port: 4321

# 9.2 多环境多文件yaml

img

多个配置文件,环境名就是 - 后面的名字, 在application.yml中配置具体应用哪一个环境

# 9.3 多环境多文件properties

img

多个配置文件,环境名就是 - 后面的名字, 在application.properties中配置具体应用哪一个环境

# 9.4 对配置文件进行拆分

  1. 在SpringBoot 2.4以下版本,可以使用如下配置,对某个环境下的配置文件进行拆分,加载

img

在使用Include加载其他配置文件时,越靠后加载的文件,冲突的配置就以谁为准, active的配置文件最后加载

  1. 在SpringBoot的高版本时, include已经被舍弃,改为使用group

    img

使用group时,由于冲突配置以后加载的为准, 在这里 active的配置文件是最先加载的!

  1. 项目启动时,打印的日志中, 输出了环境组中配置文件的加载顺序,越靠后,冲突的配置就以谁为准

img2.5.6版本,日志信息

img2.7.1版本 日志信息

# 9.5 Maven配置环境与SpringBoot配置的环境冲突时

我们可以在Maven中设置SpringBoot启动所使用的环境.

img

img

使用<activeByDefault>true</ctiveByDefault>来指定使用maven中配置的环境,然后修改SpringBoot中的配置文件,对maven的配置信息进行引用,即可保证环境统一

设置完毕之后,当我们使用maven将项目打成Jar包时,我们去打开SpringBoot的配置文件发现引用的maven属性,已经改写成了对应的环境

在低版本的idea中,据说设置好maven的配置属性后,结果发现不生效,还是之前的环境,此时我们需要点击一下maven插件中的complie,重新编译一下, 也有弹幕说重新刷新一下pom,而在高版本2022的idea中这个bug已经被解决

# 解决'@' that cannot start any token. (Do not use @ for indentation)问题

当在配置文件application.yml中有如下的代码时:

spring:
  application:
    name: @artifactId@

如果报错

Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '@' that cannot start any token. (Do not use @ for indentation)
 in 'reader', line 3, column 11:
        name: @artifactId@

解决方法:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

参考文档 (opens new window)

# 10 .SpringBoot日志

# 1.设置日志

日志配置:

#开启debug日志 但是没有root包下面的全 root代表整个应用
#debug: true
# 指定日志级别和具体指定包或者组的日志级别
logging:
  #设置组
  group:
    snake: com.snake.controller,com.snake.dao,com.snake.pojo
  #设置级别
  level:
#    root: debug
    #设置snake组的日志
    snake: info
    #设置包的设置
    com.snake.service: error

获取日志对象:

方式1: 手动的获取日志对象

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(需要写日至的类.class);

方式2: 使用lombok的功能,通过加上注解,提供一个log对象

​ 步骤:

  1. 导入lombok的依赖
  2. 在想要写日至的类上,加上@Slf4j的注解
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j //帮我们生成一个log对象,可以直接使用
@RestController
@RequestMapping("/log")
public class BookController {
        //手动添加日志对象
//    Logger logger = LoggerFactory.getLogger(BookController.class);
    @GetMapping
    public String get(){
//        logger.info("info...");
//        logger.warn("warn...");
//        logger.error("error...");
        log.info("info...");
        log.warn("warn...");
        log.error("error...");
        return "It is Ok~";
    }
}

# 2. 日志的输出格式控制

img

img

%clr(){颜色} 设置颜色

%d 时间日期

%p 日志级别

%16t 代表 线程信息占用16个字符位置

%-40.40c 代表左对齐,占用40个字符, .40 代表超过40个字符时,删减. c输出类信息

%m 代表输出消息

%n 换行

# 3.设置日志输出到文件

logging:
  file:
    #设置日志文件的名字 默认的日志路径在项目文件夹的同级目录下, 只有设置了这个下面的滚动日志才生效
    name: server.log
  logback:
    #设置滚动日志, 根据大小拆分文件, 日志格式 %d代表日期 %i代表索引, 从0开始
    rollingpolicy:
      file-name-pattern: server%d.%i.log
      max-file-size: 4KB

# 11. 自定义 SpringMvc的 Json转换

文章 :https://zhuanlan.zhihu.com/p/347602986

# 12. Springboot集成邮件

1.引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2.创建工具类

package com.snake.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
@Slf4j
@Component
public class EmailSender {
    //注入发件邮箱, 注意当这个类被autowire时, 才能正确的获取到值
    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.username}")
    private String from;

    @Value("${spring.mail.password}")
    private String password;


    public JavaMailSenderImpl JavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost(host);
    mailSender.setUsername(from);
    mailSender.setPassword(password);
    return mailSender;
    }
    public void sendSimpleMail(String to, String subject, String text) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        // 发件人
        simpleMailMessage.setFrom(from);
        // 收件人
        simpleMailMessage.setTo(to);
        // 邮件主题
        simpleMailMessage.setSubject(subject);
        // 邮件内容
        simpleMailMessage.setText(text);
        //发送邮件
        JavaMailSender().send(simpleMailMessage);
    }
}
  1. 配置文件

    spring:
      mail:
        host: smtp.qq.com
        username: xxxx
        password: xxxx
    

# 13.SpringBoot 配置虚拟目录

如果想要用户通过url 访问 不在项目下的文件资源咋办?

通过配置虚拟目录.,即可通过url 访问

img

file: 后面就是磁盘的目录,可以通过el表达式取值

img

此时就可以通过url访问了 D:/CloudDisk/uploadFileDir/下的文件了

例如:

http://127.0.0.1/music/歌曲.mp3

# SpringBoot 整合短信发送.

# 使用阿里云的短信服务.

我们需要进行如下的步骤.

更新时间: 2024年5月26日星期日下午4点47分