Spring的配置文件,如何配置端口号,,properties,yml获取配置项等方法,外观模式及其优缺点,日志代表的信息

本文详细介绍了在SpringBoot项目中如何配置端口号,包括YAML和properties文件的使用,解决硬编码问题。还探讨了日志的配置与设计模式中的外观模式,以及如何处理日志冲突和优化日志级别以提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、回顾

二.如何配置端口号

配置文件,最重要的目的:解决硬编码问题-代码写死

1.常见配置项

yml获取配置项

多次获取配置项(yml会对我们的参数情况,进行的一定类型转换比如数字10,转换成“10”)

null:使用key后面+-(破折号)

空字符串:key后面之间空着,但是不易读,推荐使用单引号或者双引号扩起来

转义字符

赋值给对象

yml优缺点

三、日志代表的信息:

外观模式(门面模式)

对于设计模式的理解

日志的级别

日志如何去使用


一、回顾

二.如何配置端口号

配置文件,最重要的目的:解决硬编码问题-代码写死

1.常见配置项

使用阶段

Spring配置文件,有三种格式

事实上是:SpringBoot只支持三个文件
1.application.properties
2.application.yaml
3.application.yml  
二和三一致,是一样的,只是后缀名字不一样

1.properties

2.yaml (2和3是一个)

3.yml(yaml,缩写,后缀名字不同而已,现在yml更多)

如果项目中,同时存在properties和yml,properties的优先级更高

企业开发中,通常只使用其中一个文件

配置文件格式

properties(这个key-value的键值对格式):

server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test....省略

如何获取配置项:

//properties里面写这个东西
demo.key1=hello.properties
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 PropertiesController {
//使用@Value注解
    @Value("${demo.key1}")
    private String key1;
    @RequestMapping("readKey")
    public String readKey(){
        return "读取到的配置项key1"+key1;
    }
}
去掉$符号之后,他就不取出来配置项,而是把配置项当成字符串打印了

yml文件格式(把.换成冒号+换行,注意端口号那里有空格,⚠️格式要求比较严格,空格不可以省略)

server:
  port: 8081

要从左边开始写,就像是废物python

 #数据库的相关配置
spring:
  datasource:
    url: jdbc...
    password: root
    username: root

yml获取配置项

demo:
  key1: hello,yml
@RestController
public class YmlController {
    @Value("${demo.key1}")
    public String key1;
    @RequestMapping("/readYml")
    public  String readYml(){
        return key1;
    }
}
多次获取配置项(yml会对我们的参数情况,进行的一定类型转换比如数字10,转换成“10”)
null:使用key后面+-(破折号)
空字符串:key后面之间空着,但是不易读,推荐使用单引号或者双引号扩起来

转义字符
言语可能有些迷惑:慢慢品尝
单引号会对特殊字符进行转义,双引号不会进行转义
原因:\n本身的含义是换行
使用单引号时,内容就表示成了\n,而不是换行,所以认为是转义
使用双引号时候,\n表示成了换行,也就是\n本来的含义(换句话说,他本来就是个女的,你镜子照之后,他还是个女的,你没有那个转义功能)

赋值给对象
package com.example.demo;

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

@Component
//下面这个的含义是说从配置文件中获取这个student给这个对象赋值
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
    private Integer id;
    private  String name;
    private Integer age;
}
//这个是使用的时候记得要加Autowired
 //@Autowired
   // public Student student;

赋值给集合:

假如不加空格,那么这些会变成一个整体,一起赋值给name,长度变成1了

yml优缺点

优点:可读性高,写法简单,易于理解

可支持更多的数据类型,可以简单的表达对象,数组,List,Map等集合之类的

支持更多的编程语言

缺点:不适合写复杂的配置文件(格式要求严格)

与之带来的功能:

热部署:

写的代码,立即被加载,生效了

热加载:

如果代码发生了变动,就会重新部署

如何实现验证码

客户端和服务端都可以生产

1.后端引入依赖

三、日志代表的信息:

左边是时间,INFO表示级别,3353表示当前的PID​​​​​​​

main(进程),com....(打印日志的类),(后面那些是日志内容)

spring帮我们集成了很多的框架

下面是日志的写法

package com.example.captcha1.demos.web;

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

import javax.annotation.PostConstruct;

@RestController
public class LoggerController {
    //从日志工厂(是一个工厂模式),拿到类一个日志对象,要传一个日志名称
    private  static Logger logger= LoggerFactory.getLogger(LoggerController.class);
//这就是相当于起了个进程名字,但是推荐不要这么起名字,最好是要去找到当前进程。
//    private  static Logger logger= LoggerFactory.getLogger("lcl是大王");
    @PostConstruct
    public void print(){
        System.out.println("打印日志");
        logger.info("__没毛病");
    }
}

