欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot項目速度提升之延遲初始化(Lazy Initialization)詳解

 更新時間:2023年05月11日 10:00:13   作者:不一樣的科技宅  
延遲初始化(Lazy?Initialization)是一種在需要時才創(chuàng)建或加載對象的策略,以減少啟動時間和資源消耗,本文就來講講延遲初始化的具體使用吧

前言

在一個名為種花家的小鎮(zhèn)上,生活著一群熱愛編程的人。他們致力于構(gòu)建出高效、可維護的軟件系統(tǒng),而 Spring Boot 框架成為了他們的不二之選。這個小鎮(zhèn)上的人們每天都在用 Spring Boot 框架創(chuàng)造著令人矚目的應(yīng)用程序。

然而,隨著時間的推移,他們的應(yīng)用程序變得越來越龐大,包含了許多不同的模塊和組件。在應(yīng)用程序啟動的時候,所有的 bean 都會被一次性初始化,這導(dǎo)致了一個令人頭疼的問題:啟動時間變得越來越長了。

小鎮(zhèn)的居民們開始感到困擾。他們意識到,無論是在開發(fā)環(huán)境還是在生產(chǎn)環(huán)境中,啟動時間的長短都直接關(guān)系到他們的工作效率和用戶體驗。于是,他們尋找一種解決方案,希望能夠在保證應(yīng)用程序正常運行的同時,減少啟動時間的開銷。

正當(dāng)大家糾結(jié)不已時,一個編程少俠出現(xiàn)了。他名叫不一樣的科技宅,他告訴大家,有一種叫做"延遲初始化"的策略,可以幫助他們解決這個問題。

據(jù)說,延遲初始化能夠?qū)?bean 的初始化推遲到第一次使用時進行,而不是在應(yīng)用程序啟動時立即初始化。這樣一來,只有當(dāng)某個 bean 真正被需要時,才會進行初始化,避免了不必要的資源消耗和時間開銷。

是什么?

延遲初始化(Lazy Initialization)是一種在需要時才創(chuàng)建或加載對象的策略,以減少啟動時間和資源消耗。在 Spring 中,延遲初始化允許將 Bean 的創(chuàng)建推遲到第一次訪問該 Bean 時才進行,而不是在應(yīng)用程序啟動時立即創(chuàng)建。

有啥用?

節(jié)省資源

當(dāng)應(yīng)用程序中存在大量的 bean 時,立即初始化所有 bean 可能會占用大量的內(nèi)存和處理時間。通過延遲初始化,只有在需要使用 bean 時才會進行初始化,可以避免不必要的資源消耗。

加快啟動時間

延遲初始化可以減少應(yīng)用程序啟動時間,因為只有在需要時才會加載和初始化 bean。對于那些在應(yīng)用程序啟動時可能不會使用的較大或復(fù)雜的 bean,延遲初始化可以顯著加快啟動時間。

解決循環(huán)依賴

Spring 容器可以管理 bean 之間的依賴關(guān)系。當(dāng)存在循環(huán)依賴時,延遲初始化可以幫助解決這個問題。通過延遲初始化,Spring 容器可以在運行時逐個解析和滿足 bean 之間的依賴,而不是在初始化階段發(fā)現(xiàn)無法解決的循環(huán)依賴。

如何實現(xiàn)?

Spring Boot 中實現(xiàn)延遲初始化 Bean,可以采取以下四種方法:

1.對于使用注解配置的 Bean,可以在 Bean 的定義上使用 @Lazy 注解來實現(xiàn)延遲初始化。

示例:

@Lazy
@Component
public class MyBean {
    // Bean 的定義
}

2.對于使用 Java 配置類的方式,可以在 @Bean 注解上使用 @Lazy 注解,以實現(xiàn)延遲初始化。

示例:

@Configuration
public class AppConfig {
    @Lazy
    @Bean
    public MyBean myBean() {
        // Bean 的定義
        return new MyBean();
    }
}

3.對于 XML 配置的 Bean,可以在 <bean> 元素上設(shè)置 lazy-init 屬性為 true,以實現(xiàn)延遲初始化。

示例:

<bean id="myBean" class="com.example.MyBean" lazy-init="true" />

4.對于使用@ComponentScan注解,可以配置屬性lazyInit = true 實現(xiàn)某些包下面所有的 bean 延遲初始化。

示例:

package com.example.demo.bean;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
    public MyBean() {
        System.out.println("My bean init success.");
    }
}
@SpringBootApplication
@ComponentScan(value = "com.example.demo.bean", lazyInit = true)
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

全局懶加載

上面演示案例,意味著我們只能對自己實現(xiàn)的 bean 進配置。但是項目中肯定會引入很多第三方的 starter,比如 redis,mq。如果想對引入的第三方庫進行配置,那就不太容易了,所以我們可以開啟全局懶加載。

配置文件增加下面的配置:

spring:
  main:
    lazy-initialization: true  #默認(rèn)false 關(guān)閉

開啟了全局懶加載,想要過濾某個 bean,可以通過設(shè)置 @Lazy(false) 排除。

@Component
@Lazy(false)
public class MyBean {
    public MyBean() {
        System.out.println("My bean init success.");
    }
}

還有一種是通過配置 LazyInitializationExcludeFilter 規(guī)則實現(xiàn)排除。

@Configuration
public class AppConfig {
    @Bean
    LazyInitializationExcludeFilter integrationLazyInitExcludeFilter() {
        return LazyInitializationExcludeFilter.forBeanTypes(MyBean.class);
    }
}

