深入解析Spring框架中的@Lazy注解

Spring,作為Java開發(fā)的重要框架蔚晨,其獨(dú)特的依賴注入和控制反轉(zhuǎn)的機(jī)制廣受好評。然而肛循,在龐大的Spring生態(tài)中铭腕,一個常被忽略但卻非常有用的注解存在,那就是@Lazy多糠。在這篇文章中累舷,我們將一起探索@Lazy注解的世界,從基礎(chǔ)解析到復(fù)雜應(yīng)用夹孔,深入了解這個實(shí)用工具被盈。

@Lazy注解簡介

@Lazy,顧名思義搭伤,該注解背后的理念就是“惰性”只怎。在Spring的默認(rèn)行為中,所有的bean會在容器啟動時創(chuàng)建怜俐。但是身堡,如果我們將@Lazy注解應(yīng)用在某個bean上,那么這個bean將被延遲創(chuàng)建拍鲤,直到第一次被需要的時候贴谎。通過使用@Lazy注解,我們能更為靈活地管理bean的生命周期季稳,優(yōu)化應(yīng)用啟動時間擅这,提高系統(tǒng)的響應(yīng)能力。

@Lazy注解的使用

使用 @Lazy 注解非常的直接和簡單景鼠,你只需要將它放在你想要延遲初始化的bean前面即可仲翎。

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

@Lazy
@Component
public class LazyBean {
    public LazyBean() {
       System.out.println("LazyBean 初始化...");
    }
}

在上述代碼中,我們可以看到,當(dāng)Spring IoC容器啟動時谭确,并沒有輸出"LazyBean 初始化…"的信息帘营,這就證明了LazyBean并沒有在啟動時被初始化。

@Lazy注解的工作原理

要理解@Lazy的工作原理逐哈,我們需要先了解Spring容器的初始化過程芬迄。在Spring應(yīng)用中,對象的創(chuàng)建和初始化通常在Spring IoC容器創(chuàng)建的時候完成昂秃。但是禀梳,當(dāng)使用了@Lazy注解之后,標(biāo)記為@Lazy的Bean將在第一次被引用時才完成初始化操作肠骆。

@Lazy注解的高級應(yīng)用

示例1:@Lazy與@ConfigurationProperties結(jié)合使用

在使用Spring Boot時算途,我們經(jīng)常會將配置信息映射到一個配置類中。如果這個配置信息只有在特定情況下才需要蚀腿,那么可以結(jié)合@Lazy注解嘴瓤,使得配置類的創(chuàng)建被延遲。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

@Lazy
@Configuration
@ConfigurationProperties(prefix = "expensive.config")
public class ExpensiveConfiguration {

    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    // 其他需要映射的屬性和方法
}

在這個例子中莉钙,ExpensiveConfiguration類會根據(jù)expensive.config前綴在配置文件中查找對應(yīng)的屬性進(jìn)行映射廓脆。通過@Lazy注解,只有在實(shí)際需要訪問這些屬性的時候磁玉,Spring才會創(chuàng)建和初始化這個配置類的實(shí)例停忿。

示例2:結(jié)合@Lazy和@Profile注解動態(tài)激活Bean

Spring框架的@Profile注解允許根據(jù)不同的環(huán)境激活特定的Bean。當(dāng)我們想要根據(jù)環(huán)境動態(tài)地延遲加載某些Bean時蚊伞,可以將@Lazy注解與@Profile注解結(jié)合使用席赂。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Profile;

@Configuration
public class ProfileSpecificBeanConfig {

    @Bean
    @Profile("development")
    public Service devService() {
        return new DevelopmentService();
    }

    @Bean
    @Profile("production")
    @Lazy
    public Service prodService() {
        return new ProductionService();
    }
}

在這個例子中,ProductionService 僅在生產(chǎn)環(huán)境(production)下激活时迫,并且通過@Lazy注解被延遲加載颅停,這有助于避免在應(yīng)用啟動時因?yàn)榧虞d不必要的Bean而增加啟動時間。而DevelopmentService則在開發(fā)環(huán)境(development)下立即加載掠拳,以便開發(fā)者可以立即獲取反饋便监。

示例三:延遲Bean的初始化

使用@Lazy注解,不僅可以延遲Bean的初始化碳想,更可以配合其它注解烧董,例如@Component和@Service,一起進(jìn)行高級的使用胧奔。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

@Service
public class RegularService {

   private final LazyService lazyService;

   @Autowired
   public RegularService(@Lazy LazyService lazyService) {
      this.lazyService = lazyService;
      System.out.println("RegularService 初始化...");
   }
}

@Lazy
@Service
public class LazyService {
    public LazyService() {
        System.out.println("LazyService 初始化...");
    }
}

在這個代碼塊中逊移,LazyService并沒有在RegularService初始化時被初始化,而是等到首次被引用時才完成初始化龙填。

@Lazy注解的局限性和注意事項

盡管@Lazy注解帶來了許多好處胳泉,我們?nèi)员仨毲宄詹妫⒉荒芙鉀Q所有的性能問題。例如扇商,當(dāng)你的bean是singleton(單例)模式凤瘦,并且會被多線程頻繁訪問時,使用@Lazy注解可能會引發(fā)線程安全的問題案铺。

Spring框架的@Lazy注解是一個強(qiáng)大的工具蔬芥,它可以幫助我們更靈活地管理bean的生命周期,優(yōu)化應(yīng)用性能控汉,全面提升項目的質(zhì)量和效率笔诵。我們鼓勵開發(fā)者在實(shí)際開發(fā)中,積極嘗試和應(yīng)用@Lazy注解姑子,為你的Spring應(yīng)用帶來更大的可能性乎婿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市街佑,隨后出現(xiàn)的幾起案子谢翎,更是在濱河造成了極大的恐慌,老刑警劉巖沐旨,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件森逮,死亡現(xiàn)場離奇詭異,居然都是意外死亡希俩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纲辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颜武,“玉大人,你說我怎么就攤上這事拖吼×凵希” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵吊档,是天一觀的道長篙议。 經(jīng)常有香客問我,道長怠硼,這世上最難降的妖魔是什么鬼贱? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮香璃,結(jié)果婚禮上这难,老公的妹妹穿的比我還像新娘。我一直安慰自己葡秒,他們只是感情好姻乓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布嵌溢。 她就那樣靜靜地躺著,像睡著了一般蹋岩。 火紅的嫁衣襯著肌膚如雪赖草。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天剪个,我揣著相機(jī)與錄音秧骑,去河邊找鬼。 笑死禁偎,一個胖子當(dāng)著我的面吹牛腿堤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播如暖,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼笆檀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盒至?” 一聲冷哼從身側(cè)響起酗洒,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枷遂,沒想到半個月后樱衷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酒唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年矩桂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痪伦。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡侄榴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出网沾,到底是詐尸還是另有隱情癞蚕,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布辉哥,位于F島的核電站桦山,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏醋旦。R本人自食惡果不足惜恒水,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饲齐。 院中可真熱鬧寇窑,春花似錦、人聲如沸箩张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饮笛,卻和暖如春咨察,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背福青。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工摄狱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人无午。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓媒役,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宪迟。 傳聞我的和親對象是個殘疾皇子酣衷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容