Spring容器启动时执行代码(数据预热)

文章目录

    • 静态代码块
    • @PostConstruct
    • InitialzingBean
    • CommandLineRunner和ApplicationRunner
    • ServletContextListener
    • 执行顺序

在Java项目中,有时我们需要在应用启动时执行一些初始化代码,比如加载配置、初始化数据库连接池、预热数据等。这些操作对于应用的顺利运行至关重要。以下是一些在Java项目中实现启动时执行代码(预热数据)的常用方式:
SpringBoot:CommandLineRunner和ApplicationRunner。
Spring 提供了接口 InitializingBean,@PostConstruct
静态代码块

静态代码块

@Slf4j
@Component
public class ServletContextListenerImpl {/*** 静态代码块会在依赖注入后自动执行,并优先执行*/static {log.info("Spring容器启动时自动执行静态代码块!");}
}

@PostConstruct

@PostConstruct与@PreDestroy
值得注意的是,这两个注解不属于Spring,它们是源于JSR-250中的两个注解,位于common-annotations.jar中
@PostConstruct注解用于标注在Bean被Spring初始化之前需要执行的方法
@PreDestroy注解用于标注Bean被销毁前需要执行的方法
上面提到过, @PostConstruct 可以在Servlet初始化之前加载一些缓存数据,如:预热数据字典,读取properties配置文件,
使用Redis进行的数据预热,需要项目启动以后,触发第一次调用才能生成缓存,而利用 @PostConstruct 注解能让预热数据在Bean初始化阶段完成,比Redis更早。
@Component+@PostCostruct完成预热

@Slf4j
@Configuration
public class BeanConfiguration {@Autowiredprivate BusinessService businessService;// 模拟预热的数据private static String mysql_data;@PostConstructpublic void construct(){log.info("〓〓〓〓〓〓〓〓〓〓 Autowired 加载完成!!");mysql_data = businessService.demo5();log.info("〓〓〓〓〓〓〓〓〓〓 mysql_data = " + mysql_data);}
}

InitialzingBean

当一个类实现这个接口之后,Spring启动后,初始化Bean时,若该Bean实现InitialzingBean接口,会自动调用afterPropertiesSet()方法,完成一些用户自定义的初始化操作。
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。注意,实现该接口的最好加上Spring的注解注入,比如@Component。
实现 InitializingBean 接口并重写 afterPropertiesSet 方法,可以在 Spring Bean 初始化完成后执行缓存预热,具体实现代码如下

@Component
public class CachePreloader implements InitializingBean {@Autowiredprivate YourCacheManager cacheManager;@Overridepublic void afterPropertiesSet() throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

CommandLineRunner和ApplicationRunner

Spring boot的CommandLineRunner接口主要用于实现在应用初始化后,去执行一段代码块逻辑,这段初始化代码在整个应用生命周期内只会执行一次
@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务
使用方式:
@Component 注解配合 @SpringBootApplication注解一起使用

@Component
public class InitCompetition implements CommandLineRunner {private static Log log = LogFactory.get();@Overridepublic void run(String... args) throws Exception {Date date = new Date();//初始化活动String sql = "update competition set status = ?  where status != ?";Db.use().execute(sql, CompetitionStatus.FINISHED.name(),CompetitionStatus.FINISHED.name());log.info("数据库初始化完成");}
}

Spring Boot应用程序在启动后,会遍历CommandLineRunner接口的实例并运行它们的run方法。也可以利用@Order注解(或者实现Order接口)来规定所有CommandLineRunner实例的运行顺序。
如下我们使用@Order 注解来定义执行顺序。
@Order 注解的执行优先级是按value值从小到大顺序。

@Component
@Order(value=1)
public classMyStartupRunner2 implements CommandLineRunner {@Overridepublicvoid run(String...args) throws Exception {System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 22222222<<<<<<<<<<<<<");}
}@Component
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 执行缓存预热业务...cacheManager.put("key", dataList);}
}

CommandLineRunner 和 ApplicationRunner 区别如下:
方法签名不同:
CommandLineRunner 接口有一个 run(String… args) 方法,它接收命令行参数作为可变长度字符串数组。
ApplicationRunner 接口则提供了一个 run(ApplicationArguments args) 方法,它接收一个 ApplicationArguments 对象作为参数,这个对象提供了对传入的所有命令行参数(包括选项和非选项参数)的访问。
参数解析方式不同:
CommandLineRunner 接口更简单直接,适合处理简单的命令行参数。
ApplicationRunner 接口提供了一种更强大的参数解析能力,可以通过 ApplicationArguments 获取详细的参数信息,比如获取选项参数及其值、非选项参数列表以及查询是否存在特定参数等。
使用场景不同:
当只需要处理一组简单的命令行参数时,可以使用 CommandLineRunner。
对于需要精细控制和解析命令行参数的复杂场景,推荐使用 ApplicationRunner。

ServletContextListener

通过实现ServletContextListener接口,可以在Web应用启动和关闭时执行相应的代码。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class AppContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 初始化代码System.out.println("Web应用启动时执行代码");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 清理代码System.out.println("Web应用关闭时执行代码");}
}

