0

0

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

雪夜

雪夜

发布时间:2025-07-17 10:22:02

|

346人浏览过

|

来源于php中文网

原创

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

spring boot的配置文件是指导spring boot应用运行的重要文件,是一个全局的配置文件。与spring、spring mvc、mybatis等框架的配置文件相比,spring boot的配置文件更加简化,底层默认做了很多配置。spring boot的配置文件默认放在resources目录下,且文件名必须为application

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

工程搭建

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



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.3
        
    
    com.citi
    spring-boot-traps
    0.0.1-SNAPSHOT
    spring-traps
    Demo project for Spring Boot
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.apache.commons
            commons-lang3
            3.8.1
        
    
    
        ${artifactId}
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                        
                    
                
            
        
    

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

执行测试:

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

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

}

执行测试:

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

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

配置文件优先级

工程目录下的配置文件优先级如下:

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

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

验证配置文件优先级:

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

traps:
user:
name: stark in resources/config/
age: 41

执行测试:

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

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

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

traps:
user:
name: stark in root/
age: 41

执行测试:

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

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

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

traps:
user:
name: stark in root/config/
age: 41

执行测试:

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

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

application.yml多环境配置

第一种方式可以使用spring.profile.active指定配置文件。

resources目录下新建两个配置文件application-dev.ymlapplication-test.yml

traps:
user:
name: stark in dev
age: 41
traps:
user:
name: stark in test
age: 41

修改application.yml,使用spring.profile.active指定使用的配置文件:

千问APP
千问APP

阿里最强大模型官方AI助手

下载
spring:
profiles:

指定使用的配置文件

active: test

删除config目录,执行测试:

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

根据控制台的日志可以确定,使用的配置文件为test环境的配置文件。

第二种方式是使用占位符,即启动应用时指定使用哪个环境的配置。修改application.yml

spring:

profiles:

使用占位符

active: ${spring.profiles.active}

使用Maven命令打包,在终端中执行启动命令并指定配置文件:

java -jar spring-boot-traps.jar --spring.profiles.active=test

终端启动日志如下:

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

控制台日志显示使用的配置文件是test

定时任务执行的“陷阱”

Spring Boot中可以非常简单的实现定时任务,而且定时任务有自己独立的线程池,不会影响到业务主线程。

Spring Boot中编写定时任务需要用到两个注解:

  • @EnableScheduling标注在配置类上使@Scheduled注解生效
  • @Scheduled注解标注在方法上,表示这是一个定时任务

@Scheduled注解的参数包括:

  • fixedDelay:上次任务的结束和下次任务的开始之间的固定间隔多少秒
  • fixedRate:上次任务的开始和下次任务开始之间的频率,不管任务是否结束
  • initialDelay:与fixedDelayfixedRate组合使用,指的是第一次任务等待指定的时间后才开始执行
  • cron:表达式配置任务执行时间

编写定时任务类:

新建task目录,新增ScheduledTask类,定义定时任务:

@Component

@Slf4j public class ScheduledTask { @Scheduled(fixedRate = 1000) public void task01() throws InterruptedException { log.info("Scheduled task01 processing"); while (true) { Thread.sleep(2000); log.info("Scheduled Task process something"); } }

@Scheduled(fixedRate = 1000)
public void task02() throws InterruptedException {
    log.info("Scheduled task02 processing");
}

}

在主启动类上增加注解@EnableScheduling,表示启用定时任务。

启动主程序类,观察控制台打印的日志:

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

根据打印的日志可以发现,只有task01在运行,task02并没有运行,这是为什么

点击主启动类上的@EnableScheduling注解,查看ScheduledAnnotationBeanPostProcessor类的源码:

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

其中setScheduler方法的作用就是设置定时任务线程池,而Spring Boot默认使用单线程去执行定时任务,线程一直在task01while中循环,没有多余的线程去执行task02

配置定时任务线程池

配置定时任务线程池的方式有两种,第一种是在application.yml中配置线程池:

application.yml中增加定时任务线程池配置:

spring:
profiles:

指定使用的配置文件

active: test

task: scheduling: pool: size: 5

重新启动应用:

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

根据控制台的打印可以看出,task01task02都执行了。

第二种方式是通过编写配置类ScheduleConfig实现自定义定时任务的线程池:

新增config包,在config包下新增配置类ScheduleConfig

@Configuration
public class ScheduleConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(5);
return taskScheduler;
}
}

注释掉application.yml中的线程池大小配置,重新启动应用:

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

根据控制台日志显示,task01task02都可以正常执行。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

103

2025.08.06

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

135

2023.09.05

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

389

2023.10.12

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

68

2025.08.19

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

33

2025.12.22

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

114

2025.12.24

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

296

2023.08.21

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

3

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号