选择当前选中的org

打印日志和正常print的区别,一个是正常的打印,另一个是如同spring的信息一样

一般日志的进程名建议是起名为当前类

外观模式(门面模式)

用来定义一个统一的接口,用来访问子系统中的一群接口,主要特征是定义一个高层接口,让子系统更容易去使用(像是我们之前写的图书管理系统),就像是家里的灯,要是有一个总开关,就能一个位置打开所有你想开的灯这种。

优点:

减少了系统的相互依赖,实现了客户端和子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端。

提高了灵活性,简化了客户端对于子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可

提高了安全性,可以灵活设定访问权限,不在门面对象中开通方法,就无法访问。

对于设计模式的理解

设计模式是为了解决生活中一些常见的问题的解决方案,就如同象棋中的别人选择当头炮,你选择上马一样,更像是一种套路,模版,可以让我们对身边的问题解决起来更方便。

日志冲突:版本bug,或者是不同框架的bug问题,引入第三方框架还要去不得不去维护多套框架(假如没有日志门面log4j,log4j本身是有他的一套规范,这样我们通过log4j就可以去放心调用)

日志当然也会影响一些性能,所以对于日志,要去适当使用。

日志的级别

日志如何去使用

package com.example.captcha1.demos.web;

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

import javax.annotation.PostConstruct;

@RestController
public class LoggerController {
    //从日志工厂,拿到类一个日志对象,要传一个日志名称
    private  static Logger logger= LoggerFactory.getLogger("lcl是大王");
    @PostConstruct
    public void print(){
        System.out.println("打印日志");
        logger.info("__没毛病");
        logger.error("我是傻子");
        logger.warn("你是傻子");
        logger.info("我们都不聪明");
        logger.debug("你才傻傻都");
        logger.trace("要不要去放烟花呀");
    }
}

 

我们可以看到他只显示了INFO以上的,但是INFO以下的没有显示,因为spring的基础设定是INFO普通事件,但是我们该怎么让这样显示呢?我们可以去配置。让他配置成初始debug级别

application.yml(配置文件)

logging:
  level:
    root: debug

这也就使最基础级别变成了debug

​​​​​​​

