SpringBoot项目启动时初始化操作常见的几种方式
作者:一个努力成长的咸鱼
一.前言
通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况。
以下是常见的初始化场景:
1.数据库初始化:创建表、加载数据。
2.缓存初始化:初始化 Redis 或其他缓存。如数据库中的配置信息或者数据字典之类的缓存到redis
3.消息队列初始化:初始化消息队列的连接和配置。
4.定时任务初始化:设置定时任务的执行。
5.Spring Security 配置初始化:设置默认用户和权限。
6.外部服务连接初始化:初始化与外部服务的连接。等等等......
二.常见的几种方式
1.使用 CommandLineRunner 或 ApplicationRunner 接口
CommandLineRunner 和 ApplicationRunner 接口可以用于 Spring Boot 启动时执行自定义的代码。这两者都提供了一个 run 方法,你可以在其中执行启动时需要的初始化操作。
CommandLineRunner 接口的 run(String... args) 方法接收启动时传入的命令行参数。
ApplicationRunner 接口的 run(ApplicationArguments args) 方法接收 Spring Boot 应用程序启动时的参数,这些参数可以是键值对格式。
CommandLineRunner 示例
@Component
public class StartupRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 在应用启动时执行的初始化逻辑
System.out.println("应用启动时执行初始化操作...");
// 可以在这里进行一些数据加载、配置初始化等操作
}
}ApplicationRunner 示例
@Component
public class ApplicationStartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("应用启动时执行初始化操作...");
}
}2.使用 @PostConstruct 注解
@PostConstruct 注解的方法会在 Spring 完成所有 bean 的初始化之后自动执行。通常用来执行一些初始化的逻辑,比如加载配置、初始化数据等。
@Component
public class MyStartupService {
@PostConstruct
public void init() {
// 这是 Spring 完成所有 bean 初始化后执行的代码
System.out.println("Spring 容器初始化完成,执行初始化操作...");
}
}3. 使用 @EventListener 监听 ApplicationReadyEvent 或 ContextRefreshedEvent
Spring 提供了多种事件,可以在这些事件触发时执行初始化操作。例如,ApplicationReadyEvent 事件在 Spring Boot 应用完全启动之后触发,ContextRefreshedEvent 事件在 Spring 上下文刷新之后触发。
示例:使用 @EventListener 监听 ApplicationReadyEvent
@Component
public class StartupEventListener {
@EventListener(ApplicationReadyEvent.class)
public void onApplicationReady() {
// 应用完全启动后执行的操作
System.out.println("Spring Boot 应用启动完成,可以执行初始化操作...");
}
}示例:使用 @EventListener 监听 ContextRefreshedEvent
@Component
public class ContextRefreshListener {
@EventListener(ContextRefreshedEvent.class)
public void onContextRefreshed() {
// Spring 容器刷新时执行的操作
System.out.println("Spring 容器刷新完毕,执行初始化操作...");
}
}4.实现org.springframework.beans.factory.InitializingBean接口并重写 afterPropertiesSet()方法
InitializingBean接口只包含一个方法afterPropertiesSet(),凡是继承了InitializingBean接口的类,在初始化时都会调用这方法;
使用方法分为三个步骤:
1、被spring管理 2、 实现InitializingBean接口 3、重写afterPropertiesSet方法
@Component
public class InitializationBeanTest implements InitializingBean{
private static final Logger LOG = LoggerFactory.getLogger(InitializationBeanTest.class);
@Override
public void afterPropertiesSet() throws Exception {
LOG.info("InitializingBean 开始了。。。");
//初始化操作
}
}5.通过 ApplicationRunner 或 CommandLineRunner 配置条件启动
你可以通过 @Profile 或其他条件注解,来控制某些初始化逻辑仅在特定环境下执行。
示例:根据 @Profile 条件执行初始化
@Component
@Profile("dev") // 仅在 dev 配置下执行
public class DevStartupRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("开发环境下执行初始化操作...");
}
}6. 使用 Spring Boot 自定义 Banner
Spring Boot 支持通过配置自定义启动时的 banner 内容。这种方式适合显示一些自定义的欢迎信息或者标识。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MyApplication.class);
app.setBanner((environment, sourceClass, out) -> out.println("My Custom Banner!"));
app.run(args);
}
}7. 初始化数据(例如:使用 @Bean 方法初始化数据库或其他资源)
你还可以通过 @Bean 方法配置 Spring Boot 应用启动时进行数据初始化,或者进行外部服务的连接初始化。
示例:初始化数据库
@Configuration
public class DataInitConfig {
@Bean
public CommandLineRunner initializeData() {
return args -> {
// 在应用启动时加载或初始化数据
System.out.println("初始化数据...");
// 可以在这里调用数据库服务或其他业务逻辑
};
}
}总结
到此这篇关于SpringBoot项目启动时初始化操作常见的几种方式的文章就介绍到这了,更多相关SpringBoot项目启动时初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
