javascript
Spring @Lazy批注用例
Spring框架幾乎可以毫不費力地為您解決許多常見的編程問題,但是它的某些功能比其他功能鮮為人知。 在本文中,我們將仔細研究屬于該組的@Lazy批注。 閱讀了幾個示例之后,您應該能夠將注釋應用于日常開發任務。
1. @懶豆初始化
Spring的默認行為是在應用程序啟動時創建所有定義的bean。 如果我們考慮到這樣的初始化可能會非常耗時的事實,那么在用戶開始負擔服務器負擔之前執行繁重的操作似乎是合理的。
但是,我們是否真的總是需要將所有應用程序組件加載到內存中? 您可能聽說過帕累托原理及其適用于軟件開發的事實 。 在識別出較少使用的功能之后, 值得考慮對連接的bean進行延遲初始化,尤其是當它們消耗寶貴的資源時 。
如何使豆子變得懶惰? 根據聲明此類bean的方式,有兩種選擇。 如果聲明中使用@Bean注釋的@Configuration類,你就必須與@Lazy標注來標記它:
@Configuration class SomeConfig {@Lazy@BeanLazyResource lazyResource() {return new LazyResource();}}如果Bean使用組件注釋之一,并且由組件掃描過程發現,則@Lazy注釋可以直接在Bean類中使用:
@Lazy @Component class LazyResource {//... }@Lazy也可以直接在@Configuration類上使用。 在這種情況下, 該類中定義的所有@Bean對象都會被延遲初始化。
值得記住的是, 用 @Lazy 標記bean 并不意味著其依賴項也被延遲了初始化。 如果您對懶豆圖初始化感興趣,可以通過以下方法實現:
2. @惰性注入–延遲首次創建bean的時間
在bean定義旁邊, @Lazy批注還可用于注入點,例如構造函數,構造函數的參數,字段和setter 。 下面是一個對整個構造函數進行延遲注入的示例( 由于從Spring 4.3開始不再使用@Autowired注釋,因此省略了它),這意味著所有定義的依賴項都將受到注釋的影響。
@Component class RootResource {private final ResourceDependency dependency;@LazyRootResource(ResourceDependency dependency) {this.dependency = dependency;}}無論使用哪種注入方法,在所有情況下都將提供代理對象,而不是引用實際依賴項。
重要的是要理解, 如果一個關系用@Lazy標記,這并不意味著要推遲依賴bean的創建。 如果從屬bean沒有被@Lazy本身標記,它將由Spring容器急切地創建。 這種行為得出的結論是, 延遲注入應該主要與延遲初始化一起使用 。
讓我們考慮一個示例,其中有兩個相關的bean。 第一個bean標記有@Lazy :
@Lazy @Component class LazyResource {//... }急于初始化的另一個bean取決于第一個,但是注入點標記為@Lazy:
@Component class RootResource {private final LazyResource dependency;@LazyRootResource(LazyResource dependency) {this.dependency = dependency;}void useLazyDependency() {dependency.use();}}在所描述的方案中,當創建RootResource類的新實例時,其依賴關系未初始化。 LazyResource的新實例是在實際需要時構建的 。 在此示例中,這是第一次調用useLazyDependency()方法的時刻。 通過從RootResource的構造函數中刪除@Lazy ,必須在注入之前執行LazyResource Bean的初始化。
3.使用@Lazy注入解決循環依賴
應用程序中的循環依賴關系被認為是一種不良的設計模式,但是,如果您沒有看到所面臨問題的任何替代解決方案,那么惰性注入可能會派上用場。
一旦您嘗試在兩個bean之間創建一個循環,Spring將通過類似于以下所示的消息通知您有關此問題的信息:
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批注僅在注入點之一上是必需的。 首先將創建一個將其依賴項標記為懶惰的依賴項。
4.渴望的豆與@Lazy(false)
盡管與@Lazy批注的第一個關聯是按需創建bean的可能性,但它也可以實現相反的效果-渴望初始化。 當您遇到@Lazy批注并了解其存在時,您很可能沒有注意到它實際上可以接受其他布爾值屬性,該屬性指示是否應進行惰性初始化。
您的第二個想法可能是使用@Lazy(false)實際上是無用的,因為您只需刪除注釋即可實現相同的效果,對嗎? 如果考慮使用Spring的簡單默認行為,那是絕對正確的,但是生活并不總是那么簡單。
當應用程序的啟動確實很慢時,您可以考慮對所有托管bean進行延遲初始化,以改善開發體驗。 但是, 有時有bean應該始終進行初始化,即使已使用 @ComponentScan(lazyInit = true) 全局禁用了急切的初始化 。 那就是@Lazy(false)進來的時候。
@Lazy(false) @Component class AlwaysEagerResource {//... }結論
熟悉@Lazy批注的要求不是很高,因為它僅接受一個屬性,并且只能在少數地方使用。 但是,考慮到它的多種用途,值得意識到它的存在。 如果您發現該文章有用,請與您的同事和同事分享。 您知道@Lazy扮演主要角色之一的其他有用技巧嗎? 如果您愿意,請立即在評論中添加評論。
翻譯自: https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.html
總結
以上是生活随笔為你收集整理的Spring @Lazy批注用例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Priam设置Cassandra
- 下一篇: mapreduce 算法_MapRedu