SpringBoot項目啟動時初始化操作常見的幾種方式
一.前言
通常的我們的項目開發(fā)中,經常會遇到那種在服務一啟動就需要自動執(zhí)行一些業(yè)務代碼的情況。
以下是常見的初始化場景:
1.數據庫初始化:創(chuàng)建表、加載數據。
2.緩存初始化:初始化 Redis 或其他緩存。如數據庫中的配置信息或者數據字典之類的緩存到redis
3.消息隊列初始化:初始化消息隊列的連接和配置。
4.定時任務初始化:設置定時任務的執(zhí)行。
5.Spring Security 配置初始化:設置默認用戶和權限。
6.外部服務連接初始化:初始化與外部服務的連接。等等等......
二.常見的幾種方式
1.使用 CommandLineRunner 或 ApplicationRunner 接口
CommandLineRunner 和 ApplicationRunner 接口可以用于 Spring Boot 啟動時執(zhí)行自定義的代碼。這兩者都提供了一個 run 方法,你可以在其中執(zhí)行啟動時需要的初始化操作。
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 {
// 在應用啟動時執(zhí)行的初始化邏輯
System.out.println("應用啟動時執(zhí)行初始化操作...");
// 可以在這里進行一些數據加載、配置初始化等操作
}
}ApplicationRunner 示例
@Component
public class ApplicationStartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("應用啟動時執(zhí)行初始化操作...");
}
}2.使用 @PostConstruct 注解
@PostConstruct 注解的方法會在 Spring 完成所有 bean 的初始化之后自動執(zhí)行。通常用來執(zhí)行一些初始化的邏輯,比如加載配置、初始化數據等。
@Component
public class MyStartupService {
@PostConstruct
public void init() {
// 這是 Spring 完成所有 bean 初始化后執(zhí)行的代碼
System.out.println("Spring 容器初始化完成,執(zhí)行初始化操作...");
}
}3. 使用 @EventListener 監(jiān)聽 ApplicationReadyEvent 或 ContextRefreshedEvent
Spring 提供了多種事件,可以在這些事件觸發(fā)時執(zhí)行初始化操作。例如,ApplicationReadyEvent 事件在 Spring Boot 應用完全啟動之后觸發(fā),ContextRefreshedEvent 事件在 Spring 上下文刷新之后觸發(fā)。
示例:使用 @EventListener 監(jiān)聽 ApplicationReadyEvent
@Component
public class StartupEventListener {
@EventListener(ApplicationReadyEvent.class)
public void onApplicationReady() {
// 應用完全啟動后執(zhí)行的操作
System.out.println("Spring Boot 應用啟動完成,可以執(zhí)行初始化操作...");
}
}示例:使用 @EventListener 監(jiān)聽 ContextRefreshedEvent
@Component
public class ContextRefreshListener {
@EventListener(ContextRefreshedEvent.class)
public void onContextRefreshed() {
// Spring 容器刷新時執(zhí)行的操作
System.out.println("Spring 容器刷新完畢,執(zhí)行初始化操作...");
}
}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 或其他條件注解,來控制某些初始化邏輯僅在特定環(huán)境下執(zhí)行。
示例:根據 @Profile 條件執(zhí)行初始化
@Component
@Profile("dev") // 僅在 dev 配置下執(zhí)行
public class DevStartupRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("開發(fā)環(huán)境下執(zhí)行初始化操作...");
}
}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("初始化數據...");
// 可以在這里調用數據庫服務或其他業(yè)務邏輯
};
}
}總結
到此這篇關于SpringBoot項目啟動時初始化操作常見的幾種方式的文章就介紹到這了,更多相關SpringBoot項目啟動時初始化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java同步器AQS架構AbstractQueuedSynchronizer原理解析下
這篇文章主要為大家介紹了java同步器AQS架構AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
詳解Java Fibonacci Search斐波那契搜索算法代碼實現
這篇文章主要介紹了詳解Java Fibonacci Search斐波那契搜索算法代碼實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
一文搞清楚Java中Comparable和Comparator的區(qū)別
Java中的Comparable和Comparator都是用于集合排序的接口,但它們有明顯的區(qū)別,文中通過一些實例代碼詳細介紹了Java中Comparable和Comparator的區(qū)別,感興趣的同學跟著小編一起學習吧2023-05-05
spring 整合 mybatis 中數據源的幾種配置方式(總結篇)
因為spring 整合mybatis的過程中, 有好幾種整合方式,尤其是數據源那塊,經??吹讲灰粯拥呐渲梅绞?,總感覺有點亂,所以今天有空總結下,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05

