详解SpringBoot程序启动时执行初始化代码
作者:stonesingsong 发布时间:2022-05-07 13:36:05
标签:SpringBoot,程序启动,初始化代码
因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis。
在SpringBoot项目下,即在容器初始化完毕后执行我们自己的初始化代码。
第一步:创建实现ApplicationListener接口的类
package com.stone;
import com.stone.service.IPermissionService;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
/**
* @author Stone Yuan
* @create 2017-12-02 21:54
* @description
*/
public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
IPermissionService service = contextRefreshedEvent.getApplicationContext().getBean(IPermissionService.class);
service.loadUserPermissionIntoRedis();
}
}
注意:
1、我们自己的初始化代码写在onApplicationEvent里;
2、ContextRefreshedEvent是Spring的ApplicationContextEvent一个实现,在容器初始化完成后调用;
3、以注解的方式注入我们需要的bean,会报空指针异常,因此需要以代码中的方式获取我们要的bean
第二步:在SpringBootApplication中注册我们刚创建的类
package com.stone;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class YwythApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(YwythApplication.class);
springApplication.addListeners(new ApplicationStartup());
springApplication.run(args);
}
}
利用CommandLineRunner、EnvironmentAware在Spring boot启动时执行初始化代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
//如果有多个这样的类时,可以通过Order指定执行顺序,数值越小执行优先级越高
@Order(value = 0)
public class InitSystemConfig implements CommandLineRunner, EnvironmentAware {
/*
* 在服务启动后执行,会在@Bean实例化之后执行,故如果@Bean需要依赖这里的话会出问题
*/
@Override
public void run(String... args) {
//这里可以根据数据库返回结果创建一些对象、启动一些线程等
}
/*
* 在SystemConfigDao实例化之后、@Bean实例化之前执行
* 常用于读取数据库配置以供其它bean使用
* environment对象可以获取配置文件的配置,也可以把配置设置到该对象中
*/
@Override
public void setEnvironment(Environment environment) {
}
}
来源:https://www.cnblogs.com/stonesingsong/p/7957258.html


猜你喜欢
- 本文实例讲述了C#实现程序等待延迟执行的方法。分享给大家供大家参考。具体如下:[System.Runtime.InteropServices
- 作者:京东零售 张宾1.背景在后台开发中,会经常用到线程池技术,对于线程池核心参数的配置很大程度上依靠经验。然而,由于系统运行过程中存在的不
- 腾讯TBS浏览器服务我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug。这时候腾讯老
- 在Java中对集合进行操作时,有时候需要对类中的equals() 和 hashCode()进行方法重写.IDEA中实现了利用快捷键即可对上述
- StringBuilder内部是由多段char[]组成的半自动链表,因此频繁从中间修改StringBuilder,会将原本连续的内存分隔为多
- 本文实例讲述了Android中Bitmap用法。分享给大家供大家参考,具体如下:一般在android程序中把图片文件放在res/drawab
- 因为我本人很喜欢在不同的页面之间跳转时加点好玩的动画,今天无意间看到一个动画效果感觉不错,几种效果图如下:既然好玩就写在博客中,直接说就是:
- 目录1.系统需求分析1.1 系统功能及框图该项目实现了备忘录的创建,修改,删除,查询,对备忘录数目的统计和软件的说明。1.2 系统需求功能&
- IDEA版本:2020.3具体步骤一、开启IDEA的自动编译【静态】1.File->Settings。2.直接搜索Compiler,选
- 结构体概念在C#中,结构体是值类型,一般适用于表示类似Point、Rectangle、Color的对象值类型能够降低对堆的管理、使用。降低垃
- private void btnSetOk_Click(object sender, EventArgs e) &nb
- 最近做MVC网站时刚好用到,用以提供一个完整的文件夹并压缩下载,正好做个笔记。拷贝文件夹的所有内容到另一个文件夹内:public stati
- 代码如下:using System; using System.Collections.Generic; using S
- spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller publ
- 最近项目需要通过经纬度查询 具体的地址和区域名称,通过查询网络资源,发现提供的大多是得到具体的地址而对区域或城市名称的获取就不是很好把握;在
- PermissionManage项目地址:https://github.com/why168/AndroidProjects/tree/ma
- 本文实例为大家分享了Java基于Socket实现简易版多人聊天室的具体代码,供大家参考,具体内容如下一、 聊天室需求1、一个服务端,多个客户
- //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Te
- 身为一名开发人员,大家都知道,我们经常会在项目中大量的编写许多重复的代码,比如说public Entity find(String id);
- 简介FTP是TCP/IP协议组中的协议之一,包括两个组成部分,一是FTP服务端,二是FTP客户端,其中FTP服务器用来存储文件,用户可以使用