2013-10-23 25 views
2

我是春天的新框架。我想強制創建一個特定的對象時,它的數據成員必須被初始化。所以最好的方法是用構造函數初始化它。懶惰的init如何在春季工作?

@Service 
class GenerationServiceFactory{ 

@Autowired 
private MyModel model; 

public GenerationServiceFactory(MyModel obj){ 
model = obj; 
} 

} 

但實際的模型對象是在運行時創建的。那麼如何在Spring創建所有bean時傳遞該對象。我知道它與懶惰的init有關。但我不知道它是如何工作的。請幫助我..謝謝:)

回答

3

當使用惰性初始化時,Spring將根據需要創建對象。因此,如果A類依賴於B類,那麼類B將不會被實例化,直到請求A類爲止。 Spring將根據需要導航依賴關係樹並實例化

2

如果lazy-init bean是從singleton bean引用的,則它被創建爲單例bean依賴關係圖的一部分。你可能工作這周圍像這樣的動態代理:

<bean id="first" class="package.TestBean1"> 
    <property name="field" ref="second"/> 
</bean> 

<bean id="second" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="targetSource"> 
      <bean class="org.springframework.aop.target.LazyInitTargetSource"> 
       <property name="targetBeanName" value="rawSecond"/> 
      </bean> 
    </property> 
    </bean> 

    <bean id="rawSecond" class="package.TestBean2" lazy-init="true"> 

這種配置將延遲rawSecond實例,直到第一個方法調用。

+0

在您的例子,這將是初始化豆的順序? – Amit

+0

上下文加載TestBean1將被實例化。接下來,代理bean將會去,因爲TestBean1需要依賴注入。在TestBean1調用任何代理bean方法之前,TestBean2將不會被實例化。它甚至可能發生,如果TestBean1沒有調用TestBean2,TestBean2將不會被實例化。 – Jk1

+0

哦,太好了......謝謝...春天真是太棒了:)愛上它:) – Amit

0

通常在Spring框架中,當spring容器加載XML配置文件 時,所有的bean將立即啓動。假設在應用程序中出現了一種情況,即一旦將XML加載到容器中或者希望它在運行時加載它,就不希望某些bean初始化,在這種情況下,您可以將屬性lazy-init = 「真」。

您可以在這裏獲得樣品example