成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

請一定記??!Spring Boot 執行初始化操作的七種王炸手段

開發 前端
在 Spring Boot 應用開發中,初始化操作是非常關鍵的操作。它可以在應用啟動時進行一系列預先設定的任務,例如加載配置文件、初始化數據庫相關操作、預熱緩存數據、注冊全局事件監聽器等。

環境:SpringBoot3.4.2

1. 簡介

在 Spring Boot 應用開發中,初始化操作是非常關鍵的操作。它可以在應用啟動時進行一系列預先設定的任務,例如加載配置文件、初始化數據庫相關操作、預熱緩存數據、注冊全局事件監聽器等。

合理的初始化能讓應用啟動即穩定高效。但很多開發者對 Spring Boot 提供的豐富初始化手段了解不深。別擔心,本篇文章將為你詳細介紹 Spring Boot 提供的 7 種初始化操作,通過代碼示例,助你輕松掌握,靈活運用。

環境準備:準備下面的類,后續介紹的示例代碼都會基于下面的類進行。

@Service
public class CommonService {
}
@Component
public class PackComponent {
  @Resource
  private CommonService commonService ;
}

2. 實戰案例

2.1 @PostConstruct注解

該注解應用在Bean的方法上,在Bean的依賴注入完成以后執行。

// 構造函數中打印注入的CommonService
public PackComponent() {
  System.err.printf("執行構造函數, commonService: %s%n", this.commonService) ;
}
// 添加初始化方法
@PostConstruct
public void init() {
  System.err.printf("@PostConstruct 執行初始化方法init, commonService: %s%n", this.commonService) ;
}

啟動容器,輸出結果:

執行構造函數, commonService: null
@PostConstruct 執行初始化方法init, commonService: CommonService@7cfb4736

適用場景:單個Bean的簡單初始化(如緩存預熱、資源加載等)。

注意:

@PostConstruct  注解類型在 JDK 6 到 JDK 8 期間是標準 Java 庫的一部分。然而,在 JDK 9 中,整個 javax.annotation 包從核心 Java 模塊中分離了出來,并最終在 JDK 11 中被移除。自 Jakarta EE 9 起,該包現在位于 jakarta.annotation 之下。

2.2 InitializingBean接口

只需將我們的Bean實現該接口并重寫afterPropertiesSet()方法。

@Component
public class PackComponent implements InitializingBean {
  // ...
  @Override
  public void afterPropertiesSet() throws Exception {
    System.err.printf("InitializingBean初始化bean, "
        + "commonService: %s%n", this.commonService) ;
  }
}

啟動容器,輸出結果:

執行構造函數, commonService: null
InitializingBean初始化bean, commonService: CommonService@3811510

適用場景:說不出有什么特別的場景??。不過來看看官方的建議是怎么說的:

建議您不要使用 InitializingBean 接口,因為它會將代碼不必要地耦合到 Spring上。相反,我們建議使用 @PostConstruct 注解,或者指定一個 POJO 的初始化方法。

注意:該初始化動作在@PostConstruct之后執行。

2.3 @Bean的initMethod屬性

通過@Bean注解定義bean時,我們可以通過設置initMethod屬性來指定執行的初始化方法。

現有如下的類:

public class ThirdPartyComponent {
  public void init() {
    System.err.println("ThirdPartyComponent init...") ;
  }
}

配置該類為Bean對象:

@Bean(initMethod = "init")
ThirdPartyComponent thirdPartyComponent() {
  return new ThirdPartyComponent() ;
}

啟動容器,輸出結果:

ThirdPartyComponent init...

適用場景:第三方類(無法直接添加注解)的初始化。

注意:該初始化操作的執行是在@PostConstruct和InitializingBean之后執行。

2.4 ApplicationRunner或CommandLineRunner

將我們的bean實現其中任何一個接口都可以,在Spring Boot應用啟動完成后執行。

執行時機:會在ApplicationContext上下完全準備就緒以后(refresh之后)。

@Component
public class PackComponent implements CommandLineRunner {
  @Override
  public void run(String... args) throws Exception {
    System.err.println("通過CommandLineRunner執行初始化動作...") ;
  }
}

啟動容器,輸出結果:

圖片圖片

應用啟動完成以后執行相應的Runner接口回調方法。

ApplicationRunner與CommandLineRunner的區別在于接收命令行參數方式不同。ApplicationRunner的回調方法接收ApplicationArguments參數,該對象支持解析命令行參數(如--key=value);CommandLineRunner則是直接接收原始命令行參數(String[])。

