阿亮随手记 SpringBoot应用启动预热、@Lazy、Bean作用域、多环境配置

SpringBoot项目如何进行预热?

Spring Boot 里做数据预热 / 缓存预热,我常用这几种方式:

  1. 监听 Spring 容器启动完成事件

监听 ContextRefreshedEvent 或 ApplicationReadyEvent ,

在容器完全启动、所有 Bean 初始化好之后,执行预热逻辑。

  1. 使用 Bean 初始化相关注解/接口
  • @PostConstruct :Bean 初始化之后执行

  • 实现 InitializingBean 重写 afterPropertiesSet 方法

这些是在 Bean 创建完成时就执行,适合早一点加载基础数据。

  1. 使用 Spring Boot 专用启动扩展接口(最推荐)
  • ApplicationRunner

  • CommandLineRunner

它们会在 Spring Boot 应用完全启动成功、准备接收请求之前 执行,

是做数据预热、缓存预热最标准、最合适的方式。

@Lazy解决构造函数循环依赖

字段或 Setter 注入的循环依赖,Spring 靠三级缓存在初始化阶段提前暴露半成品对象来解决。但构造器注入在实例化阶段就需要依赖,此时三级缓存还没介入,所以默认解决不了。

我会在其中一个构造器参数上添加 @Lazy 注解。比如 A 和 B 构造器循环依赖,给 A 构造器里的 B 参数加 @Lazy ,Spring 不会立即创建 B,而是注入一个代理对象。这样 A 就能顺利完成实例化和初始化,放入单例池。当后续首次调用 B 的方法时,代理会触发真实 B 的创建,这时 B 再去依赖注入已经存在的 A,就打破了构造器的循环依赖。

Bean生命周期

  1. singleton(单例)

整个 Spring 容器 内唯一一份。

  1. prototype(原型)

每次获取都创建新对象。

  1. request

每次 HTTP 请求一个新 Bean。

  1. session

每个用户会话一个新 Bean。

  1. application

每个 Web 应用(ServletContext) 一个 Bean。

  1. websocket

每个 WebSocket 长连接一个 Bean。

实际上单例和application是差不多的,一般来说单例是Spring容器级别的,application是Web应用级别的,同一个Web应用一般表现一样,但一个应用有多个Spring容器的时候就单例会有多个,但是Application会有多个

多环境配置

Spring Boot 实现多环境配置,主要通过 Profile 机制来完成:

  1. 我们可以使用 @Profile 注解,标记在配置类或者 Bean 上,

用来指定这个 Bean 或配置在哪个环境下才会被创建、注入,比如 dev、test、prod。

  1. 同时,我们可以创建多个环境配置文件:
  • application-dev.yml

  • application-test.yml

  • application-prod.yml

  1. 然后在主配置文件 application.yml 里,通过

spring.profiles.active 来指定当前激活哪个环境。

  1. 启动项目时,Spring Boot 会根据激活的环境,

自动加载对应的配置文件,并且只注入对应环境的 Bean,

从而实现多环境的切换。

相关推荐
光依旧5 小时前
MCP实战手记系列(十):MCP Server高可用实战
spring boot·高可用·nginx负载均衡·redis哨兵·mcp·微服务容错·resilience4j熔断
Joy T6 小时前
Spring AI 项目中的 pom.xml、application.yml 与 Nacos:从依赖管理到运行配置
spring·nacos·pom.xml·profile·参数配置·application.yml
省钱兄--zs8 小时前
西安24小时自助健身房解决方案实战:系统开发与部署全流程指南
java·spring boot·系统架构·intellij-idea·需求分析
ly768910 小时前
Spring Boot 集成 Elasticsearch 的生产实践:客户端选型、索引生命周期与批量写入容错
spring boot·elasticsearch·索引生命周期·java api client·批量写入
程序猿_极客11 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
oradh11 小时前
Oracle固定执行计划的方法---SQL Plan Baseline
数据库·sql·oracle
bug菌12 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
Lonely丶墨轩12 小时前
用 Vue + Spring Boot + Python 做一个 AI 双人海龟汤游戏:从出题、联机到自动审稿等核心技术设计与实现
spring boot·后端·游戏
fundoit12 小时前
为什么需要 Access Token 和 ID Token 两个令牌
java·spring·架构·github·oauth2
鱼宵13 小时前
Spring AI 流式输出:Flux + SSE 打字机,回答不再干等三秒
java·人工智能·spring·sse·springai·流式输出