- Spring Boot進(jìn)階:原理、實(shí)戰(zhàn)與面試題分析
- 鄭天民
- 771字
- 2022-07-05 09:41:45
2.4.4 不同配置的性能分析
在本小節(jié)中,我們將討論不同類型的Bean配置如何影響應(yīng)用程序性能,并且我們還將討論Bean配置的一些最佳實(shí)踐。
首先要討論的是前面介紹的@ComponentScan注解。因?yàn)樵撟⒔鈺?huì)掃描basePackages指定的包中的所有組件,所以如果所指定包中的組件并不需要在應(yīng)用程序啟動(dòng)時(shí)就全部加載到容器中,那么對(duì)包路徑進(jìn)行精細(xì)化設(shè)計(jì)是一個(gè)實(shí)踐技巧。例如,我們可以通過(guò)設(shè)置一個(gè)列表來(lái)細(xì)化具體的包結(jié)構(gòu)路徑,如代碼清單2-32所示。
代碼清單2-32 在@ComponentScan注解中指定的包結(jié)構(gòu)路徑示例代碼
@Configuration @ComponentScan(basePackages="com.spring.bestpractice.service","com.spring.bestpractice.controller") public class AppConfig { }
然后要討論的是單例模式和原型模式對(duì)性能的影響。在Spring中,當(dāng)把Bean范圍設(shè)置為prototype時(shí),每次請(qǐng)求Bean時(shí),Spring IoC容器都會(huì)創(chuàng)建一個(gè)新的對(duì)象實(shí)例。所以,使用原型模式在創(chuàng)建過(guò)程中會(huì)對(duì)性能產(chǎn)生影響,對(duì)那些初始化過(guò)程需要消耗巨大資源的對(duì)象而言尤其如此,這些對(duì)象常見(jiàn)的有網(wǎng)絡(luò)連接對(duì)象、數(shù)據(jù)庫(kù)連接對(duì)象等。因此,對(duì)這些對(duì)象,應(yīng)該完全避免使用原型模式。或者,我們應(yīng)該在使用前仔細(xì)設(shè)計(jì)并對(duì)性能進(jìn)行充分測(cè)試。
最后一個(gè)值得討論的性能分析點(diǎn)在于Spring IoC容器的延遲加載(Lazy Loading)和預(yù)加載(Preloading)機(jī)制。通過(guò)@Autowired注入的Bean都是在Spring IoC容器啟動(dòng)時(shí)被創(chuàng)建和初始化的,這個(gè)過(guò)程被稱為預(yù)加載。但有時(shí)候,我們希望能夠延遲Bean的加載時(shí)機(jī),這時(shí)候就可以使用@Lazy注解,使用方法如代碼清單2-33所示。
代碼清單2-33 @Lazy注解示例代碼
@Component @Lazy public class HealthRecordServiceImpl implements HealthRecordService { }
添加了@Lazy注解的效果是只有在使用到這個(gè)Bean時(shí)它才會(huì)去初始化,而不是在Spring IoC容器啟動(dòng)時(shí)直接初始化,這樣就可以節(jié)省容器資源。
延遲加載確保在請(qǐng)求時(shí)動(dòng)態(tài)加載Bean,預(yù)加載確保在使用Bean之前加載Bean。Spring IoC容器默認(rèn)使用預(yù)加載。然而,在容器啟動(dòng)時(shí)就加載所有類(即使它們沒(méi)有被使用)并不是一個(gè)明智的決定,因?yàn)橛行〣ean實(shí)例會(huì)非常消耗資源。我們應(yīng)該根據(jù)實(shí)際情況選擇具體的加載方法。如果需要盡快地加載應(yīng)用程序,那么就采用延遲加載;如果需要應(yīng)用程序盡快地運(yùn)行并更快地為請(qǐng)求提供服務(wù),那么就執(zhí)行預(yù)加載。
- Unity 2020 By Example
- JBoss Weld CDI for Java Platform
- C# 7 and .NET Core Cookbook
- TensorFlow Lite移動(dòng)端深度學(xué)習(xí)
- 薛定宇教授大講堂(卷Ⅳ):MATLAB最優(yōu)化計(jì)算
- Getting Started with Gulp
- 愛(ài)上micro:bit
- Julia for Data Science
- Python期貨量化交易實(shí)戰(zhàn)
- 超簡(jiǎn)單:Photoshop+JavaScript+Python智能修圖與圖像自動(dòng)化處理
- 百萬(wàn)在線:大型游戲服務(wù)端開發(fā)
- C++17 By Example
- 深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理
- Building Apple Watch Projects
- Building Clouds with Windows Azure Pack