適用場景:應用啟動后執行全局任務(如數據初始化,資源檢查等)。

2.5 監聽ContextRefreshedEvent事件

該事件會在ApplicationContext初始化或刷新完成后觸發(refresh單例bean創建完成以后的最后一步finishRefresh方法),如下:

圖片圖片

@Component
public class PackComponent implements ApplicationListener<ContextRefreshedEvent> {
  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    System.err.println("ApplicationContext初始化完成, 執行初始化操作") ;
  }
}

啟動容器,輸出結果:

圖片圖片

適用場景:適合應用到需Spring上下文初始化完成后執行全局性初始化操作的場景(如:字典數據,緩存,連接外部系統等)。

2.6 SmartInitializingSingleton接口

實現該接口后在所有的單例bean都創建完成以后執行該接口的回調方法afterSingletonsInstantiated()。

執行時機:在@PostConstruct、InitializingBean之后,但在ApplicationRunner之前。

@Component
public class PackComponent implements  SmartInitializingSingleton {
  @Override
  public void afterSingletonsInstantiated() {
    System.err.println("SmartInitializingSingleton執行初始化操作") ;
  }
}

啟動容器,輸出結果:

圖片圖片

使用場景:依賴其他單例 Bean 的而全景初始化(如緩存預熱,與上下文無關的初始化操作等)。

2.7 SmartLifecycle接口

SmartLifecycle 用于組件的生命周期管理。實現該接口可定義自定義初始化(start)和銷毀(stop)邏輯。

執行時機:該接口的調用與2.5介紹的時機一樣finishRefresh中,但是比ContextRefreshedEvent事件先執行。

@Component
public class PackComponent implements SmartLifecycle {
  private volatile boolean running;
  @Override
  public void start() {
    System.err.println("SmartLifecycle 執行初始化操作") ;
    this.running = true ;
  }
  @Override
  public void stop() {
    this.running = false;
  }
  @Override
  public boolean isRunning() {
    return this.running ;
  }
}

啟動容器,輸出結果:

圖片圖片

適用場景:外部資源管理,緩存預熱,異步消息處理等。

責任編輯:武曉燕 來源: Springboot全家桶實戰案例源碼
相關推薦

2021-04-01 13:02:29

SpringBootJava代碼

2024-10-08 09:06:01

Spring應用程序配置

2018-04-28 05:26:11

2024-01-04 12:48:00

Spring

2025-05-13 08:20:58

2024-10-29 11:27:27

2023-09-26 08:20:12

消息隊列RabbitMQ

2023-02-14 08:32:41

Ribbon負載均衡

2014-07-09 17:31:22

桌面虛擬化

2025-04-08 08:01:31

2020-01-14 08:00:00

.NET緩存編程語言

2022-05-10 08:08:01

find命令Linux

2025-01-21 08:00:00

限流微服務算法

2024-10-18 11:32:15

2015-09-16 13:11:23

Java數組初始化

2015-09-21 09:02:39

java數組

2010-10-15 10:02:01

Mysql表類型

2019-09-06 09:00:00

開發技能代碼

2020-01-14 11:09:36

CIO IT技術

2013-01-07 10:14:06

JavaJava枚舉
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产夜恋视频在线观看 | 久久精品国产免费高清 | 欧美欧美欧美 | 韩日一区二区三区 | 成人性视频免费网站 | 人人爱干| 久久国产亚洲 | 天天碰夜夜操 | 日韩精品成人 | 精品不卡 | 男女视频在线观看免费 | 中文字幕日韩欧美一区二区三区 | 毛片a| 日韩欧美精品一区 | 久久只有精品 | 成人妇女免费播放久久久 | 久久久久久国 | 日韩av大片免费看 | 欧美a∨ | 精品99久久 | 91视频在线观看 | 国产91 在线播放 | 亚洲成人福利在线观看 | 男人的天堂久久 | 成人亚洲| 国产一区二区在线观看视频 | 一级片在线观看 | 色婷婷婷婷色 | 欧美一级欧美一级在线播放 | 免费一级片 | 午夜激情小视频 | 色花av| 91欧美精品成人综合在线观看 | 99成人精品| 天天艹天天干天天 | 不用播放器看的av | 欧美日韩国产精品一区二区 | 国产97在线视频 | 欧美日韩国产三级 | 在线免费看91 | 国产精品2|