spring的延遲初始化bean (default-lazy-init 與 lazy-init )

韓師學子--胖佳發表於2019-02-21

    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>  

 

相關文章