Spring中@Lazy注解的使用技巧與實(shí)例解析
在Spring框架中,@Lazy注解是一個(gè)非常實(shí)用的功能,它可以幫助我們延遲Bean的初始化時(shí)間,從而優(yōu)化應(yīng)用的啟動(dòng)性能。從Spring 4.0.0開始,@Lazy不僅可以應(yīng)用于@Bean或@Component,還可以直接作用于注入點(diǎn)(如@Autowired、@Inject或@Resource)。這意味著我們可以更靈活地控制Bean的初始化時(shí)機(jī),避免不必要的資源消耗。
一、@Lazy注解的作用
(一)延遲Bean的初始化
在Spring中,默認(rèn)情況下,所有的Bean在容器啟動(dòng)時(shí)都會(huì)被初始化。然而,有些Bean可能并不需要在啟動(dòng)時(shí)立即加載,而是可以在需要時(shí)才進(jìn)行初始化。@Lazy注解正是為了解決這個(gè)問題而設(shè)計(jì)的。它可以將Bean的初始化延遲到第一次被使用時(shí),從而減少應(yīng)用啟動(dòng)時(shí)的資源消耗。
(二)與@Autowired結(jié)合使用
當(dāng)@Lazy與@Autowired一起使用時(shí),它會(huì)延遲依賴Bean的初始化,直到依賴被實(shí)際調(diào)用。這種用法在處理復(fù)雜的依賴關(guān)系時(shí)非常有用,可以避免不必要的初始化開銷。
二、實(shí)例解析
為了更好地理解@Lazy的作用,我們通過一個(gè)簡(jiǎn)單的Spring項(xiàng)目來展示其效果。
(一)代碼示例
1. 普通初始化的Bean
package com.logicbig.example;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
public class MyEagerBean {
@Autowired
@Lazy
private MyLazyBean myLazyBean;
@PostConstruct
public void init() {
System.out.println(getClass().getSimpleName() + " has been initialized");
}
public void doSomethingWithLazyBean() {
System.out.println("Using lazy bean");
myLazyBean.doSomething();
}
}2. 延遲初始化的Bean
public class MyLazyBean {
@PostConstruct
public void init() {
System.out.println(getClass().getSimpleName() + " has been initialized");
}
public void doSomething() {
System.out.println("inside lazy bean doSomething()");
}
}3. 主類
public class LazyExampleMain {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
System.out.println("--- container initialized ---");
MyEagerBean bean = context.getBean(MyEagerBean.class);
System.out.println("MyEagerBean retrieved from bean factory");
bean.doSomethingWithLazyBean();
}
}(二)運(yùn)行結(jié)果
當(dāng)運(yùn)行上述代碼時(shí),輸出如下:
MyEagerBean has been initialized
--- container initialized ---
MyEagerBean retrieved from bean factory
Using lazy bean
MyLazyBean has been initialized
inside lazy bean doSomething()
從輸出中可以看到,MyLazyBean的初始化被延遲到了MyEagerBean調(diào)用doSomethingWithLazyBean()方法時(shí)。
(三)對(duì)比測(cè)試
如果我們將@Lazy注解從MyEagerBean中移除,即:
public class MyEagerBean {
@Autowired
//@Lazy
private MyLazyBean myLazyBean;
...
}運(yùn)行結(jié)果會(huì)變成:
MyLazyBean has been initialized
MyEagerBean has been initialized
--- container initialized ---
MyEagerBean retrieved from bean factory
Using lazy bean
inside lazy bean doSomething()
此時(shí),MyLazyBean會(huì)在容器啟動(dòng)時(shí)被初始化,而不是延遲到第一次使用時(shí)。
三、@Lazy的工作原理
當(dāng)@Lazy注解被應(yīng)用于注入點(diǎn)時(shí),Spring會(huì)為該注入點(diǎn)創(chuàng)建一個(gè)延遲解析的代理對(duì)象,而不是直接初始化目標(biāo)Bean。只有當(dāng)該Bean被實(shí)際調(diào)用時(shí),Spring才會(huì)真正初始化它。
四、總結(jié)
@Lazy注解是Spring框架中一個(gè)非常實(shí)用的功能,它可以幫助我們延遲Bean的初始化,從而優(yōu)化應(yīng)用的啟動(dòng)性能。通過與@Autowired等注解結(jié)合使用,我們可以在需要時(shí)才加載Bean,避免不必要的資源消耗。在實(shí)際開發(fā)中,合理使用@Lazy可以顯著提升應(yīng)用的性能和可維護(hù)性。
到此這篇關(guān)于Spring中@Lazy注解的使用技巧與實(shí)例解析的文章就介紹到這了,更多相關(guān)Spring @Lazy注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解
在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請(qǐng)求,下面這篇文章主要給大家介紹了關(guān)于SpringMVC在Controller層方法的參數(shù)解析的相關(guān)資料,需要的朋友可以參考下2021-12-12
Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝
這篇文章主要介紹了Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡(jiǎn)單封裝,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Java添加事件監(jiān)聽的四種方法代碼實(shí)例
這篇文章主要介紹了Java添加事件監(jiān)聽的四種方法代碼實(shí)例,本文直接給出代碼示例,并用注釋說明,需要的朋友可以參考下2014-09-09
java的三種隨機(jī)數(shù)生成方式的實(shí)現(xiàn)方法
這篇文章主要介紹了java的三種隨機(jī)數(shù)生成方式的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
PostConstruct注解標(biāo)記類ApplicationContext未加載空指針
這篇文章主要為大家介紹了@PostConstruct注解標(biāo)記類ApplicationContext未加載空指針示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java中token的存儲(chǔ)和獲取實(shí)例代碼
關(guān)于java獲取微信Token驗(yàn)證的問題相信很多人都遇見過,尤其是對(duì)剛接觸微信開發(fā)的人來說確實(shí)有點(diǎn)棘手,下面這篇文章主要給大家介紹了關(guān)于Java中token存儲(chǔ)和獲取的相關(guān)資料,需要的朋友可以參考下2022-08-08
Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識(shí)解析
這篇文章主要介紹了Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識(shí)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java代碼優(yōu)化實(shí)現(xiàn)Zip壓縮大文件從30秒到近乎1秒的優(yōu)化過程
本文詳細(xì)介紹了一種使用Java進(jìn)行文件壓縮的優(yōu)化過程,從最初的無緩沖壓縮到使用緩沖區(qū),再到利用NIO的Channel和內(nèi)存映射文件技術(shù),最終實(shí)現(xiàn)壓縮速度的顯著提升,感興趣的可以了解一下2025-09-09