注意的點

@Lazy 注解的使用

要確保在正確的位置使用@Lazy 注解。通常情況下,將其添加在 Bean 的定義上,例如@Component、@Service、@Repository 等注解上。這樣可以確保被標(biāo)記的 Bean 在第一次使用時才會進行初始化。

依賴關(guān)系的處理

懶加載的 Bean 可能會被其他 Bean 所依賴。在處理依賴關(guān)系時,要確保依賴的 Bean 已經(jīng)被初始化或者也進行了懶加載。否則,可能會導(dǎo)致依賴注入失敗或出現(xiàn)異常。

延遲初始化帶來的影響

懶加載雖然可以提高應(yīng)用的啟動性能,但也會帶來一些影響。由于 Bean 的初始化被延遲到第一次使用,因此在初始化時可能會出現(xiàn)較長的延遲,對于需要立即使用的 Bean 可能會造成一定的等待時間。

內(nèi)存消耗的控制

懶加載雖然可以減少應(yīng)用啟動時的內(nèi)存消耗,但也需要注意對內(nèi)存的控制。如果應(yīng)用中存在大量的懶加載 Bean,并且這些 Bean 在實際使用中并不頻繁,可能會導(dǎo)致過多的內(nèi)存占用。因此,需要根據(jù)應(yīng)用的具體情況,合理使用懶加載,避免過度消耗內(nèi)存。

運行時異常的處理

由于懶加載將 Bean 的初始化延遲到運行時,因此在初始化過程中可能會發(fā)生異常。要確保適當(dāng)?shù)靥幚磉@些異常,以防止應(yīng)用的崩潰或不可預(yù)料的行為。

總結(jié)

懶加載是一種延遲加載的技術(shù),用于在需要時才加載資源,而不是在應(yīng)用啟動時加載所有資源。在 Spring Boot 框架中,有兩種方式可以實現(xiàn)懶加載:Spring 懶加載和全局懶加載。無論是懶加載還是全局懶加載,它們都能提升應(yīng)用的性能和效率,避免不必要的資源加載。

在使用 Spring 懶加載需要注意正確的注解使用、處理依賴關(guān)系、延遲初始化帶來的影響、內(nèi)存消耗控制和異常處理等方面。合理地使用可以提高應(yīng)用性能,但也需要綜合考慮應(yīng)用的需求和場景,以確保有效性和穩(wěn)定性。

到此這篇關(guān)于SpringBoot項目速度提升之延遲初始化(Lazy Initialization)詳解的文章就介紹到這了,更多相關(guān)SpringBoot延遲初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java synchronized關(guān)鍵_動力節(jié)點Java學(xué)院整理

    Java synchronized關(guān)鍵_動力節(jié)點Java學(xué)院整理

    在java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。下面通過本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • Android Home鍵監(jiān)聽的實現(xiàn)代碼

    Android Home鍵監(jiān)聽的實現(xiàn)代碼

    這篇文章主要介紹了Android Home 鍵監(jiān)聽的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 如何在Maven項目配置pom.xml指定JDK版本和編碼

    如何在Maven項目配置pom.xml指定JDK版本和編碼

    maven是個項目管理工具,如果我們不告訴它要使用什么樣的jdk版本編譯,它就會用maven-compiler-plugin默認(rèn)的jdk版本來處理,這樣就容易出現(xiàn)版本不匹配的問題,這篇文章主要給大家介紹了關(guān)于如何在Maven項目配置pom.xml指定JDK版本和編碼的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Jpa?Specification如何實現(xiàn)and和or同時使用查詢

    Jpa?Specification如何實現(xiàn)and和or同時使用查詢

    這篇文章主要介紹了Jpa?Specification如何實現(xiàn)and和or同時使用查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入理解Spring中bean的生命周期介紹

    深入理解Spring中bean的生命周期介紹

    本篇文章主要介紹了深入理解Spring中bean的生命周期介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • SpringBoot Jpa 自定義查詢實現(xiàn)代碼詳解

    SpringBoot Jpa 自定義查詢實現(xiàn)代碼詳解

    這篇文章主要介紹了SpringBoot Jpa 自定義查詢實現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java中一些關(guān)鍵字的使用技巧總結(jié)

    Java中一些關(guān)鍵字的使用技巧總結(jié)

    這篇文章主要介紹了Java中一些關(guān)鍵字的使用技巧總結(jié),其中重點講述了this和super兩個關(guān)鍵字的用法,需要的朋友可以參考下
    2015-09-09
  • Springboot @WebFilter無法注入其他Bean的示例問題

    Springboot @WebFilter無法注入其他Bean的示例問題

    這篇文章主要介紹了Springboot @WebFilter無法注入其他Bean的示例問題,本文通過示例代碼給大家分享解決方法,需要的朋友可以參考下
    2021-09-09
  • MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    本文主要詳細(xì)介紹了MyBatis注解開發(fā)中,實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢,文中有詳細(xì)的代碼示例,對學(xué)習(xí)MyBatis有一定的參考價值,需要的朋友可以參考閱讀
    2023-04-04
  • springboot實現(xiàn)rabbitmq的隊列初始化和綁定

    springboot實現(xiàn)rabbitmq的隊列初始化和綁定

    這篇文章主要介紹了springboot實現(xiàn)rabbitmq的隊列初始化和綁定,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評論