spring的延遲初始化bean (default-lazy-init 與 lazy-init )
spring的延遲初始化bean (default-lazy-init 與 lazy-init )
轉載:https://blog.csdn.net/lushuaiyin/article/details/7394618
ApplicationContext實現的預設行為就是在啟動時將所有singleton bean提前進行例項化。提前例項化意味著作為初始化過程的一部分,ApplicationContext例項會建立並配置所有的singleton bean。通常情況下這是件好事,因為這樣在配置中的任何錯誤就會即刻被發現(否則的話可能要花幾個小時甚至幾天)。
有時候這種預設處理可能並不是你想要的。如果你不想讓一個singleton bean在ApplicationContext實現在初始化時被提前例項化,那麼可以將bean設定為延遲例項化。一個延遲初始化bean將告訴IoC 容器是在啟動時還是在第一次被用到時例項化。
在XML配置檔案中,延遲初始化將通過<bean/>元素中的lazy-init屬性來進行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>
當ApplicationContext實現載入上述配置時,設定為lazy的bean將不會在ApplicationContext啟動時提前被例項化,而not.lazy卻會被提前例項化。
需要說明的是,如果一個bean被設定為延遲初始化,而另一個非延遲初始化的singleton bean依賴於它,那麼當ApplicationContext提前例項化singleton bean時,它必須也確保所有上述singleton 依賴bean也被預先初始化,當然也包括設定為延遲例項化的bean。因此,如果Ioc容器在啟動的時候建立了那些設定為延遲例項化的bean的例項,你也不要覺得奇怪,因為那些延遲初始化的bean可能在配置的某個地方被注入到了一個非延遲初始化singleton bean裡面。
在容器層次中通過在<beans/>元素上使用'default-lazy-init'屬性來控制延遲初始化也是可能的。如下面的配置:
<beans default-lazy-init="true"> <!-- no beans will be eagerly pre-instantiated... --> </beans>
在同一個檔案中<bean />裡面設定的優先順序大於<beans />裡設定的優先順序:
<beans /> <bean /> immediately
<beans /> <bean lazy-init="true" /> lazy
<beans /> <bean lazy-init="false"/> immediately
<beans default-lazy-init="true"/> <bean /> lazy
<beans default-lazy-init="true"/> <bean lazy-init="true" /> lazy
<beans default-lazy-init="true"/> <bean lazy-init="false" /> immediately
<beans default-lazy-init="false"/> <bean /> immediately
<beans default-lazy-init="false"/> <bean lazy-init="true" /> lazy
<beans default-lazy-init="false"/> <bean lazy-init="false" /> immediately
如果在一個spring配置檔案中引入另外的配置檔案,如:<import resource="classpath:beanss.xml"/>
則以被引入檔案(beanss.xml)中設定的<beans />裡的設定為準,與引入檔案中的設定無關。
<bean id="testInit" lazy-init="true" init-method="init" class="com.test.Test">
</bean>
相關文章
- Spring系列第十二講 lazy-init:bean延遲初始化SpringBean
- Spring Boot 2.2中的延遲初始化Spring Boot
- Spring IoC bean 的初始化SpringBean
- Spring Bean如何初始化的SpringBean
- Spring容器 —— 深入 bean 的載入(五、初始化 bean)SpringBean
- Spring 原始碼(17)Spring Bean的建立過程(8)Bean的初始化Spring原始碼Bean
- 一不小心,你就掉進了Spring延遲初始化的坑!Spring
- Spring Boot 2.2 中的延遲載入Spring Boot
- 【spring原始碼系列】之【Bean的初始化】Spring原始碼Bean
- Spring Boot(十四)RabbitMQ延遲佇列Spring BootMQ佇列
- 延遲繫結與retdlresolve
- 4_Spring Bean的初始化和銷燬SpringBean
- 從原理分析Kotlin的延遲初始化: lateinit var和by lazyKotlin
- spring原始碼深度解析— IOC 之 bean 的初始化Spring原始碼Bean
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 如何才能讓Spring Boot與RabbitMQ結合實現延遲佇列Spring BootMQ佇列
- spring原始碼之bean的初始化及迴圈引用Spring原始碼Bean
- Spring核心——Bean的定義與控制SpringBean
- 延遲繫結
- spring-IOC容器原始碼分析(一)bean初始化流程Spring原始碼Bean
- [20180626]延遲塊清除與只讀表.txt
- RocketMQ系列(五)廣播與延遲訊息MQ
- JMeter定時器設定延遲與同步JMeter定時器
- PostgreSQL中的複製延遲SQL
- 13年過去了,Spring官方竟然真的支援Bean的非同步初始化了!SpringBean非同步
- redis 延遲佇列Redis佇列
- Mybatis延遲查詢MyBatis
- WebGL之延遲著色Web
- Laravel 延遲佇列Laravel佇列
- 疫情延遲 題解
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- Python中排隊理論:吞吐量與延遲Python
- Android WorkManager工作約束,延遲與查詢工作Android
- 高可用延遲佇列設計與實現佇列
- Spring中ref local=""與ref bean=""的區別SpringBean
- Spring中與bean有關的生命週期SpringBean
- Spring原始碼分析之 lazy-init 實現原理Spring原始碼