SpringBoot實(shí)現(xiàn)初始化的三種策略模式
前言
Spring Boot是一個(gè)用于快速構(gòu)建基于Spring框架的應(yīng)用程序的開(kāi)發(fā)框架。
它提供了許多便捷的功能和特性,使得開(kāi)發(fā)者可以更加高效地開(kāi)發(fā)和部署應(yīng)用程序。
其中,初始化策略是Spring Boot中一個(gè)重要的概念,它決定了應(yīng)用程序在啟動(dòng)時(shí)如何進(jìn)行初始化和配置。
本文將介紹Spring Boot中的三種主要的初始化策略,幫助讀者更好地理解和應(yīng)用Spring Boot。
幾種初始化策略

默認(rèn)初始化策略
默認(rèn)初始化策略是Spring Boot中最常用的初始化策略之一。它基于約定大于配置的原則,通過(guò)自動(dòng)配置和默認(rèn)值來(lái)初始化應(yīng)用程序的各個(gè)組件。默認(rèn)初始化策略的目標(biāo)是盡可能地減少開(kāi)發(fā)者的配置工作,提供一種快速啟動(dòng)和部署應(yīng)用程序的方式。
在默認(rèn)初始化策略下,Spring Boot會(huì)根據(jù)應(yīng)用程序的依賴和配置自動(dòng)配置各個(gè)組件。它會(huì)掃描應(yīng)用程序的類(lèi)路徑,根據(jù)類(lèi)路徑上的配置文件和注解來(lái)自動(dòng)配置組件。例如,當(dāng)應(yīng)用程序引入了Spring Data JPA依賴時(shí),Spring Boot會(huì)自動(dòng)配置JPA相關(guān)的組件,包括數(shù)據(jù)源、實(shí)體管理器、事務(wù)管理器等。
默認(rèn)初始化策略的優(yōu)點(diǎn)是簡(jiǎn)單、快速和方便。開(kāi)發(fā)者只需要引入相應(yīng)的依賴,Spring Boot就會(huì)自動(dòng)配置和初始化相關(guān)的組件,大大減少了繁瑣的配置工作。同時(shí),Spring Boot提供了一些默認(rèn)的配置值,使得開(kāi)發(fā)者可以快速啟動(dòng)和運(yùn)行應(yīng)用程序。
下面是一個(gè)示例,演示了如何使用默認(rèn)初始化策略來(lái)配置一個(gè)簡(jiǎn)單的Spring Boot應(yīng)用程序:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
}
在這個(gè)示例中,我們使用了@SpringBootApplication注解來(lái)標(biāo)記應(yīng)用程序的入口類(lèi)。這個(gè)注解包含了許多默認(rèn)的配置,包括自動(dòng)掃描、自動(dòng)配置等。我們還定義了一個(gè)簡(jiǎn)單的HelloController,用于處理/hello請(qǐng)求,并返回一個(gè)字符串。通過(guò)運(yùn)行這個(gè)應(yīng)用程序,我們可以在瀏覽器中訪問(wèn)http://localhost:8080/hello,看到返回的字符串"Hello, Spring Boot!"。
通過(guò)這個(gè)示例,我們可以看到默認(rèn)初始化策略的簡(jiǎn)單和便利之處。開(kāi)發(fā)者只需要編寫(xiě)少量的代碼,Spring Boot就會(huì)自動(dòng)配置和初始化應(yīng)用程序的各個(gè)組件,使得開(kāi)發(fā)和部署應(yīng)用程序變得更加快速和方便。
懶加載初始化策略
? 懶加載初始化策略是Spring Boot中的一種初始化策略,它與默認(rèn)初始化策略相反。懶加載初始化策略是指在需要使用某個(gè)組件時(shí)才進(jìn)行初始化,而不是在應(yīng)用程序啟動(dòng)時(shí)就進(jìn)行初始化。這種策略可以減少應(yīng)用程序的啟動(dòng)時(shí)間和內(nèi)存占用,提高應(yīng)用程序的性能。
在懶加載初始化策略下,Spring Boot會(huì)延遲初始化組件,直到它們被使用時(shí)才進(jìn)行初始化。這樣可以避免不必要的初始化和資源占用。例如,當(dāng)應(yīng)用程序引入了Spring Data JPA依賴時(shí),懶加載初始化策略會(huì)延遲初始化JPA相關(guān)的組件,直到第一次使用JPA功能時(shí)才進(jìn)行初始化。
懶加載初始化策略的優(yōu)點(diǎn)是減少了應(yīng)用程序的啟動(dòng)時(shí)間和內(nèi)存占用。由于只有在需要使用某個(gè)組件時(shí)才進(jìn)行初始化,所以可以避免不必要的初始化和資源占用。這對(duì)于大型應(yīng)用程序和資源有限的環(huán)境非常有用。
下面是一個(gè)示例,演示了如何使用懶加載初始化策略來(lái)配置一個(gè)簡(jiǎn)單的Spring Boot應(yīng)用程序:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@RestController
public class HelloController {
@Autowired
private MyService myService;
@GetMapping("/hello")
public String hello() {
return myService.getMessage();
}
}
@Service
@Lazy
public class MyService {
public String getMessage() {
return "Hello, Spring Boot!";
}
}
}
在這個(gè)示例中,我們使用了@Lazy注解來(lái)標(biāo)記MyService組件。這個(gè)注解告訴Spring Boot在需要使用MyService組件時(shí)才進(jìn)行初始化。我們還定義了一個(gè)簡(jiǎn)單的HelloController,通過(guò)myService來(lái)獲取消息,并返回給客戶端。通過(guò)運(yùn)行這個(gè)應(yīng)用程序,我們可以在瀏覽器中訪問(wèn)http://localhost:8080/hello,看到返回的字符串"Hello, Spring Boot!"。
通過(guò)這個(gè)示例,我們可以看到懶加載初始化策略的優(yōu)點(diǎn)。MyService組件只有在需要使用時(shí)才進(jìn)行初始化,這樣可以減少應(yīng)用程序的啟動(dòng)時(shí)間和內(nèi)存占用。這對(duì)于大型應(yīng)用程序和資源有限的環(huán)境非常有用。
自定義初始化策略
? 自定義初始化策略有時(shí)候默認(rèn)和懶加載策略不能滿足我們的要求,此時(shí)可以自定義初始化策略。例如:- ApplicationRunner和CommandLineRunner:這兩個(gè)接口的實(shí)現(xiàn)bean會(huì)在Spring Boot啟動(dòng)后執(zhí)行,我們可以在這兩個(gè)接口的run方法中自定義初始化邏輯。
- 自定義@Bean方法:我們可以在@Configuration類(lèi)中自定義@Bean方法,在方法體中編寫(xiě)初始化邏輯,這個(gè)bean會(huì)在Spring Boot啟動(dòng)時(shí)被調(diào)用。
- 自定義ApplicationListener:實(shí)現(xiàn)ApplicationListener接口,在其onApplicationEvent方法中自定義初始化邏輯。當(dāng)Spring Boot事件被觸發(fā)時(shí)便會(huì)執(zhí)行我們的初始化邏輯。這些都是自定義初始化策略的實(shí)現(xiàn)方式,可以完全按照我們的要求來(lái)控制bean的初始化時(shí)機(jī)。
ApplicationRunner示例:
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
// 自定義初始化邏輯
}
}
- @Bean方法示例:
@Configuration
public class MyConfig {
@Bean
public MyBean myBean() {
// 自定義初始化邏輯
return new MyBean();
}
}
- ApplicationListener示例:
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 自定義初始化邏輯
}
}
總結(jié)
通過(guò)本文的介紹,我們了解了Spring Boot中的三種主要的初始化策略:自動(dòng)配置、條件化配置和顯式配置。自動(dòng)配置是Spring Boot的核心特性之一,它通過(guò)根據(jù)應(yīng)用程序的依賴和配置來(lái)自動(dòng)配置應(yīng)用程序的各個(gè)組件。條件化配置允許開(kāi)發(fā)者根據(jù)特定的條件來(lái)配置應(yīng)用程序的組件,從而實(shí)現(xiàn)更加靈活和可定制的配置。顯式配置則是通過(guò)編寫(xiě)代碼來(lái)手動(dòng)配置應(yīng)用程序的組件,提供了最大的靈活性和控制力。
不同的初始化策略適用于不同的場(chǎng)景和需求。開(kāi)發(fā)者可以根據(jù)具體的情況選擇合適的初始化策略,以滿足應(yīng)用程序的需求。同時(shí),深入理解和掌握Spring Boot的初始化策略,對(duì)于開(kāi)發(fā)高效、可維護(hù)和可擴(kuò)展的應(yīng)用程序也是非常重要的。
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)初始化的幾種策略模式的文章就介紹到這了,更多相關(guān)SpringBoot 初始化策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springBoot使用openfeign來(lái)遠(yuǎn)程調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了springBoot使用openfeign來(lái)遠(yuǎn)程調(diào)用的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Spring Boot應(yīng)用的極速部署腳本示例代碼
最近在工作中遇到了一個(gè)問(wèn)題,需要極速的部署Spring Boot應(yīng)用,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來(lái)總結(jié)下,這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用的極速部署腳本的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08
java中File類(lèi)的三種創(chuàng)建文件夾方法總結(jié)
這篇文章主要給大家介紹了關(guān)于java中File類(lèi)的三種創(chuàng)建文件夾方法,File類(lèi)代表文件或目錄路徑名的抽象表達(dá)形式,通過(guò)File類(lèi)提供的方法,我們可以很方便地創(chuàng)建文件夾,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
Maven項(xiàng)目中resources配置總結(jié)
這篇文章主要介紹了Maven項(xiàng)目中resources配置總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
IDEA集成git和使用步驟的實(shí)現(xiàn)方法
這篇文章主要介紹了IDEA集成git和使用步驟的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
統(tǒng)一建模語(yǔ)言_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了統(tǒng)一建模語(yǔ)言的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06
SpringBoot3中使用虛擬線程的詳細(xì)過(guò)程
虛擬線程主要解決的問(wèn)題是減少I(mǎi)/O密集型任務(wù)的I/O阻塞,這篇文章主要介紹了SpringBoot3中使用虛擬線程的詳細(xì)過(guò)程,需要的朋友可以參考下2025-06-06
maven項(xiàng)目錯(cuò)誤:找不到或無(wú)法加載主類(lèi)?XXX問(wèn)題
這篇文章主要介紹了maven項(xiàng)目錯(cuò)誤:找不到或無(wú)法加載主類(lèi)?XXX問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
SpringBoot 將多個(gè)Excel打包下載的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot 將多個(gè)Excel打包下載的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12

