阿亮随手记 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,

从而实现多环境的切换。

相关推荐
我登哥MVP7 分钟前
【SpringMVC笔记】 - 11 - SpringMVC 执行流程
java·spring boot·笔记·spring·tomcat·intellij-idea
Flittly37 分钟前
【SpringSecurity新手村系列】(7)基于资源权限码(Authority)的接口权限控制实战
java·spring boot·安全
Irene19911 小时前
SQL查询优化:NOT EXISTS与LEFT JOIN性能对比
oracle·哈希算法
zhenxin01221 小时前
GitSubmodule避坑指南:从入门到精通
spring boot·后端·spring
他是龙5512 小时前
68:Java 原生反序列化 & SpringBoot 攻防
java·开发语言·spring boot
椰猫子2 小时前
Spring Framework(Bean)
java·前端·spring
2301_800976932 小时前
数据库的基本操作
数据库·sql·oracle
cyber_两只龙宝2 小时前
【Oracle】Oracle之使用DML语言管理表
linux·运维·服务器·数据库·云原生·oracle
阿丰资源3 小时前
基于SpringBoot+MySQL的校园管理系统设计与实现(源码+文档+数据库,直接运行)
数据库·spring boot·mysql
XS0301063 小时前
Java 基础(十)异常
java·开发语言·oracle