官术网_书友最值得收藏!

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ù)加載。

主站蜘蛛池模板: 永州市| 吉木萨尔县| 当涂县| 乌兰县| 武清区| 嘉义市| 米易县| 壤塘县| 栾城县| 新郑市| 双柏县| 玛沁县| 黑山县| 阜南县| 讷河市| 余江县| 沈丘县| 班戈县| 景德镇市| 耒阳市| 峡江县| 辽宁省| 阜宁县| 阿巴嘎旗| 江源县| 东辽县| 潍坊市| 星子县| 太湖县| 台中县| 都兰县| 开封市| 中卫市| 麻阳| 沅江市| 连云港市| 西宁市| 滨州市| 基隆市| 延吉市| 会泽县|