日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring @lazy_Spring @Lazy批注用例

發(fā)布時間:2023/12/3 javascript 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring @lazy_Spring @Lazy批注用例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

spring @lazy

Spring框架幾乎可以毫不費力地為您解決許多常見的編程問題,但是其某些功能比其他功能鮮為人知。 在本文中,我們將仔細研究屬于該組的@Lazy批注。 閱讀了幾個示例之后,您應該能夠?qū)⒆⑨寫糜谌粘i_發(fā)任務。

1. @懶豆初始化

Spring的默認行為是在應用程序啟動時創(chuàng)建所有定義的bean。 如果我們考慮到這樣的初始化可能會非常耗時的事實,那么在用戶開始負擔服務器負擔之前執(zhí)行繁重的操作似乎是合理的。

但是,我們是否真的總是需要將所有應用程序組件加載到內(nèi)存中? 您可能聽說過帕累托原理及其適用于軟件開發(fā)的事實 。 在確定了較少使用的功能之后, 值得考慮對連接的bean進行延遲初始化,尤其是當它們消耗寶貴的資源時 。

如何使豆子變得懶惰? 根據(jù)聲明此類bean的方式,有兩種選擇。 如果聲明中使用@Bean注釋的@Configuration類,你就必須與@Lazy標注來標記它:

@Configuration class SomeConfig {@Lazy@BeanLazyResource lazyResource() {return new LazyResource();}}

如果bean使用組件注釋之一,并且在組件掃描過程中被發(fā)現(xiàn),則@Lazy注釋可以直接在bean類中使用:

@Lazy @Component class LazyResource {//... }

@Lazy也可以直接在@Configuration類上使用。 在這種情況下, 該類中定義的所有@Bean對象都將被延遲初始化。

值得記住的是, 用 @Lazy 標記bean 并不意味著其依賴項也被延遲了初始化。 如果您對懶豆圖初始化感興趣,可以通過以下方法實現(xiàn):

2. @惰性注入–延遲首次創(chuàng)建bean的時間

在bean定義旁邊, @Lazy批注還可用于注入點,例如構(gòu)造函數(shù),構(gòu)造函數(shù)的參數(shù),字段和setter 。 下面是一個在整個構(gòu)造函數(shù)上的惰性注入示例( 由于從Spring 4.3開始不再需要@Autowired注釋,因此省略了它),這意味著所有定義的依賴項都將受到注釋的影響。

@Component class RootResource {private final ResourceDependency dependency;@LazyRootResource(ResourceDependency dependency) {this.dependency = dependency;}}

無論使用哪種注入方法,在所有情況下都將提供代理對象,而不是引用實際依賴項。

重要的是要理解, 如果一個關(guān)系用@Lazy標記,這并不意味著要延遲依賴bean的創(chuàng)建。 如果從屬bean沒有被@Lazy本身標記,它將由Spring容器急切地創(chuàng)建。 這種行為得出的結(jié)論是, 延遲注入應該主要與延遲初始化一起使用 。

讓我們考慮一個示例,其中有兩個相關(guān)的bean。 第一個bean標記有@Lazy :

@Lazy @Component class LazyResource {//... }

另一個急于初始化的bean取決于第一個bean,但是注入點被標記為@Lazy:

@Component class RootResource {private final LazyResource dependency;@LazyRootResource(LazyResource dependency) {this.dependency = dependency;}void useLazyDependency() {dependency.use();}}

在所描述的場景中,當創(chuàng)建RootResource類的新實例時,其依賴關(guān)系未初始化。 LazyResource的新實例是在實際需要時構(gòu)建的 。 在此示例中,這是第一次調(diào)用useLazyDependency()方法的時刻。 通過從RootResource的構(gòu)造函數(shù)中刪除@Lazy ,必須在注入之前執(zhí)行LazyResource Bean的初始化。

3.用@Lazy注入解決循環(huán)依賴

應用程序中的循環(huán)依賴關(guān)系被認為是一種不良的設(shè)計模式,但是,如果您沒有看到所面臨問題的任何替代解決方案,那么惰性注入可能會派上用場。

一旦您嘗試在兩個bean之間創(chuàng)建一個循環(huán),Spring將通過類似于以下所示的消息通知您有關(guān)此問題的信息:

The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | peerResource defined in file [...\dolszewski\blog\PeerResource.class] ↑ ↓ | someResource defined in file [...\dolszewski\blog\SomeResource.class] └─────┘

為了解決這個問題,bean不必被延遲初始化。 @Lazy批注僅在注入點之一上是必需的。 首先將創(chuàng)建一個將其依賴項標記為懶惰的依賴項。

4.渴望的豆與@Lazy(false)

盡管與@Lazy批注的第一個關(guān)聯(lián)是按需創(chuàng)建bean的可能性,但它也可以實現(xiàn)相反的效果-渴望初始化。 當您遇到@Lazy批注并了解其存在時,很可能您沒有注意到它實際上可以接受其他布爾值屬性,該屬性指示是否應進行惰性初始化。

您的第二個想法可能是使用@Lazy(false)實際上是無用的,因為您只需刪除注釋即可實現(xiàn)相同的效果,對嗎? 如果考慮一下Spring的簡單默認行為,那是絕對正確的,但是生活并不總是那么簡單。

當應用程序的啟動確實很慢時,您可以考慮對所有托管bean進行延遲初始化,以改善開發(fā)體驗。 但是, 有時有些bean應該始終進行初始化,即使已使用 @ComponentScan(lazyInit = true) 全局禁用了急切的初始化 。 那就是@Lazy(false)進來的時候。

@Lazy(false) @Component class AlwaysEagerResource {//... }

結(jié)論

熟悉@Lazy批注的要求不是很高,因為它僅接受一個屬性,并且只能在少數(shù)地方使用。 但是,考慮到它的幾種用途,值得了解它的存在。 如果您發(fā)現(xiàn)該文章有用,請與您的同事和同事分享。 您知道@Lazy扮演主要角色之一的其他有用技巧嗎? 如果您愿意,請立即在評論中添加評論。

翻譯自: https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html

spring @lazy

總結(jié)

以上是生活随笔為你收集整理的spring @lazy_Spring @Lazy批注用例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。