Spring全局懶加載的優(yōu)劣及使用方法詳解
開啟 Spring 全局 bean 懶加載的好處
- 可以加快啟動速度,當(dāng)服務(wù)依賴很多的時(shí)候,增速非常明顯。
- 服務(wù)啟動時(shí)不用考慮依賴,不需要滿足所有的依賴就可以啟動服務(wù)
- 建議 在 test, qa, dev 等環(huán)境酌情開啟,在自己本機(jī)調(diào)試測試時(shí)可以只測試部分功能,只需要保證需要測試的功能依賴滿足即可
- 生產(chǎn)環(huán)境一般不建議開啟
- 本機(jī)單元測試的時(shí)候使用全局懶加載和 @mock 結(jié)合
開啟 Spring 全局 bean 懶加載的壞處
- 屏蔽了啟動時(shí)對 bean 的依賴檢查,當(dāng) bean 不滿足生成條件的時(shí)候需要等待實(shí)際調(diào)用才會暴露出來
- bean 在第一次使用的時(shí)候才初始化,影響第一次訪問的速度
Spring 懶加載注意事項(xiàng)
- 當(dāng)開啟全局懶加載以后,某個(gè) bean 不希望懶加載時(shí)可以加上 @Lazy(false) 注解
- quarz 定時(shí)任務(wù)不能延遲加載,如果延遲加載的話就可能導(dǎo)致定時(shí)任務(wù)失效
- sdk 靜態(tài)方法調(diào)用會因?yàn)閼屑虞d導(dǎo)致依賴的 bean 無法加載。例如
@Component
public class Client {
private static ServiceA service;
public class Client(ServiceA service) {
Client.service = service
}
// 當(dāng)調(diào)用 Client.hello()方法時(shí)會報(bào)錯
public static String hello() {
return service.hello();
}
}開啟 Spring 全局 bean 懶加載的方式
方法1.Spring boot 2.2 版本以上,可以設(shè)置 spring.main.lazy-initialization=true
方法2. 增加一個(gè)配置類 LazyInitBeanFactoryPostProcessor
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
/**
* 懶加載加快啟動速度
* @author liufang
*/
@Profile(value = {"qa", "dev"})
@Configuration
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
beanFactory.getBeanDefinition(beanName).setLazyInit(true);
}
}
}到此這篇關(guān)于Spring全局懶加載的優(yōu)劣及使用方法詳解的文章就介紹到這了,更多相關(guān)Spring全局懶加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法
線程池(thread pool)是一種線程使用模式。線程過多或者頻繁創(chuàng)建和銷毀線程會帶來調(diào)度開銷,進(jìn)而影響緩存局部性和整體性能。這篇文章主要介紹了一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法,需要的朋友可以參考下2019-07-07
深入解析Java中的InterruptedException從異常處理到最佳實(shí)踐方案
在Java多線程編程中,InterruptedException 是一個(gè)常見但又容易被忽視的異常,本文將通過一個(gè)實(shí)際的日志案例,分析 InterruptedException 的產(chǎn)生原因、影響,并提供合理的解決方案和最佳實(shí)踐,感興趣的朋友一起看看吧2025-06-06
MyBatis的<foreach>以及java代碼的批處理方式
這篇文章主要介紹了MyBatis的<foreach>以及java代碼的批處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot中GlobalExceptionHandler異常處理機(jī)制詳細(xì)說明
Spring Boot的GlobalExceptionHandler是一個(gè)全局異常處理器,用于捕獲和處理應(yīng)用程序中發(fā)生的所有異常,這篇文章主要給大家介紹了關(guān)于Java中GlobalExceptionHandler異常處理機(jī)制的相關(guān)資料,需要的朋友可以參考下2024-03-03