执行顺序

static>@PostConstruct>InitializingBean>ApplicationRunner>CommandLineRunner
@Component
public class Test implements InitializingBean, ApplicationRunner, CommandLineRunner {@PostConstructpublic void init(){System.out.println("PostConstruct 方法执行");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean 方法执行");}@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("这个是测试ApplicationRunner接口");}@Overridepublic void run(String... args) throws Exception {System.out.println("这个是测试CommandLineRunn接口");}
}

运行结果:
PostConstruct 方法执行 InitializingBean 方法执行
这个是测试ApplicationRunner接口 这个是测试CommandLineRunn接口
由此可知: @PostConstruct>InitializingBean>ApplicationRunner>CommandLineRunner,当然如果涉及到类中的static代码块,则是:
static>@PostConstruct>InitializingBean>ApplicationRunner>CommandLineRunner
@PostConstruct、InitializingBean、ApplicationRunner、CommandLineRunner和ServletContextListener都是用于在应用程序初始化和启动阶段执行特定操作的机制,但它们存在一些区别:

  1. @PostConstruct:这是一个注解,用于标记在依赖注入完成后立即执行的方法。@PostConstruct方法在bean的构造函数执行完成后自动调用,用于执行一些初始化操作。它是Spring框架提供的一种方式。
  2. InitializingBean:这是一个接口,实现了它的类可以在依赖注入完成后进行自定义初始化。通过实现afterPropertiesSet()方法,可以在Spring容器创建bean并完成属性注入后进行初始化操作。它是Spring框架提供的一种方式。
  3. ApplicationRunner:这是Spring Boot提供的一个接口,类似于main方法,用于在Spring Boot应用程序启动后运行特定的代码块。通过实现run()方法,在应用程序启动后执行自定义逻辑。它通常用于在应用程序完全启动后执行某些任务,例如加载数据或者启动定时任务。
  4. CommandLineRunner:这也是Spring Boot提供的一个接口,类似于ApplicationRunner,但还允许访问命令行参数。通过实现run()方法,并使用String[] args参数,可以在应用程序启动后执行特定逻辑,并使用命令行参数进行配置。
  5. ServletContextListener:这是Java Servlet规范中定义的接口,用于接收关于ServletContext的生命周期事件通知。通过实现contextInitialized()和contextDestroyed()方法,可以在Web应用程序启动和关闭时执行某些操作,例如初始化资源或释放资源。与前面提到的机制不同,它是针对Web应用程序的。
    总结来说,@PostConstruct和InitializingBean是Spring框架提供的方式,用于在Spring容器中进行bean的初始化操作;ApplicationRunner和CommandLineRunner是Spring Boot提供的方式,在Spring Boot应用程序启动后执行定制化的逻辑;而ServletContextListener是Servlet规范中定义的,在Web应用程序启动和关闭时执行特定操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的创作纪念日(一)——Giser?Noder?不如“Computer”

目录 Giser&#xff1f;Noder&#xff1f;不如“Computer” 一、根源&#xff1a;保持学习习惯的刚需 二、机缘&#xff1a;processOn的另类替代 三、日常&#xff1a;对技术栈丰富的思考 四、成就&#xff1a;保持心态健康的活着 五、憧憬&#xff1a;能一直心态健康的活…

前端实现【 批量任务调度管理器 】demo优化

一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo&#xff0c;能实现简单的任务批量并发分组&#xff0c;过滤等操作。但是还有很多优化空间&#xff0c;所以查找一些优化的库&#xff0c; 主要想优化两个方面&#xff0c; 上篇提到的&#xff1a; 针对 3&…

CSS技巧专栏:一日一例 14-纯CSS实现模拟水波波动填充按钮特效

CSS技巧专栏:一日一例 14-纯CSS实现模拟水波波动填充按钮特效 大家好,今天介绍一个在网上很常见的模拟水波波动要灌满按钮的动画效果,效果下面图所示。 本例图片 案例分析 我们沿着Z轴从上到下数一下一共有几个层: 文字层:白色文字阴影的黑色文字,当鼠标移动上来时候…

黑马点评--给店铺类型查询添加缓存

controller/ShopTypeController.java /*** 店铺分类查询&#xff0c;用于展示首页头部店铺分类* return*/GetMapping("list")public Result queryTypeList() {return typeService.queryList();} service/IShopTypeService.java Result queryList(); service/impl/S…

fatal: Could not read from remote repository. 解决方法

问题描述&#xff1a; Git : fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists。 解决方法&#xff1a; 当在网上尝试大量方法仍然失败的时候&#xff0c;不妨试试这个方法。 在 github 上&…

java手动编译和运行程序

java手动编译和运行程序 1、无package无依赖jar public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");} }$ javac HelloWorld.java $ java -classpath . HelloWorld # 或者 $ java -cp . HelloWorld2、有packag…

探索 Redis 不同集群架构的性能与应用

1. 引言 Redis的集群配置成为了提高数据可靠性和服务可用性的关键。本文将带领大家了解Redis的四种主要集群架构&#xff0c;并重点分析哨兵模式和Redis Cluster架构和优势。 2. Redis的四种集群架构 2.1 单实例Redis 使用单个 Redis 实例提供服务。适用于小规模应用&#…

深度学习在智慧交通中的应用:行人车辆检测与计数系统详解

引言 在现代城市中&#xff0c;行人和车辆的检测与计数对交通管理和城市规划具有重要意义。通过使用深度学习技术&#xff0c;可以实现对行人和车辆的实时检测与计数&#xff0c;提高交通管理的效率。本文将详细介绍如何构建一个基于深度学习的行人车辆检测与计数系统&#xf…

论文阅读:Deformable DETR: Deformable Transformers for End-to-End Object Detection

论文阅读&#xff1a;Deformable DETR: Deformable Transformers for End-to-End Object Detection Deformable DETR: 基于稀疏空间采样的注意力机制&#xff0c;让DCN与Transformer一起玩&#xff01; - 知乎 (zhihu.com) 【Deformable DETR 论文源码解读】Deformable Trans…

The Llama 3 Herd of Models.Llama 3 模型第1,2,3部分全文

现代人工智能(AI)系统是由基础模型驱动的。本文提出了一套新的基础模型,称为Llama 3。它是一组语言模型,支持多语言、编码、推理和工具使用。我们最大的模型是一个密集的Transformer,具有405B个参数和多达128K个tokens的上下文窗口。本文对Llama 3进行了广泛的实证评价。我们…

【error】AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘(库冲突)

conda list conda remove opencv pip uninstall opencv-python conda list pip 同时卸载两个库 pip uninstall opencv-contrib-python opencv-python 没有and 直接写库名 module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法_module cv2.dnn has no attribute d…

实分析与测度论问题的分类

实分析主要研究实数、实数序列、实数极限以及实值函数的分析&#xff0c;而度量空间则是一个具有距离函数的集合&#xff0c;其分类可以从多个角度进行。 实分析 实分析主要关注实数、实数序列、实数极限以及实值函数的分析。它涉及到多个重要的概念和理论&#xff0c;包括但…

Linux - 环境变量、程序地址空间、进程地址空间及Linux2.6内核进程调度队列

目录 环境变量 基本概念 常见环境变量 查看环境变量的方法 测试PATH 测试HOME 测试SHELL 和环境变量相关的命令 环境变量的组织方式 通过代码获取环境变量 通过系统调用获取环境变量 程序地址空间 进程地址空间 Linux2.6内核进程调度队列 一个CPU拥有一个runqueue 优先级 活…

谈一谈爬虫开发工程师

爬虫就只是抓数据的吗&#xff1f;并不是&#xff0c;爬虫工程师的工作不再仅仅是抓取数据&#xff0c;还需要处理其他各种复杂问题&#xff0c;今天我们就来聊聊爬虫开发工程师。 一、 爬虫开发工程师工作内容 爬虫开发工程师是负责编写和维护网络爬虫程序的专业人员。他们的…

Springboot与SpringSecurity使用(2):授权、自定义异常处理

一、用户授权 在SpringSecurity中&#xff0c;会使用默认的FilterSecurityInterceptor来进行权限校验。在FilterSecurityInterceptor中会从SecurityContextHolder获取其中的Authentication&#xff0c;然后获取其中的权限信息。判断当前用户是否拥有访问当前资源所需的权限。Sp…

2024-HW最新漏洞整理及相应解决方案(一)

前言&#xff1a; 漏洞是基于部分安全厂家、软件厂商的公众号或官方网站&#xff0c;以及一些非官方渠道等途径整理的HW安全漏洞情报&#xff0c;情报里附含漏洞详情和解决方案。护网期间我将持续更新分享&#xff0c;希望可以在护网期间帮助到大家 漏洞 用友U8CLOUDv3.6版本以…

c++初阶篇(七):类和对象(日期类)

1.头文件 定义了日期类&#xff0c;给出了类成员变量及成员函数的声明 #pragma once #include<iostream> #include<assert.h> using namespace std; class Date{public:friend ostream& operator<<(ostream& out, const Date& d);friend istre…

计算机网络中的 IPv6 部署与转换

背景介绍 随着互联网的迅速发展&#xff0c;IPv4 地址资源日益枯竭&#xff0c;无法满足未来互联网设备连接的需求。为了解决这一问题&#xff0c;IPv6 应运而生。IPv6&#xff08;互联网协议第六版&#xff09;提供了比 IPv4 更大的地址空间、更好的安全性和扩展性。然而&…

【多模态大模型】 ALBEF in NeurIPS 2021

一、引言 论文&#xff1a; Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 作者&#xff1a; Salesforce Research 代码&#xff1a; ALBEF 特点&#xff1a; 该方法使用ViT进行图像特征提取&#xff0c;提出将BERT分两部分&am…

Cocos Creator2D游戏开发(3)-飞机大战(1)-背景动起来

资源见: https://pan.baidu.com/s/1cryYNdBOry5A4YEEcLwhDQ?pwdzual 步骤 1, 让背景动起来 2, 玩家飞机显现,能操控,能发射子弹 3.敌机出现 4. 碰撞效果(子弹和敌机,敌机和玩家) 5. 积分和游戏结束 6. 游戏存档,对接微信小游戏,保存历史最高分 7. cocos发布到微信小游戏 资源…