JavaEE进阶学习:Spring Boot 配置文件

1.配置文件的作用

整个项目中所有重要的数据都是在配置文件中配置的,比如:

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

想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

2.配置文件的格式

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

  • properties
  • yml

特殊说明

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

3.properties 配置文件说明

1. properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以"="连接的

当其使用中文注解时,会出现中文乱码

解决方案是

两个地方都要配置编码格式

配置文件里面的配置类型分为两类:

  1. 系统配置项 ex:server.port(给系统框架使用的)
  2. 用户自定义配置项 ex:myimage.path(开发者自己使用的)

2.读取配置文件

如何读自己的配置项呢

java 复制代码
package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @projectName: Demo
 * @package: com.example.demo
 * @className: TestController
 * @author: 王嘉辉
 * @description:
 * @date: 2023/12/4 19:49
 * @version: 1.0
 */
@Controller
@ResponseBody
public class TestController {

    @Value("myimage.path")
    private String myImage;

    @RequestMapping("/sayhello")
    public String sayHello() {
        return "你好,Spring Boot -> " + myImage;
    }
}

正确的配置方式

3.IDEA 热部署

热部署(Hot Deployment)指的是在应用程序运行的过程中,对程序进行修改、添加或删除某些文件或代码后,无需停止应用程序,就能够立即实现对程序的修改,并使其生效。

写完代码不要手动重启,新代码就可以自动生效

1.添加 SpringBoot -dev-tool 框架

2.在IDEA设置中开启项目的自动编译

同理这里也要设置

4.properties 配置文件的优缺点

优点:

1.配置文件结构清晰: key = value -> 适合初学者

缺陷:

写法臃肿

4.yml 配置文件说明

1.yml 基本语法

yml 是树形结构的配置文件,它的基础语法是"key: value",注意 key 和 value 之间使用英文冒号加空格的方式组成的,其中的空格不可省略

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

2.读取配置文件

java 复制代码
package com.example.demo;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @projectName: Demo
 * @package: com.example.demo
 * @className: UserController
 * @author: 王嘉辉
 * @description:
 * @date: 2023/12/4 21:17
 * @version: 1.0
 */
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {

    @Value("${myobj.name}")
    private String name;

    @PostConstruct
    public void doPostConstruct() {
        System.out.println("-------------- name -> " + name);
    }
}

但要获取到全部内容则需

java 复制代码
package com.example.demo.model;


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

/**
 * @projectName: Demo
 * @package: com.example.demo.model
 * @className: user
 * @author: 王嘉辉
 * @description:
 * @date: 2023/12/4 21:23
 * @version: 1.0
 */
@ConfigurationProperties("myobj")
@Component //必须有五大类注解中的一个
public class User {

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
java 复制代码
package com.example.demo.controller;

import com.example.demo.model.User;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @projectName: Demo
 * @package: com.example.demo
 * @className: UserController
 * @author: 王嘉辉
 * @description:
 * @date: 2023/12/4 21:17
 * @version: 1.0
 */
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {

    /*@Value("${myobj.name}")
    private String name;*/


    @Autowired
    private User user;

    @PostConstruct
    public void doPostConstruct() {
        System.out.println(user.toString());
    }
}

@RestController 等价于@ResponseBody @Controller

相关推荐
啄缘之间13 分钟前
1.【SVA】什么是SVA?
经验分享·学习·测试用例·verilog·sva
sunoo-2291 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Purple Coder1 小时前
stm32
学习
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring
爱吃苹果的日记本1 小时前
离散数学第五课
学习·离散数学
今年下半年2 小时前
SpringBoot整合金蝶中间件
spring boot·中间件·maven
字节探索2 小时前
别再只会写 Controller 了!一文吃透 Spring Boot 高级特性与项目实战
spring boot·spring
外收内放3 小时前
Python与AI应用(json模块)
python·学习
MetaLite3 小时前
全网最好的SpringBoot接口请求对象设计
java·spring boot·后端
既然如此,那就开摆3 小时前
2023_Kirillov_SAM_总结
笔记·学习·遥感