<think>我们正在处理用户的问题:在SpringBoot项目中,application.yml配置的server.port无效,而application.properties中相同的配置有效。根据引用内容,我们知道当两个文件同时存在时,application.properties的优先级高于application.yml。因此,如果两个文件都配置了相同的属性,properties文件中的值会覆盖yml文件中的值。但是,用户的问题似乎是:在application.yml配置的端口无效,而在application.properties配置有效。这可能是由于两个文件同时存在,且properties文件中的配置覆盖了yml文件中的配置。然而,用户可能已经删除了properties文件中的端口配置,但问题仍然存在?或者用户可能只配置yml文件,但端口没有生效?需要进一步分析。根据引用[3]中的日志,我们可以看到:-首先加载了application.properties(优先级较高)-然后加载了application.yml(优先级较低)-因此,如果两个文件都有相同的配置properties文件中的配置会生效。所以,解决方案可能是:1.确保只使用一个配置文件(要么用properties,要么用yml),避免冲突。2.如果两个文件都需要存在,那么注意不要在properties文件中设置端口,这样yml文件中的端口设置才会生效。3.如果properties文件中没有设置端口,而yml文件中的端口设置仍然无效,那么可能是其他原因。其他可能的原因:-配置文件的位置问题:SpringBoot会从特定位置加载配置文件,优先级顺序为:项目根目录下的config文件夹>项目根目录>classpath下的config文件夹>classpath根目录。如果多个位置都有配置文件,则高优先级的会覆盖低优先级的。-配置文件的格式错误:yml文件对格式要求严格,缩进必须使用空格,且冒号后面必须有空格。如果格式错误,配置可能不会被正确解析。-端口被其他方式覆盖:例如,通过命令行参数(--server.port=8081)或系统环境变量。因此,解决步骤:1.检查是否同时存在application.properties和application.yml,如果存在,检查application.properties中是否有server.port配置。如果有,要么删除它,要么注释掉,这样yml中的配置才能生效。2.检查yml文件的格式是否正确。例如:server:port:8081注意:port前面的两个空格,冒号后面有一个空格,然后写端口值。3.检查配置文件的位置。确保你修改的yml文件在正确的路径(比如src/main/resources目录下)并且被正确打包。4.检查是否有其他配置源覆盖了端口设置,比如:-操作系统环境变量:SERVER_PORT-命令行参数-其他配置文件(如bootstrap.yml)等5.可以通过开启SpringBoot的调试日志来查看配置加载情况,在application.properties或application.yml中添加:logging.level.org.springframework.web.context.support.StandardServletEnvironment=DEBUG这样在启动时就会打印配置加载的顺序和值,帮助定位问题。如果以上步骤都检查了还是无效,那么可能是项目本身的问题,比如依赖问题或SpringBoot版本问题,但这种情况较少见。因此,我们建议用户按照以下步骤操作:步骤1:确保只有一个配置文件包含端口配置-如果同时存在application.properties和application.yml,请打开application.properties文件,查找server.port配置项,将其注释或删除。步骤2:检查yml文件的格式-确保yml文件中的配置正确缩进,使用空格(不要用制表符),并且冒号后有一个空格。步骤3:检查配置文件的位置-确保yml文件位于src/main/resources目录下,并且打包后位于classpath根目录。步骤4:检查其他配置源-确保没有通过其他方式(如环境变量、命令行参数)设置端口。步骤5:启用调试日志-在配置文件中添加日志级别设置,查看详细的配置加载过程。如果问题仍然存在,请提供更多信息,例如:-项目结构(特别是配置文件的位置)-配置文件的内容(特别是application.yml和application.properties)-启动时的命令行参数-操作系统环境变量(如果有设置SERVER_PORT)下面我们生成相关问题,帮助用户进一步排查或了解相关机制。</think>### Spring Boot 中 application.yml 配置端口无效的解决方案 当 `application.yml` 中配置的 `server.port` 无效而 `application.properties` 有效时,根本原因是 **配置文件的优先级冲突**。根据 Spring Boot 官方规则: 1. **优先级顺序**:`application.properties` > `application.yml` 当两者共存时,`.properties` 文件优先级更高(如引用[1]和引用[3]所示)[^1][^3]。 2. **覆盖机制**: 若 `application.properties` 中存在 `server.port` 配置(即使值为空),它会覆盖 `application.yml` 中的相同配置。 --- ### 逐步排查与解决方案 #### 步骤 1:检查配置文件冲突 - ✅ **删除冗余配置**: 移除 `application.properties` 中所有 `server.port` 相关条目(包括注释掉的配置)。 ```properties # 确保此文件中无 server.port 配置 ``` - ✅ **验证 YAML 格式**: 在 `application.yml` 中确保使用**空格缩进**(非 Tab),且冒号后保留空格: ```yaml server: port: 8081 # 正确:冒号后空格 + 两个空格缩进 ``` #### 步骤 2:检查配置文件位置 Spring Boot 按以下顺序加载配置(优先级从高到低): 1. 项目根目录下的 `/config` 子目录 2. 项目根目录 3. Classpath 下的 `/config` 包 4. Classpath 根目录 👉 **解决方案**: - 检查是否存在**多层级配置文件**(如 `src/main/resources/config/application.yml` 和 `src/main/resources/application.yml`)。 - 删除低优先级位置的重复文件。 #### 步骤 3:排除外部覆盖 以下来源可能覆盖配置文件: - **命令行参数**:启动命令如 `java -jar app.jar --server.port=8080` - **环境变量**:如 `SERVER_PORT=8080`(通过 `export` 或系统设置) - **云平台配置**:如 Kubernetes ConfigMap 或 Spring Cloud Config Server 👉 **验证方法**: 添加调试日志到 `application.properties`: ```properties logging.level.org.springframework.boot.context.properties=DEBUG ``` 启动时观察日志,定位最终生效的配置源[^3]。 #### 步骤 4:检查依赖冲突 某些依赖会隐式修改端口: - **Spring Cloud**:`spring-cloud-starter-kubernetes` 可能读取云配置 - **安全管理库**:如 `spring-boot-starter-security` 的默认重定向 👉 **解决方案**: 在 `pom.xml` 中排除可疑依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-kubernetes</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </exclusion> </exclusions> </dependency> ``` #### 步骤 5:终极验证 创建一个最小化测试: 1. 删除所有配置文件 2. 新建纯净的 `application.yml`: ```yaml server: port: 8081 ``` 3. 启动应用并访问 `http://localhost:8081/actuator/env`,检查端口是否生效。 --- ### 总结建议 | 问题类型 | 解决措施 | |------------------|------------------------------------------| | 优先级冲突 | 删除 `.properties` 中的 `server.port` | | YAML 格式错误 | 校验缩进和冒号空格 | | 外部配置覆盖 | 检查命令行参数、环境变量 | | 依赖库干扰 | 排除云组件或安全依赖 | > **推荐实践**:项目中**统一使用 YAML** 格式(层次清晰,如引用[2]所述)[^2],避免混合配置。若需保留 `.properties` 文件,仅将其用于**非端口相关**的低优先级配置
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值