springboot启动加载
目录
使用@PostConstruct注解
实现InitializingBean接口
实现CommandLineRunner接口
实现ApplicationRunner接口
使用@EventListener注解监听ApplicationReadyEvent事件
应用启动完成之前或者之后,我们需要拿数据库中的一些数据加载到本地缓存中。这些数据一般都是不经常变更而且有被经常读取的,并且数据量不是很大的。这样操作可以减少一些数据库的压力。下面是我们常用的实现方式,具体的要用那种,看对应各自应用的设计和需求。
使用@PostConstruct注解
在需要加载数据的组件中,可以使用@PostConstruct注解的方法,该方法会在Spring容器初始化该类之后自动调用
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class CacheInitializer { @Autowired private YourRepository yourRepository; // 假设你有一个访问数据库的Repository @Autowired private CacheManager cacheManager; // 假设你使用Spring Cache进行缓存管理 @PostConstruct public void init() { // 从数据库中获取数据 List<YourData> dataList = yourRepository.findAll(); // 将数据加载到缓存中 dataList.forEach(data -> { cacheManager.getCache("yourCacheName").put(data.getId(), data); }); }
}
实现InitializingBean接口
它只包含一个方法 afterPropertiesSet()。当一个 bean 的所有属性都被 Spring 容器设置之后(即通过依赖注入),afterPropertiesSet() 方法会被自动调用
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class CacheInitializingBean implements InitializingBean { @Autowired private YourRepository yourRepository; // 假设你有一个访问数据库的Repository @Autowired private CacheManager cacheManager; // 假设你使用Spring Cache进行缓存管理 @Override public void afterPropertiesSet() throws Exception { // 在所有属性被设置之后,执行此方法 // 从数据库中获取数据并加载到缓存中 List<YourData> dataList = yourRepository.findAll(); dataList.forEach(data -> { cacheManager.getCache("yourCacheName").put(data.getId(), data); }); }
}
注:使用 InitializingBean 接口与使用 @PostConstruct 注解的效果类似,但它们在 Spring 生命周期中的调用时机略有不同。@PostConstruct 注解的方法是在依赖注入完成后立即调用,而 InitializingBean 的 afterPropertiesSet() 方法则是在所有属性被设置之后调用。在大多数情况下,这两个选项可以互换使用,具体选择哪个取决于你的个人喜好和项目需求。
实现CommandLineRunner接口
CommandLineRunner接口提供了一个run方法,该方法会在Spring Boot应用启动后立即执行。
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; @Component
public class CacheRunner implements CommandLineRunner { @Autowired private YourRepository yourRepository; @Autowired private CacheManager cacheManager; @Override public void run(String... args) throws Exception { // 从数据库中获取数据并加载到缓存中 List<YourData> dataList = yourRepository.findAll(); dataList.forEach(data -> { cacheManager.getCache("yourCacheName").put(data.getId(), data); }); }
}
实现ApplicationRunner接口
ApplicationRunner接口类似于CommandLineRunner,但提供了更灵活的参数处理方式
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component; @Component
public class CacheApplicationRunner implements ApplicationRunner { @Autowired private YourRepository yourRepository; @Autowired private CacheManager cacheManager; @Override public void run(ApplicationArguments args) throws Exception { // 从数据库中获取数据并加载到缓存中 List<YourData> dataList = yourRepository.findAll(); dataList.forEach(data -> { cacheManager.getCache("yourCacheName").put(data.getId(), data); }); }
}
使用@EventListener注解监听ApplicationReadyEvent事件
Spring Boot在启动完成后会发布一个ApplicationReadyEvent事件,你可以监听这个事件并在事件触发时执行加载数据的逻辑。
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; @Component
public class CacheInitializer { @Autowired private YourRepository yourRepository; @Autowired private CacheManager cacheManager; @EventListener(ApplicationReadyEvent.class) public void onApplicationReadyEvent() { // 从数据库中获取数据并加载到缓存中 List<YourData> dataList = yourRepository.findAll(); dataList.forEach(data -> { cacheManager.getCache("yourCacheName").put(data.getId(), data); }); }
}
需要注意的是,加载数据的操作应该尽可能快地完成,避免延迟应用的启动时间。如果加载数据量非常大,你可能需要考虑异步加载或延迟加载的策略。
相关文章:
springboot启动加载
目录 使用PostConstruct注解 实现InitializingBean接口 实现CommandLineRunner接口 实现ApplicationRunner接口 使用EventListener注解监听ApplicationReadyEvent事件 应用启动完成之前或者之后,我们需要拿数据库中的一些数据加载到本地缓存中。这些数据一般都…...
基于Java的智能停车场管理系统(Vue.js+SpringBoot)
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…...
ESD Clamp cell是什么?
ESD CLAMP cell(静电放电钳位单元)是一种专门设计来保护集成电路(IC)免受静电放电(ESD)损害的电路元件。静电放电是在电子设备的组件之间或内部发生的突然电流放电,它可能会损坏电路或降低其性能…...
费率电能表
费率电能表是一种用于测量家庭、商业和工业用电的设备,有效的实现分段计费、分时计费,优化用电效率。费率电能表的产生是为了缓解高峰期的用电负荷,平衡各时间段的用电负荷;根据当地用电负荷曲线情况制定时段费率 在费率电能表中…...
2张图2秒钟3D重建!这款AI工具火爆GitHub,网友:忘掉Sora
只需2张图片,无需测量任何额外数据—— 当当,一个完整的3D小熊就有了: 这个名为DUSt3R的新工具,火得一塌糊涂,才上线没多久就登上GitHub热榜第二。 ▲image 有网友实测,拍两张照片,真的就重建…...
C++高级面试题:请解释 C++ 中的指针和引用之间的区别。
请解释 C 中的指针和引用之间的区别。 在 C 中,指针(Pointers)和引用(References)都是用于处理内存地址的工具,但它们有一些重要的区别: 语法和用法: 指针使用 * 运算符来访问其所…...
Git 配置处理客户端无法正常访问到 github 原网站时,npm 下载依赖包失败的问题
Git 配置处理客户端无法正常访问到 github 原网站时,npm 下载依赖包失败的问题 使用 github 的镜像网站地址或类似的替代产品地址,代替到 npm 拉取依赖包的 git 地址本地Git配置 例如:执行一下命令,则是以https://kgithub.com 替…...
前端爬虫+可视化Demo
爬虫简介 可以把互联网比做成一张 “大网”,爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流:Demo实现前置知识: JS 基础Node 基础 (1)爬虫基本工作流程: 向…...
keepAlive
router c.js const view (name) > () > import(/views/文件夹名/ name) export const c [ {path: /xxx,name: aaa,meta: {title: 哈哈哈,admin: true,keepAlive:true //加这个},component: view(xxx) }, ]adminMain.vue <keep-alive><router-view v-if"…...
蓝桥杯练习题——dp
五部曲(代码随想录) 1.确定 dp 数组以及下标含义 2.确定递推公式 3.确定 dp 数组初始化 4.确定遍历顺序 5.debug 入门题 1.斐波那契数 思路 1.f[i]:第 i 个数的值 2.f[i] f[i - 1] f[i - 2] 3.f[0] 0, f[1] 1 4.顺序遍历 5.记得特判 …...
kotlin基础语法
1.变量 var a:Int 2 //声明类型的可变变量 var b 3 //代码推测可变变量类型 val c 6 //代码推测不可变常量类型 var d:String?null //可为null的String类型的可变变量 latei…...
淘宝天猫商家爬虫工具 电商采集软件使用教程
介绍: 淘宝和天猫是中国最大的电商平台之一,商家在这里销售各种商品。在市场竞争激烈的环境下,了解竞争对手的商品信息和价格变化对于电商运营来说非常重要。本文将介绍如何使用Python编写一个简单的淘宝天猫商家爬虫工具,以获取商…...
建库建表时,最容易忽略的10个细节
大家使用 DolphinDB 创建数据库和表时,有时对于分区列、分区类型和排序列的选择并不十分清晰。如果不加注意,可能导致查询速度变慢、数据丢失或插入错误等问题。合理地设置分区列、排序列和分区类型,有助于加快查询速度,减少内存使…...
【基础知识】什么是 PPO(Proximal Policy Optimization,近端策略优化)
什么是 PPO(Proximal Policy Optimization,近端策略优化) PPO(Proximal Policy Optimization,近端策略优化)是一种强化学习算法,由John Schulman等人在2017年提出。PPO属于策略梯度方法&#x…...
程序员如何选择职业赛道?
程序员如何选择职业赛道? 程序员的职业赛道就像是一座迷宫,充满了各种各样的岔路口。每个岔路口都代表着不同的方向,不同的技术领域,不同的职业发展道路。 前端开发 前端开发就像迷宫中的美丽花园,它是用户与网站或应…...
[LeetBook]【学习日记】寻找和为指定数字的连续数字
题目 文件组合 待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组…...
阿里云中小企业扶持权益
为企业提供云资源和技术服务,助力企业开启智能时代创业新范式。阿里云推出中小企业扶持权益 上云必备,助力企业长期低成本用云 一、ECS-经济型e实例、ECS u1实例活动规则 活动时间 2023年10月31日0点0分0秒至2026年3月31日23点59分59秒 活动对象 同时满…...
2核4g服务器能支持多少人访问?并发数性能测评
2核4g服务器能支持多少人访问?支持80人同时访问,阿腾云使用阿里云2核4G5M带宽服务器,可以支撑80个左右并发用户。阿腾云以Web网站应用为例,如果视频图片媒体文件存储到对象存储OSS上,网站接入CDN,还可以支持…...
Anthropic官宣Claude3:建立大模型 推理、数学、编码和视觉等方面 新基准
文章目录 1. product2. Main2.1 核心能力2.2 打榜表现 3. My thoughtsReference Claude 3 在推理、数学、编码、多语言理解和视觉方面,全面超越GPT-4在内的所有大模型,重新树立大模型基准。 1. product https://claude.ai/ 国内暂不能使用,…...
STM32 TIM编码器接口
单片机学习! 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
