2013-02-26 42 views
47

我是初學者,春天,ESP控制倒置。我很困惑理解以下lazy-init的彈簧默認行爲

<bean id="demo" class="Demo" lazy-init="false"/> 
<bean id="demo" class="Demo" lazy-init="true"/> 
<bean id="demo" class="Demo" lazy-init="default"/> 

我的理解之間的區別:懶的init =假創建的啓動和lazy-init來的豆=真在啓動不創建一個bean而創建bean根據要求提供特定的bean。 在這裏糾正我,如果我的解釋是錯誤的。

lazy-init的默認行爲究竟是什麼?它如何實例化?

回答

51

的默認行爲是錯誤的:

默認情況下,ApplicationContext實現急切地創建和 配置所有的singleton bean作爲初始化過程的一部分。 通常,這種預先實例化是可取的,因爲 配置或周圍環境中的錯誤立即被發現, 而不是幾小時甚至幾天後。如果此行爲不是 ,那麼您可以通過 阻止單例bean的預先實例化,從而將bean定義標記爲延遲初始化。一個惰性初始化的 bean告訴IoC容器創建一個bean實例,當它是 第一次請求時,而不是在啓動時。

I suggest reading up

+0

GWT4Ever:如果默認行爲是false,那麼爲什麼還要指定lazy-init =「false」,儘管他們可以使用lazy-init =「default」 ?爲什麼兩個獨立的值是錯誤的,如果他們的行爲相同,則默認? – srk 2013-02-26 15:36:40

+1

這是由Zagyi回答的,它也都在鏈接中。 – Vjeetje 2013-02-26 15:48:22

+0

已有更新的文檔[此處](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-dependency-resolution) – 2017-08-03 13:42:07

17

lazy-init="default"設置只指的是什麼被包圍元素的default-lazy-init屬性設置。暗含的默認值default-lazy-initfalse

如果沒有在bean上指定lazy-init屬性,它總是被迫切地實例化。

+0

爲了更容易理解,將我的答案稍微改了一步...... – zagyi 2013-02-26 15:52:52

3

懶惰-INIT是bean的屬性。 lazy-init的值可以是true和false。 如果lazy-init爲真,那麼當對bean發出請求時,該bean將被初始化。當spring容器初始化時,這個bean將不會被初始化 和 如果lazy-init爲false那麼這個bean將被初始化爲spring容器初始化。

16

對於那些來到這裏,使用的是Java的配置,你可以使用這樣的註解Bean的設置爲延遲實例:

在配置類:

@Configuration 
// @Lazy - For all Beans to load lazily 
public class AppConf { 

    @Bean 
    @Lazy 
    public Demo demo() { 
     return new Demo(); 
    } 
} 

對於組件掃描和自動佈線:

@Component 
@Lazy 
public class Demo { 
    .... 
    .... 
} 

@Component 
public class B { 

    @Autowired 
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request. 
    private Demo demo; 

    ....... 
} 
1

當我們使用lazy-init =「default」作爲元素中的一個屬性,容器拾取由指定的值default-lazy-init =「true | false」元素的屬性並將其用作lazy-init =「true |假」。

如果元素中不存在default-lazy-init屬性,則元素中的lazy-init =「default」的行爲就像lazy-init-「false」一樣。