你有没有掉进去过这些Spring Boot中的“陷阱“(上)(一)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 你有没有掉进去过这些Spring Boot中的“陷阱“(上)

一、Spring Boot配置文件中的“陷阱”

Spring Boot的配置文件是指导Spring Boot Application运行的重要文件,是一个全局的配置文件;相比较Spring Spring MVC MyBatis框架的配置文件更加简化,底层默认做了很多配置。Spring Boot的配置文件默认放在resources目录下,且文件名必须为application。

Spring Boot存在两种形式的配置文件分别是properties和yml形式,两种配置文件同时存在的情况下,properties格式的配置文件优先级更高,相比之下yml格式配置文件更加简洁明了紧凑且可读性高,Spring Boot支持并推荐使用yml格式配置文件。

工程搭建

新建一个Maven工程spring-boot-traps,在pom.xml文件中添加依赖以及maven插件,完整的pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.citi</groupId>
    <artifactId>spring-boot-traps</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-traps</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- apache 的一些工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>
    <build>
        <!--指定打成JAR包的名字-->
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
复制代码

在com.citi.spring.traps包下新增主启动类TrapsApplication

@SpringBootApplication
public class TrapsApplication {
    public static void main(String[] args) {
        SpringApplication.run(TrapsApplication.class,args);
    }
}
复制代码

在test包的相同路径下增加主启动类的测试类TrapsApplicationTest

@SpringBootTest
public class TrapsApplicationTest {
    @Test
    public void context(){
        ApplicationContext context = new AnnotationConfigApplicationContext("com.citi.spring.traps");
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println("容器中的对象:" + beanDefinitionName);
        }
    }
}
复制代码

执行测试

image.png

Spring 容器可以正常运行

配置文件加载顺序的“陷阱”

使用配置文件给实体类赋值

在entity包下新增UserProperties

@Data
@Component
@ConfigurationProperties(prefix = "traps.user")
public class UserProperties {
    private String name;
    private Integer age;
}
复制代码

@ConfigurationProperties注解可以指定配置文件中配置项的前缀

在application.yml中增加配置

traps:
  user:
    name: stark
    age: 41
复制代码

增加UserProperties的测试类

public class UserPropertiesTest extends TrapsApplicationTest {
    @Autowired
    private UserProperties userProperties;
    @Test
    public void getProperty(){
        System.out.println(userProperties);
    }
}
复制代码

执行测试

image.png

根据控制台打印日志,可以看出UserProperties被成功赋值

配置文件优先级

  • 工程目录下/config/application.yml,优先级最高
  • 工程目录下/application.yml,优先级第二
  • resources/config/application.yml,优先级第三
  • resources/application.yml,优先级第四

不同位置都放置了配置文件,高优先级的配置会覆盖低优先级的配置,多个配置文件是互补的,即取多个文件的并集

验证配置文件优先级

在resource目录下新建config文件夹,增加application.yml

traps:
  user:
    name: stark in resources/config/
    age: 41
复制代码

执行测试

image.png

根据控制台打印出的日志,可以确定resources目录下的application.yml被config目录下的application.yml覆盖了

在工程下目录下新增application.yml

traps:
  user:
    name: stark in root/
    age: 41
复制代码

执行测试

image.png

根据控制台日志打印,可以确定工程根目录下的配置文件覆盖了resource目录下的两个配置文件

在工程根目录下新建config目录,在config目录下新增application.yml

traps:
  user:
    name: stark in root/config/
    age: 41
复制代码

执行测试

image.png

根据控制台日志打印,可以确定工程根目录下config文件下的配置文件的优先级是最高的


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
52 2
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
97 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
3月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
91 2
|
7月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
66 2
|
7月前
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
76 2
|
7月前
|
Java Maven
springboot项目打jar包后,如何部署到服务器
springboot项目打jar包后,如何部署到服务器
461 1
|
7月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
63 1
|
7月前
springboot2.4.5使用pagehelper分页插件
springboot2.4.5使用pagehelper分页插件
190 0
|
7月前
|
缓存 运维 Java
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
65 0
|
8月前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
78 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置